diff --git a/interface/eslint.config.js b/interface/eslint.config.js index 9a3d014d9..c6d578b18 100644 --- a/interface/eslint.config.js +++ b/interface/eslint.config.js @@ -21,6 +21,7 @@ export default tseslint.config( { rules: { '@typescript-eslint/no-unsafe-enum-comparison': 'off', + '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-misused-promises': [ 'error', diff --git a/interface/package.json b/interface/package.json index f64af2d00..427b75dfb 100644 --- a/interface/package.json +++ b/interface/package.json @@ -8,42 +8,33 @@ "private": true, "type": "module", "scripts": { + "dev": "vite dev", "build": "vite build", "preview": "vite preview", "build-hosted": "typesafe-i18n --no-watch && vite build --mode hosted", "preview-standalone": "typesafe-i18n --no-watch && vite build && concurrently -c \"auto\" \"npm:mock-rest\" \"vite preview\"", "mock-rest": "bun --watch ../mock-api/rest_server.ts", - "mock-es": "bun --watch ../mock-api/es_server.ts", - "mock-upload": "bun --watch ../mock-api/upload_server.ts", - "standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"npm:mock-rest\" \"npm:mock-es\" \"npm:mock-upload\" \"vite\"", + "standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"npm:mock-rest\" \"vite\"", "typesafe-i18n": "typesafe-i18n --no-watch", "webUI": "node progmem-generator.js", "format": "prettier -l -w '**/*.{ts,tsx,js,css,json,md}'", "lint": "eslint . --fix" }, "dependencies": { - "@alova/adapter-xhr": "^1.0.6", - "@alova/scene-react": "^1.6.2", + "@alova/adapter-xhr": "2.0.4", "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", - "@mui/icons-material": "^5.16.6", - "@mui/material": "^5.16.6", + "@mui/icons-material": "^5.16.7", + "@mui/material": "^5.16.7", "@table-library/react-table-library": "4.1.7", - "@types/lodash-es": "^4.17.12", - "@types/node": "^22.0.2", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@types/react-router-dom": "^5.3.3", - "alova": "^2.21.4", + "alova": "3.0.9", "async-validator": "^4.2.5", - "history": "^5.3.0", "jwt-decode": "^4.0.0", - "lodash-es": "^4.17.21", "mime-types": "^2.1.35", - "react": "latest", - "react-dom": "latest", - "react-dropzone": "^14.2.3", - "react-icons": "^5.2.1", + "preact": "^10.23.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.3.0", "react-router-dom": "^6.26.0", "react-toastify": "^10.0.5", "typesafe-i18n": "^5.26.2", @@ -51,22 +42,27 @@ }, "devDependencies": { "@babel/core": "^7.25.2", - "@eslint/js": "^9.8.0", + "@eslint/js": "^9.9.0", "@preact/compat": "^17.1.2", "@preact/preset-vite": "^2.9.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/babel__core": "^7", + "@types/formidable": "^3", + "@types/node": "^22.3.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/react-router-dom": "^5.3.3", "concurrently": "^8.2.2", - "eslint": "^9.8.0", + "eslint": "^9.9.0", "eslint-config-prettier": "^9.1.0", - "preact": "^10.23.1", + "formidable": "^3.5.1", "prettier": "^3.3.3", "rollup-plugin-visualizer": "^5.12.0", - "terser": "^5.31.3", - "typescript-eslint": "8.0.0", - "vite": "^5.3.5", + "terser": "^5.31.6", + "typescript-eslint": "8.1.0", + "vite": "^5.4.1", "vite-plugin-imagemin": "^0.6.1", - "vite-tsconfig-paths": "^4.3.2" + "vite-tsconfig-paths": "^5.0.1" }, "packageManager": "yarn@4.4.0" } diff --git a/interface/public/css/roboto.css b/interface/public/css/roboto.css index 639165cb6..a0a44f95d 100644 --- a/interface/public/css/roboto.css +++ b/interface/public/css/roboto.css @@ -1,5 +1,6 @@ /* -* Uses font-size 400 (normal) only and Latin (plus extra unicode chars) to keep flash memory to a minimum +* Uses font-weight 400 (normal) only, no bold, and Latin with a few extra unicode chars. +* This is to keep flash memory to a minimum * View fonts on https://fonts.google.com/ * Download woff2 using e.g. https://fonts.googleapis.com/css2?family=Lato or https://fonts.googleapis.com/css2?family=Roboto */ diff --git a/interface/src/App.tsx b/interface/src/App.tsx index b5ac62222..f6c9d49be 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,5 +1,4 @@ import { useEffect, useState } from 'react'; -import type { FC } from 'react'; import { Slide, ToastContainer } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.min.css'; @@ -12,7 +11,7 @@ import { localStorageDetector } from 'typesafe-i18n/detectors'; const detectedLocale = detectLocale(localStorageDetector); -const App: FC = () => { +const App = () => { const [wasLoaded, setWasLoaded] = useState(false); useEffect(() => { diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index e54f8023f..b8122c813 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -1,6 +1,5 @@ import { useContext, useEffect } from 'react'; -import type { FC } from 'react'; -import { Navigate, Route, Routes, useLocation } from 'react-router-dom'; +import { Navigate, Route, Routes } from 'react-router-dom'; import { toast } from 'react-toastify'; import AuthenticatedRouting from 'AuthenticatedRouting'; @@ -14,7 +13,7 @@ interface SecurityRedirectProps { signOut?: boolean; } -const RootRedirect: FC = ({ message, signOut }) => { +const RootRedirect = ({ message, signOut }: SecurityRedirectProps) => { const authenticationContext = useContext(AuthenticationContext); useEffect(() => { signOut && authenticationContext.signOut(false); @@ -23,26 +22,11 @@ const RootRedirect: FC = ({ message, signOut }) => { return ; }; -export const RemoveTrailingSlashes = () => { - const location = useLocation(); - return ( - location.pathname.match('/.*/$') && ( - - ) - ); -}; - -const AppRouting: FC = () => { +const AppRouting = () => { const { LL } = useI18nContext(); return ( - { +const AuthenticatedRouting = () => { const { me } = useContext(AuthenticatedContext); return ( @@ -55,12 +54,12 @@ const AuthenticatedRouting: FC = () => { } /> } /> } /> - } /> + } /> } /> } /> - } /> + } /> } /> } /> diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index f1c6dfc8b..409cb36e2 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -1,14 +1,11 @@ import { useContext, useState } from 'react'; -import type { FC } from 'react'; import { toast } from 'react-toastify'; import ForwardIcon from '@mui/icons-material/Forward'; import { Box, Button, Paper, Typography } from '@mui/material'; -import * as AuthenticationApi from 'api/authentication'; -import { PROJECT_NAME } from 'api/env'; - -import { useRequest } from 'alova'; +import * as AuthenticationApi from 'components/routing/authentication'; +import { useRequest } from 'alova/client'; import type { ValidateFieldsError } from 'async-validator'; import { LanguageSelector, @@ -16,12 +13,13 @@ import { ValidatedTextField } from 'components'; import { AuthenticationContext } from 'contexts/authentication'; +import { PROJECT_NAME } from 'env'; import { useI18nContext } from 'i18n/i18n-react'; import type { SignInRequest } from 'types'; import { onEnterCallback, updateValue } from 'utils'; import { SIGN_IN_REQUEST_VALIDATOR, validate } from 'validators'; -const SignIn: FC = () => { +const SignIn = () => { const authenticationContext = useContext(AuthenticationContext); const { LL } = useI18nContext(); @@ -33,14 +31,12 @@ const SignIn: FC = () => { const [processing, setProcessing] = useState(false); const [fieldErrors, setFieldErrors] = useState(); - const { send: callSignIn, onSuccess } = useRequest( + const { send: callSignIn } = useRequest( (request: SignInRequest) => AuthenticationApi.signIn(request), { immediate: false } - ); - - onSuccess((response) => { + ).onSuccess((response) => { if (response.data) { authenticationContext.signIn(response.data.access_token); } @@ -113,6 +109,10 @@ const SignIn: FC = () => { onChange={updateLoginRequestValue} margin="normal" variant="outlined" + inputProps={{ + autoCapitalize: 'none', + autoCorrect: 'off' + }} /> alovaInstance.Get(`/rest/coreData`); @@ -65,7 +65,7 @@ export const readDeviceEntities = (id: number) => alovaInstance.Get(`/rest/deviceEntities`, { params: { id }, responseType: 'arraybuffer', - transformData(data) { + transform(data) { return (data as DeviceEntity[]).map((de: DeviceEntity) => ({ ...de, o_m: de.m, @@ -88,8 +88,7 @@ export const writeDeviceName = (data: { id: number; name: string }) => // SettingsScheduler export const readSchedule = () => alovaInstance.Get('/rest/schedule', { - name: 'schedule', - transformData(data) { + transform(data) { return (data as Schedule).schedule.map((si: ScheduleItem) => ({ ...si, o_id: si.id, @@ -109,8 +108,7 @@ export const writeSchedule = (data: Schedule) => // Modules export const readModules = () => alovaInstance.Get('/rest/modules', { - name: 'modules', - transformData(data) { + transform(data) { return (data as Modules).modules.map((mi: ModuleItem) => ({ ...mi, o_enabled: mi.enabled, @@ -127,8 +125,7 @@ export const writeModules = (data: { // SettingsEntities export const readCustomEntities = () => alovaInstance.Get('/rest/customEntities', { - name: 'entities', - transformData(data) { + transform(data) { return (data as Entities).entities.map((ei: EntityItem) => ({ ...ei, o_id: ei.id, diff --git a/interface/src/api/endpoints.ts b/interface/src/api/endpoints.ts index e2f351f8f..3afb960c1 100644 --- a/interface/src/api/endpoints.ts +++ b/interface/src/api/endpoints.ts @@ -1,19 +1,19 @@ -import { xhrRequestAdapter } from '@alova/adapter-xhr'; +import { type AlovaXHRResponse, xhrRequestAdapter } from '@alova/adapter-xhr'; import { createAlova } from 'alova'; import ReactHook from 'alova/react'; -import { unpack } from '../api/unpack'; +import { unpack } from './unpack'; export const ACCESS_TOKEN = 'access_token'; export const alovaInstance = createAlova({ statesHook: ReactHook, - timeout: 3000, // 3 seconds but throwing a timeout error - localCache: null, - // localCache: { + timeout: 3000, // 3 seconds before throwing a timeout error + cacheFor: null, // disable cache + // cacheFor: { // GET: { - // mode: 'placeholder', // see https://alova.js.org/learning/response-cache/#cache-replaceholder-mode - // expire: 2000 + // mode: 'memory', + // expire: 60 * 10 * 1000 // 60 seconds in cache // } // }, requestAdapter: xhrRequestAdapter(), @@ -22,10 +22,15 @@ export const alovaInstance = createAlova({ method.config.headers.Authorization = 'Bearer ' + localStorage.getItem(ACCESS_TOKEN); } + // for simualting vrey slow networks + // return new Promise((resolve) => { + // const random = 3000 + Math.random() * 2000; + // setTimeout(resolve, Math.floor(random)); + // }); }, responded: { - onSuccess: async (response) => { + onSuccess: async (response: AlovaXHRResponse) => { // if (response.status === 202) { // throw new Error('Wait'); // wifi scan in progress // } else diff --git a/interface/src/api/network.ts b/interface/src/api/network.ts index ebbec684a..12222129c 100644 --- a/interface/src/api/network.ts +++ b/interface/src/api/network.ts @@ -7,12 +7,9 @@ export const readNetworkStatus = () => export const scanNetworks = () => alovaInstance.Get('/rest/scanNetworks'); export const listNetworks = () => alovaInstance.Get('/rest/listNetworks', { - name: 'listNetworks', timeout: 20000 // timeout 20 seconds }); export const readNetworkSettings = () => - alovaInstance.Get('/rest/networkSettings', { - name: 'networkSettings' - }); + alovaInstance.Get('/rest/networkSettings'); export const updateNetworkSettings = (wifiSettings: NetworkSettingsType) => alovaInstance.Post('/rest/networkSettings', wifiSettings); diff --git a/interface/src/api/ntp.ts b/interface/src/api/ntp.ts index 69e7471b4..443d078b1 100644 --- a/interface/src/api/ntp.ts +++ b/interface/src/api/ntp.ts @@ -4,10 +4,9 @@ import { alovaInstance } from './endpoints'; export const readNTPStatus = () => alovaInstance.Get('/rest/ntpStatus'); + export const readNTPSettings = () => - alovaInstance.Get('/rest/ntpSettings', { - name: 'ntpSettings' - }); + alovaInstance.Get('/rest/ntpSettings', {}); export const updateNTPSettings = (data: NTPSettingsType) => alovaInstance.Post('/rest/ntpSettings', data); diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index 7b5e46c7b..beabe0125 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -1,8 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ - -/* eslint-disable @typescript-eslint/no-unsafe-call */ - -/* eslint-disable @typescript-eslint/no-unsafe-return */ import type { HardwareStatus, LogSettings, SystemStatus } from 'types'; import { alovaInstance, alovaInstanceGH } from './endpoints'; @@ -31,13 +26,13 @@ export const fetchLogES = () => alovaInstance.Get('/es/log'); // Get versions from github export const getStableVersion = () => alovaInstanceGH.Get('latest', { - transformData(response) { + transform(response: { data: { name: string } }) { return response.data.name.substring(1); } }); export const getDevVersion = () => alovaInstanceGH.Get('tags/latest', { - transformData(response) { + transform(response: { data: { name: string } }) { return response.data.name.split(/\s+/).splice(-1)[0].substring(1); } }); diff --git a/interface/src/app/main/CustomEntities.tsx b/interface/src/app/main/CustomEntities.tsx index 77b95fad8..b922d84d8 100644 --- a/interface/src/app/main/CustomEntities.tsx +++ b/interface/src/app/main/CustomEntities.tsx @@ -1,12 +1,10 @@ import { useCallback, useState } from 'react'; -import type { FC } from 'react'; import { useBlocker } from 'react-router-dom'; import { toast } from 'react-toastify'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; -import RefreshIcon from '@mui/icons-material/Refresh'; import WarningIcon from '@mui/icons-material/Warning'; import { Box, Button, Typography } from '@mui/material'; @@ -20,7 +18,7 @@ import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { updateState, useRequest } from 'alova'; +import { updateState, useAutoRequest, useRequest } from 'alova/client'; import { BlockNavigation, ButtonRow, @@ -30,13 +28,13 @@ import { } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import * as EMSESP from './api'; +import { readCustomEntities, writeCustomEntities } from '../../api/app'; import SettingsCustomEntitiesDialog from './CustomEntitiesDialog'; import { DeviceValueTypeNames, DeviceValueUOM_s } from './types'; import type { Entities, EntityItem } from './types'; import { entityItemValidation } from './validators'; -const CustomEntities: FC = () => { +const CustomEntities = () => { const { LL } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); const blocker = useBlocker(numChanges !== 0); @@ -50,13 +48,13 @@ const CustomEntities: FC = () => { data: entities, send: fetchEntities, error - } = useRequest(EMSESP.readCustomEntities, { + } = useAutoRequest(readCustomEntities, { initialData: [], - force: true + pollingTime: 2000 }); const { send: writeEntities } = useRequest( - (data: Entities) => EMSESP.writeCustomEntities(data), + (data: Entities) => writeCustomEntities(data), { immediate: false } ); @@ -182,8 +180,7 @@ const CustomEntities: FC = () => { const onDialogSave = (updatedItem: EntityItem) => { setDialogOpen(false); - - updateState('entities', (data: EntityItem[]) => { + void updateState(readCustomEntities(), (data: EntityItem[]) => { const new_data = creating ? [ ...data.filter((ei) => creating || ei.o_id !== updatedItem.o_id), @@ -327,24 +324,14 @@ const CustomEntities: FC = () => { )} - - - - + diff --git a/interface/src/app/main/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx index 79455de57..f0fe08fe3 100644 --- a/interface/src/app/main/CustomEntitiesDialog.tsx +++ b/interface/src/app/main/CustomEntitiesDialog.tsx @@ -291,7 +291,11 @@ const CustomEntitiesDialog = ({ fullWidth margin="normal" type="number" - inputProps={{ min: '1', max: String(256 - editItem.offset), step: '1' }} + inputProps={{ + min: '1', + max: String(256 - editItem.offset), + step: '1' + }} /> )} diff --git a/interface/src/app/main/Customization.tsx b/interface/src/app/main/Customizations.tsx similarity index 93% rename from interface/src/app/main/Customization.tsx rename to interface/src/app/main/Customizations.tsx index 00e3905ea..5dc5214bc 100644 --- a/interface/src/app/main/Customization.tsx +++ b/interface/src/app/main/Customizations.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect, useState } from 'react'; -import type { FC } from 'react'; import { useBlocker, useLocation } from 'react-router-dom'; import { toast } from 'react-toastify'; @@ -27,7 +26,7 @@ import { Typography } from '@mui/material'; -import * as SystemApi from 'api/system'; +import { restart } from 'api/system'; import { Body, @@ -40,7 +39,7 @@ import { } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; +import { useRequest } from 'alova/client'; import RestartMonitor from 'app/status/RestartMonitor'; import { BlockNavigation, @@ -51,8 +50,14 @@ import { } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import * as EMSESP from './api'; -import SettingsCustomizationDialog from './CustomizationDialog'; +import { + readDeviceEntities, + readDevices, + resetCustomizations, + writeCustomizationEntities, + writeDeviceName +} from '../../api/app'; +import SettingsCustomizationsDialog from './CustomizationsDialog'; import EntityMaskToggle from './EntityMaskToggle'; import OptionIcon from './OptionIcon'; import { DeviceEntityMask } from './types'; @@ -60,7 +65,7 @@ import type { DeviceEntity, DeviceShort } from './types'; export const APIURL = window.location.origin + '/api/'; -const Customization: FC = () => { +const Customizations = () => { const { LL } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); const blocker = useBlocker(numChanges !== 0); @@ -78,7 +83,7 @@ const Customization: FC = () => { useLayoutTitle(LL.CUSTOMIZATIONS()); // fetch devices first - const { data: devices, send: fetchDevices } = useRequest(EMSESP.readDevices); + const { data: devices, send: fetchDevices } = useRequest(readDevices); const [selectedDevice, setSelectedDevice] = useState( Number(useLocation().state) || -1 @@ -87,32 +92,33 @@ const Customization: FC = () => { useState(''); // needed for API URL const [selectedDeviceName, setSelectedDeviceName] = useState(''); - const { send: resetCustomizations } = useRequest(EMSESP.resetCustomizations(), { + const { send: sendResetCustomizations } = useRequest(resetCustomizations(), { immediate: false }); - const { send: writeDeviceName } = useRequest( - (data: { id: number; name: string }) => EMSESP.writeDeviceName(data), + const { send: sendDeviceName } = useRequest( + (data: { id: number; name: string }) => writeDeviceName(data), { immediate: false } ); - const { send: writeCustomizationEntities } = useRequest( - (data: { id: number; entity_ids: string[] }) => - EMSESP.writeCustomizationEntities(data), + const { send: sendCustomizationEntities } = useRequest( + (data: { id: number; entity_ids: string[] }) => writeCustomizationEntities(data), { immediate: false } ); - const { send: readDeviceEntities, onSuccess: onSuccess } = useRequest( - (data: number) => EMSESP.readDeviceEntities(data), + const { send: sendDeviceEntities } = useRequest( + (data: number) => readDeviceEntities(data), { initialData: [], immediate: false } - ); + ).onSuccess((event) => { + setOriginalSettings(event.data); + }); const setOriginalSettings = (data: DeviceEntity[]) => { setDeviceEntities( @@ -126,11 +132,7 @@ const Customization: FC = () => { ); }; - onSuccess((event) => { - setOriginalSettings(event.data); - }); - - const { send: restartCommand } = useRequest(SystemApi.restart(), { + const { send: sendRestart } = useRequest(restart(), { immediate: false }); @@ -231,7 +233,7 @@ const Customization: FC = () => { useEffect(() => { if (devices && selectedDevice !== -1) { - void readDeviceEntities(selectedDevice); + void sendDeviceEntities(selectedDevice); const id = devices.devices.findIndex((d) => d.i === selectedDevice); if (id === -1) { setSelectedDevice(-1); @@ -245,8 +247,8 @@ const Customization: FC = () => { } }, [devices, selectedDevice]); - const restart = async () => { - await restartCommand().catch((error: Error) => { + const doRestart = async () => { + await sendRestart().catch((error: Error) => { toast.error(error.message); }); setRestarting(true); @@ -327,7 +329,7 @@ const Customization: FC = () => { const resetCustomization = async () => { try { - await resetCustomizations(); + await sendResetCustomizations(); toast.info(LL.CUSTOMIZATIONS_RESTART()); } catch (error) { toast.error((error as Error).message); @@ -387,7 +389,7 @@ const Customization: FC = () => { return; } - await writeCustomizationEntities({ + await sendCustomizationEntities({ id: selectedDevice, entity_ids: masked_entities }).catch((error: Error) => { @@ -402,7 +404,7 @@ const Customization: FC = () => { }; const renameDevice = async () => { - await writeDeviceName({ id: selectedDevice, name: selectedDeviceName }) + await sendDeviceName({ id: selectedDevice, name: selectedDeviceName }) .then(() => { toast.success(LL.UPDATED_OF(LL.NAME(1))); }) @@ -676,7 +678,7 @@ const Customization: FC = () => { startIcon={} variant="contained" color="error" - onClick={restart} + onClick={doRestart} > {LL.RESTART()} @@ -691,7 +693,7 @@ const Customization: FC = () => { startIcon={} variant="outlined" color="secondary" - onClick={() => devices && readDeviceEntities(selectedDevice)} + onClick={() => devices && sendDeviceEntities(selectedDevice)} > {LL.CANCEL()} @@ -727,7 +729,7 @@ const Customization: FC = () => { {blocker ? : null} {restarting ? : renderContent()} {selectedDeviceEntity && ( - { ); }; -export default Customization; +export default Customizations; diff --git a/interface/src/app/main/CustomizationDialog.tsx b/interface/src/app/main/CustomizationsDialog.tsx similarity index 96% rename from interface/src/app/main/CustomizationDialog.tsx rename to interface/src/app/main/CustomizationsDialog.tsx index cb03bcbae..b29130dba 100644 --- a/interface/src/app/main/CustomizationDialog.tsx +++ b/interface/src/app/main/CustomizationsDialog.tsx @@ -23,19 +23,19 @@ import EntityMaskToggle from './EntityMaskToggle'; import { DeviceEntityMask } from './types'; import type { DeviceEntity } from './types'; -interface SettingsCustomizationDialogProps { +interface SettingsCustomizationsDialogProps { open: boolean; onClose: () => void; onSave: (di: DeviceEntity) => void; selectedItem: DeviceEntity; } -const CustomizationDialog = ({ +const CustomizationsDialog = ({ open, onClose, onSave, selectedItem -}: SettingsCustomizationDialogProps) => { +}: SettingsCustomizationsDialogProps) => { const { LL } = useI18nContext(); const [editItem, setEditItem] = useState(selectedItem); const [error, setError] = useState(false); @@ -175,4 +175,4 @@ const CustomizationDialog = ({ ); }; -export default CustomizationDialog; +export default CustomizationsDialog; diff --git a/interface/src/app/main/DeviceIcon.tsx b/interface/src/app/main/DeviceIcon.tsx index 968d5ec6f..a9429b67c 100644 --- a/interface/src/app/main/DeviceIcon.tsx +++ b/interface/src/app/main/DeviceIcon.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import { AiOutlineAlert, AiOutlineControl, AiOutlineGateway } from 'react-icons/ai'; import { CgSmartHomeBoiler } from 'react-icons/cg'; import { FaSolarPanel } from 'react-icons/fa'; @@ -16,12 +15,8 @@ import PlaylistAddIcon from '@mui/icons-material/PlaylistAdd'; import { DeviceType } from './types'; -interface DeviceIconProps { - type_id: number; -} - -const DeviceIcon: FC = ({ type_id }) => { - switch (type_id as DeviceType) { +const DeviceIcon = ({ type_id }: { type_id: DeviceType }) => { + switch (type_id) { case DeviceType.TEMPERATURESENSOR: case DeviceType.ANALOGSENSOR: return ; diff --git a/interface/src/app/main/Devices.tsx b/interface/src/app/main/Devices.tsx index a744e35b8..f8cf452cb 100644 --- a/interface/src/app/main/Devices.tsx +++ b/interface/src/app/main/Devices.tsx @@ -5,7 +5,6 @@ import { useLayoutEffect, useState } from 'react'; -import type { FC } from 'react'; import { IconContext } from 'react-icons'; import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; @@ -20,13 +19,13 @@ import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import KeyboardArrowDownOutlinedIcon from '@mui/icons-material/KeyboardArrowDownOutlined'; import KeyboardArrowUpOutlinedIcon from '@mui/icons-material/KeyboardArrowUpOutlined'; import PlayArrowIcon from '@mui/icons-material/PlayArrow'; -import RefreshIcon from '@mui/icons-material/Refresh'; import StarIcon from '@mui/icons-material/Star'; import StarBorderOutlinedIcon from '@mui/icons-material/StarBorderOutlined'; import UnfoldMoreOutlinedIcon from '@mui/icons-material/UnfoldMoreOutlined'; import { Box, Button, + CircularProgress, Dialog, DialogActions, DialogContent, @@ -57,12 +56,12 @@ import { import { useTheme } from '@table-library/react-table-library/theme'; import type { Action, State } from '@table-library/react-table-library/types/common'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; -import { ButtonRow, MessageBox, SectionContent, useLayoutTitle } from 'components'; +import { useRequest } from 'alova/client'; +import { MessageBox, SectionContent, useLayoutTitle } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -import * as EMSESP from './api'; +import { readCoreData, readDeviceData, writeDeviceValue } from '../../api/app'; import DeviceIcon from './DeviceIcon'; import DashboardDevicesDialog from './DevicesDialog'; import { formatValue } from './deviceValue'; @@ -70,7 +69,7 @@ import { DeviceEntityMask, DeviceType, DeviceValueUOM_s } from './types'; import type { Device, DeviceValue } from './types'; import { deviceValueItemValidation } from './validators'; -const Devices: FC = () => { +const Devices = () => { const { LL } = useI18nContext(); const { me } = useContext(AuthenticatedContext); @@ -85,18 +84,15 @@ const Devices: FC = () => { useLayoutTitle(LL.DEVICES()); - const { data: coreData, send: readCoreData } = useRequest( - () => EMSESP.readCoreData(), - { - initialData: { - connected: true, - devices: [] - } + const { data: coreData, send: sendCoreData } = useRequest(() => readCoreData(), { + initialData: { + connected: true, + devices: [] } - ); + }); - const { data: deviceData, send: readDeviceData } = useRequest( - (id: number) => EMSESP.readDeviceData(id), + const { data: deviceData, send: sendDeviceData } = useRequest( + (id: number) => readDeviceData(id), { initialData: { data: [] @@ -105,8 +101,8 @@ const Devices: FC = () => { } ); - const { loading: submitting, send: writeDeviceValue } = useRequest( - (data: { id: number; c: string; v: unknown }) => EMSESP.writeDeviceValue(data), + const { loading: submitting, send: sendDeviceValue } = useRequest( + (data: { id: number; c: string; v: unknown }) => writeDeviceValue(data), { immediate: false } @@ -288,7 +284,7 @@ const Devices: FC = () => { async function onSelectChange(action: Action, state: State) { setSelectedDevice(state.id as number); if (action.type === 'ADD_BY_ID_EXCLUSIVELY') { - await readDeviceData(state.id as number); + await sendDeviceData(state.id as number); } } @@ -321,12 +317,6 @@ const Devices: FC = () => { }; }, [escFunction]); - const refreshData = () => { - if (!deviceValueDialogOpen) { - selectedDevice ? void readDeviceData(selectedDevice) : void readCoreData(); - } - }; - const customize = () => { if (selectedDevice == 99) { navigate('/customentities'); @@ -437,7 +427,12 @@ const Devices: FC = () => { }; useEffect(() => { - const timer = setInterval(() => refreshData(), 60000); + const timer = setInterval(() => { + if (deviceValueDialogOpen) { + return; + } + selectedDevice ? void sendDeviceData(selectedDevice) : void sendCoreData(); + }, 2000); return () => { clearInterval(timer); }; @@ -445,7 +440,7 @@ const Devices: FC = () => { const deviceValueDialogSave = async (devicevalue: DeviceValue) => { const id = Number(device_select.state.id); - await writeDeviceValue({ id, c: devicevalue.c ?? '', v: devicevalue.v }) + await sendDeviceValue({ id, c: devicevalue.c ?? '', v: devicevalue.v }) .then(() => { toast.success(LL.WRITE_CMD_SENT()); }) @@ -454,7 +449,7 @@ const Devices: FC = () => { }) .finally(async () => { setDeviceValueDialogOpen(false); - await readDeviceData(id); + await sendDeviceData(id); setSelectedDeviceValue(undefined); }); }; @@ -568,6 +563,9 @@ const Devices: FC = () => { + {tableList.length === 0 && ( + + )} {tableList.map((device: Device) => ( @@ -592,6 +590,7 @@ const Devices: FC = () => { const deviceValueDialogClose = () => { setDeviceValueDialogOpen(false); + void sendDeviceData(selectedDevice); }; const renderDeviceData = () => { @@ -685,11 +684,6 @@ const Devices: FC = () => { )} - - - - - @@ -784,16 +778,6 @@ const Devices: FC = () => { progress={submitting} /> )} - - - ); }; diff --git a/interface/src/app/main/Help.tsx b/interface/src/app/main/Help.tsx index 5c27f796c..9bee05284 100644 --- a/interface/src/app/main/Help.tsx +++ b/interface/src/app/main/Help.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import { toast } from 'react-toastify'; import CommentIcon from '@mui/icons-material/CommentTwoTone'; @@ -18,25 +17,20 @@ import { Typography } from '@mui/material'; -import * as EMSESP from 'app/main/api'; -import { useRequest } from 'alova'; +import { useRequest } from 'alova/client'; import { SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; +import { API } from '../../api/app'; import type { APIcall } from './types'; -const Help: FC = () => { +const Help = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.HELP_OF('')); - const { send: getAPI, onSuccess: onGetAPI } = useRequest( - (data: APIcall) => EMSESP.API(data), - { - immediate: false - } - ); - - onGetAPI((event) => { + const { send: getAPI } = useRequest((data: APIcall) => API(data), { + immediate: false + }).onSuccess((event) => { const anchor = document.createElement('a'); anchor.href = URL.createObjectURL( new Blob([JSON.stringify(event.data, null, 2)], { @@ -45,7 +39,7 @@ const Help: FC = () => { ); anchor.download = - 'emsesp_' + event.sendArgs[0].device + '_' + event.sendArgs[0].entity + '.txt'; + 'emsesp_' + event.args[0].device + '_' + event.args[0].entity + '.txt'; anchor.click(); URL.revokeObjectURL(anchor.href); toast.info(LL.DOWNLOAD_SUCCESSFUL()); @@ -58,87 +52,89 @@ const Help: FC = () => { }; return ( - - - - - - - - - - - - + <> + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - + + + + + + + + + + + + + + {LL.HELP_INFORMATION_4()} + + + - - - {LL.HELP_INFORMATION_4()} - - - - - - - {LL.HELP_INFORMATION_5()} - - - - {'github.com/emsesp/EMS-ESP32'} - - - - @proddy @MichaelDvP - - - + + + {LL.HELP_INFORMATION_5()} + + + + {'github.com/emsesp/EMS-ESP32'} + + + + @proddy @MichaelDvP + + + + ); }; diff --git a/interface/src/app/main/Modules.tsx b/interface/src/app/main/Modules.tsx index a715e2c3c..cb366715f 100644 --- a/interface/src/app/main/Modules.tsx +++ b/interface/src/app/main/Modules.tsx @@ -1,5 +1,4 @@ import { useCallback, useState } from 'react'; -import type { FC } from 'react'; import { useBlocker } from 'react-router-dom'; import { toast } from 'react-toastify'; @@ -18,7 +17,7 @@ import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { updateState, useRequest } from 'alova'; +import { updateState, useRequest } from 'alova/client'; import { BlockNavigation, ButtonRow, @@ -28,11 +27,11 @@ import { } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import * as EMSESP from './api'; +import { readModules, writeModules } from '../../api/app'; import ModulesDialog from './ModulesDialog'; import type { ModuleItem, Modules } from './types'; -const Modules: FC = () => { +const Modules = () => { const { LL } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); const blocker = useBlocker(numChanges !== 0); @@ -44,13 +43,12 @@ const Modules: FC = () => { data: modules, send: fetchModules, error - } = useRequest(EMSESP.readModules, { + } = useRequest(readModules, { initialData: [] }); - const { send: writeModules } = useRequest( - (data: { key: string; enabled: boolean; license: string }) => - EMSESP.writeModules(data), + const { send: updateModules } = useRequest( + (data: { key: string; enabled: boolean; license: string }) => writeModules(data), { immediate: false } @@ -123,7 +121,7 @@ const Modules: FC = () => { } const updateModuleItem = (updatedItem: ModuleItem) => { - updateState('modules', (data: ModuleItem[]) => { + void updateState(readModules(), (data: ModuleItem[]) => { const new_data = data.map((mi) => mi.id === updatedItem.id ? { ...mi, ...updatedItem } : mi ); @@ -133,7 +131,7 @@ const Modules: FC = () => { }; const saveModules = async () => { - await writeModules({ + await updateModules({ modules: modules.map((condensed_mi) => ({ key: condensed_mi.key, enabled: condensed_mi.enabled, diff --git a/interface/src/app/main/OptionIcon.tsx b/interface/src/app/main/OptionIcon.tsx index c1d7b241d..5cf08d542 100644 --- a/interface/src/app/main/OptionIcon.tsx +++ b/interface/src/app/main/OptionIcon.tsx @@ -1,5 +1,3 @@ -import type { FC } from 'react'; - import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; @@ -32,12 +30,7 @@ const OPTION_ICONS: { favorite: [StarIcon, StarOutlineIcon] }; -interface OptionIconProps { - type: OptionType; - isSet: boolean; -} - -const OptionIcon: FC = ({ type, isSet }) => { +const OptionIcon = ({ type, isSet }: { type: OptionType; isSet: boolean }) => { const Icon = OPTION_ICONS[type][isSet ? 0 : 1]; return isSet ? ( diff --git a/interface/src/app/main/Scheduler.tsx b/interface/src/app/main/Scheduler.tsx index 0c3327aea..b2a526560 100644 --- a/interface/src/app/main/Scheduler.tsx +++ b/interface/src/app/main/Scheduler.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect, useState } from 'react'; -import type { FC } from 'react'; import { useBlocker } from 'react-router-dom'; import { toast } from 'react-toastify'; @@ -19,7 +18,7 @@ import { Table } from '@table-library/react-table-library/table'; import { useTheme } from '@table-library/react-table-library/theme'; -import { updateState, useRequest } from 'alova'; +import { updateState, useRequest } from 'alova/client'; import { BlockNavigation, ButtonRow, @@ -29,13 +28,13 @@ import { } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import * as EMSESP from './api'; +import { readSchedule, writeSchedule } from '../../api/app'; import SettingsSchedulerDialog from './SchedulerDialog'; import { ScheduleFlag } from './types'; import type { Schedule, ScheduleItem } from './types'; import { schedulerItemValidation } from './validators'; -const Scheduler: FC = () => { +const Scheduler = () => { const { LL, locale } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); const blocker = useBlocker(numChanges !== 0); @@ -48,13 +47,12 @@ const Scheduler: FC = () => { data: schedule, send: fetchSchedule, error - } = useRequest(EMSESP.readSchedule, { - initialData: [], - force: true + } = useRequest(readSchedule, { + initialData: [] }); - const { send: writeSchedule } = useRequest( - (data: Schedule) => EMSESP.writeSchedule(data), + const { send: updateSchedule } = useRequest( + (data: Schedule) => writeSchedule(data), { immediate: false } @@ -131,7 +129,7 @@ const Scheduler: FC = () => { }); const saveSchedule = async () => { - await writeSchedule({ + await updateSchedule({ schedule: schedule .filter((si) => !si.deleted) .map((condensed_si) => ({ @@ -177,8 +175,7 @@ const Scheduler: FC = () => { const onDialogSave = (updatedItem: ScheduleItem) => { setDialogOpen(false); - - updateState('schedule', (data: ScheduleItem[]) => { + void updateState(readSchedule(), (data: ScheduleItem[]) => { const new_data = creating ? [ ...data.filter((si) => creating || si.o_id !== updatedItem.o_id), diff --git a/interface/src/app/main/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx index cb25db44c..7769bac00 100644 --- a/interface/src/app/main/SchedulerDialog.tsx +++ b/interface/src/app/main/SchedulerDialog.tsx @@ -208,7 +208,7 @@ const SchedulerDialog = ({ scheduleType === ScheduleFlag.SCHEDULE_ONCHANGE ? 'primary' : 'grey' } > - {LL.ONCHANGE(0)} + {LL.ONCHANGE()} @@ -218,7 +218,7 @@ const SchedulerDialog = ({ scheduleType === ScheduleFlag.SCHEDULE_CONDITION ? 'primary' : 'grey' } > - {LL.CONDITION(0)} + {LL.CONDITION()} @@ -228,7 +228,7 @@ const SchedulerDialog = ({ scheduleType === ScheduleFlag.SCHEDULE_IMMEDIATE ? 'primary' : 'grey' } > - {LL.IMMEDIATE(0)} + {LL.IMMEDIATE()} @@ -282,7 +282,7 @@ const SchedulerDialog = ({ {scheduleType === ScheduleFlag.SCHEDULE_DAY || - scheduleType === ScheduleFlag.SCHEDULE_TIMER ? ( + scheduleType === ScheduleFlag.SCHEDULE_TIMER ? ( <> { +const Sensors = () => { const { LL } = useI18nContext(); const { me } = useContext(AuthenticatedContext); @@ -57,27 +59,25 @@ const Sensors: FC = () => { const [analogDialogOpen, setAnalogDialogOpen] = useState(false); const [creating, setCreating] = useState(false); - const { data: sensorData, send: fetchSensorData } = useRequest( - () => EMSESP.readSensorData(), - { - initialData: { - ts: [], - as: [], - analog_enabled: false, - platform: 'ESP32' - } - } - ); + const { data: sensorData } = useAutoRequest(() => readSensorData(), { + initialData: { + ts: [], + as: [], + analog_enabled: false, + platform: 'ESP32' + }, + pollingTime: 2000 + }); - const { send: writeTemperatureSensor } = useRequest( - (data: WriteTemperatureSensor) => EMSESP.writeTemperatureSensor(data), + const { send: sendTemperatureSensor } = useRequest( + (data: WriteTemperatureSensor) => writeTemperatureSensor(data), { immediate: false } ); - const { send: writeAnalogSensor } = useRequest( - (data: WriteAnalogSensor) => EMSESP.writeAnalogSensor(data), + const { send: sendAnalogSensor } = useRequest( + (data: WriteAnalogSensor) => writeAnalogSensor(data), { immediate: false } @@ -195,13 +195,6 @@ const Sensors: FC = () => { } ); - useEffect(() => { - const timer = setInterval(() => fetchSensorData(), 30000); - return () => { - clearInterval(timer); - }; - }); - useLayoutTitle(LL.SENSORS()); const formatDurationMin = (duration_min: number) => { @@ -266,17 +259,16 @@ const Sensors: FC = () => { }; const onTemperatureDialogSave = async (ts: TemperatureSensor) => { - await writeTemperatureSensor({ id: ts.id, name: ts.n, offset: ts.o }) + await sendTemperatureSensor({ id: ts.id, name: ts.n, offset: ts.o }) .then(() => { toast.success(LL.UPDATED_OF(LL.SENSOR(1))); }) .catch(() => { toast.error(LL.UPDATE_OF(LL.SENSOR(2)) + ' ' + LL.FAILED(1)); }) - .finally(async () => { + .finally(() => { setTemperatureDialogOpen(false); setSelectedTemperatureSensor(undefined); - await fetchSensorData(); }); }; @@ -311,7 +303,7 @@ const Sensors: FC = () => { }; const onAnalogDialogSave = async (as: AnalogSensor) => { - await writeAnalogSensor({ + await sendAnalogSensor({ id: as.id, gpio: as.g, name: as.n, @@ -327,10 +319,9 @@ const Sensors: FC = () => { .catch(() => { toast.error(LL.UPDATE_OF(LL.ANALOG_SENSOR(5)) + ' ' + LL.FAILED(1)); }) - .finally(async () => { + .finally(() => { setAnalogDialogOpen(false); setSelectedAnalogSensor(undefined); - await fetchSensorData(); }); }; @@ -474,53 +465,37 @@ const Sensors: FC = () => { )} /> )} - {sensorData?.analog_enabled === true && ( - <> - - {LL.ANALOG_SENSORS()} - - - {selectedAnalogSensor && ( - + + {LL.ANALOG_SENSORS()} + + + {selectedAnalogSensor && ( + + /> )} - - - - - - {sensorData?.analog_enabled === true && me.admin && ( - - )} + {sensorData?.analog_enabled === true && me.admin && ( + + - + )} ); }; diff --git a/interface/src/app/settings/APSettings.tsx b/interface/src/app/settings/APSettings.tsx index d2a9accb4..4e7a5087a 100644 --- a/interface/src/app/settings/APSettings.tsx +++ b/interface/src/app/settings/APSettings.tsx @@ -1,5 +1,4 @@ import { useState } from 'react'; -import type { FC } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; @@ -19,7 +18,6 @@ import { useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import { range } from 'lodash-es'; import type { APSettingsType } from 'types'; import { APProvisionMode } from 'types'; import { numberValue, updateValueDirty, useRest } from 'utils'; @@ -29,7 +27,7 @@ export const isAPEnabled = ({ provision_mode }: APSettingsType) => provision_mode === APProvisionMode.AP_MODE_ALWAYS || provision_mode === APProvisionMode.AP_MODE_DISCONNECTED; -const APSettings: FC = () => { +const APSettings = () => { const { loadData, saving, @@ -74,6 +72,11 @@ const APSettings: FC = () => { } }; + // no lodash - https://asleepace.com/blog/typescript-range-without-a-loop/ + function range(a: number, b: number): number[] { + return a < b ? [a, ...range(a + 1, b)] : [b]; + } + return ( <> { - const { data: hardwareData } = useRequest(SystemApi.readHardwareStatus, { - force: true - }); +const ApplicationSettings = () => { + const { data: hardwareData } = useRequest(readHardwareStatus); const { loadData, saveData, - saving, updateDataValue, data, origData, @@ -67,8 +63,8 @@ const ApplicationSettings: FC = () => { errorMessage, restartNeeded } = useRest({ - read: EMSESP.readSettings, - update: EMSESP.writeSettings + read: readSettings, + update: writeSettings }); const [restarting, setRestarting] = useState(); @@ -84,19 +80,12 @@ const ApplicationSettings: FC = () => { const [fieldErrors, setFieldErrors] = useState(); - const { - loading: processingBoard, - send: readBoardProfile, - onSuccess: onSuccessBoardProfile - } = useRequest((boardProfile: string) => EMSESP.getBoardProfile(boardProfile), { - immediate: false - }); - - const { send: restartCommand } = useRequest(SystemApi.restart(), { - immediate: false - }); - - onSuccessBoardProfile((event) => { + const { loading: processingBoard, send: readBoardProfile } = useRequest( + (boardProfile: string) => getBoardProfile(boardProfile), + { + immediate: false + } + ).onSuccess((event) => { const response = event.data as Settings; updateDataValue({ ...data, @@ -113,6 +102,10 @@ const ApplicationSettings: FC = () => { }); }); + const { send: restartCommand } = useRequest(restart(), { + immediate: false + }); + const updateBoardProfile = async (board_profile: string) => { await readBoardProfile(board_profile).catch((error: Error) => { toast.error(error.message); @@ -122,7 +115,7 @@ const ApplicationSettings: FC = () => { useLayoutTitle(LL.SETTINGS_OF(LL.APPLICATION())); const content = () => { - if (!data) { + if (!data || !hardwareData) { return ; } @@ -161,16 +154,321 @@ const ApplicationSettings: FC = () => { return ( <> - {LL.INTERFACE_BOARD_PROFILE()} + {LL.SERVICES()} + + API + + } + label={LL.BYPASS_TOKEN()} + /> + Console + + } + label={LL.ENABLE_TELNET()} + /> + Modbus + + } + label={LL.ENABLE_MODBUS()} + /> + {data.modbus_enabled && ( + + + + + + + + + ms + }} + fullWidth + variant="outlined" + value={numberValue(data.modbus_timeout)} + type="number" + onChange={updateFormValue} + margin="normal" + /> + + + )} + Syslog + + } + label={LL.ENABLE_SYSLOG()} + /> + {data.syslog_enabled && ( + + + + + + + + + + OFF + ERR + NOTICE + INFO + DEBUG + ALL + + + + {LL.SECONDS()} + ) + }} + fullWidth + variant="outlined" + value={numberValue(data.syslog_mark_interval)} + type="number" + onChange={updateFormValue} + margin="normal" + /> + + + )} + + {LL.SENSORS()} + + Analog + + } + label={LL.ENABLE_ANALOG()} + /> + {data.dallas_gpio !== 0 && ( + <> + {LL.TEMPERATURE()} + + } + label={LL.ENABLE_PARASITE()} + /> + + )} + + + {LL.FORMATTING_OPTIONS()} + + + + Deutsch (DE) + English (EN) + Français (FR) + Italiano (IT) + Nederlands (NL) + Norsk (NO) + Polski (PL) + Slovenčina (SK) + Svenska (SV) + Türk (TR) + + + + + + {LL.ONOFF()} + {LL.ONOFF_CAP()} + true/false + 1/0 + + + + + {LL.ONOFF()} + {LL.ONOFF_CAP()} + "true"/"false" + true/false + "1"/"0" + 1/0 + + + + + {LL.VALUE(5)} + {LL.INDEX()} + + + + + } + label={LL.CONVERT_FAHRENHEIT()} + /> + + } + label={LL.LOG_HEX()} + /> + + + {LL.SETTINGS_OF(LL.HARDWARE())} - - {LL.BOARD_PROFILE_TEXT()} - { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> @@ -218,7 +515,6 @@ const ApplicationSettings: FC = () => { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> @@ -232,7 +528,6 @@ const ApplicationSettings: FC = () => { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> @@ -248,7 +543,6 @@ const ApplicationSettings: FC = () => { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> @@ -262,14 +556,12 @@ const ApplicationSettings: FC = () => { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> @@ -315,14 +606,12 @@ const ApplicationSettings: FC = () => { type="number" onChange={updateFormValue} margin="normal" - disabled={saving} /> { )} )} - - {LL.SETTINGS_OF(LL.EMS_BUS(0))} - { { { - - {LL.GENERAL_OPTIONS()} - - - - Deutsch (DE) - English (EN) - Français (FR) - Italiano (IT) - Nederlands (NL) - Norsk (NO) - Polski (PL) - Slovenčina (SK) - Svenska (SV) - Türk (TR) - - + + } + label={LL.READONLY()} + /> {data.led_gpio !== 0 && ( { /> } label={LL.HIDE_LED()} - disabled={saving} /> )} - - } - label={LL.ENABLE_TELNET()} - disabled={saving} - /> - - } - label={LL.ENABLE_ANALOG()} - disabled={saving} - /> - - } - label={LL.CONVERT_FAHRENHEIT()} - disabled={saving} - /> - - } - label={LL.BYPASS_TOKEN()} - disabled={saving} - /> - - } - label={LL.READONLY()} - disabled={saving} - /> { /> } label={LL.UNDERCLOCK_CPU()} - disabled={saving} /> + + + {LL.GENERAL_OPTIONS()} + { /> } label={LL.HEATINGOFF()} - disabled={saving} /> - - - - } - label={LL.REMOTE_TIMEOUT_EN()} + + - - {data.remote_timeout_en && ( - - {LL.HOURS()} - ) - }} - fullWidth - variant="outlined" - value={numberValue(data.remote_timeout)} - type="number" - onChange={updateFormValue} - /> - - )} - + } + label={LL.REMOTE_TIMEOUT_EN()} + /> + {data.remote_timeout_en && ( + + {LL.HOURS()} + ) + }} + variant="outlined" + value={numberValue(data.remote_timeout)} + type="number" + onChange={updateFormValue} + /> + + )} { /> } label={LL.ENABLE_SHOWER_TIMER()} - disabled={saving} /> { )} - - {LL.FORMATTING_OPTIONS()} - - - - - {LL.ONOFF()} - {LL.ONOFF_CAP()} - true/false - 1/0 - - - - - {LL.ONOFF()} - {LL.ONOFF_CAP()} - "true"/"false" - true/false - "1"/"0" - 1/0 - - - - - {LL.VALUE(5)} - {LL.INDEX()} - - - - {data.dallas_gpio !== 0 && ( - <> - - {LL.TEMP_SENSORS()} - - - } - label={LL.ENABLE_PARASITE()} - disabled={saving} - /> - - )} - - {LL.LOGGING()} - - - } - label={LL.LOG_HEX()} - disabled={saving} - /> - - } - label={LL.ENABLE_SYSLOG()} - /> - {data.syslog_enabled && ( - - - - - - - - - - OFF - ERR - NOTICE - INFO - DEBUG - ALL - - - - {LL.SECONDS()} - ) - }} - fullWidth - variant="outlined" - value={numberValue(data.syslog_mark_interval)} - type="number" - onChange={updateFormValue} - margin="normal" - disabled={saving} - /> - - - )} - - Modbus - - - } - label={LL.ENABLE_MODBUS()} - /> - {data.modbus_enabled && ( - - - - - - - - - ms - }} - fullWidth - variant="outlined" - value={numberValue(data.modbus_timeout)} - type="number" - onChange={updateFormValue} - margin="normal" - disabled={saving} - /> - - - )} + {restartNeeded && ( + + + + + + {LL.DOWNLOAD_SETTINGS_TEXT()} + + + + + + + {LL.DOWNLOAD_CUSTOMIZATION_TEXT()} + + + + + + {LL.DOWNLOAD_SCHEDULE_TEXT()} + + + + + + + + {LL.EMS_ESP_VER()} + + + + {LL.VERSION_ON() + ' '} + {data.emsesp_version} ({getPlatform()}) + + {latestVersion && ( + + {LL.THE_LATEST()} {LL.OFFICIAL()} {LL.RELEASE_IS()} +  {latestVersion} +  ( + + {LL.RELEASE_NOTES()} + + ) ( + + {LL.DOWNLOAD(1)} + + ) + + )} + {latestDevVersion && ( + + {LL.THE_LATEST()} {LL.DEVELOPMENT()} {LL.RELEASE_IS()} +   + {latestDevVersion} +  ( + + {LL.RELEASE_NOTES()} + + ) ( + + {LL.DOWNLOAD(1)} + + ) + + )} + + + + + ); + }; + + return {content()}; +}; + +export default DownloadUpload; diff --git a/interface/src/app/settings/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx index 6ccf77680..715bb1d2c 100644 --- a/interface/src/app/settings/MqttSettings.tsx +++ b/interface/src/app/settings/MqttSettings.tsx @@ -1,5 +1,4 @@ import { useState } from 'react'; -import type { FC } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; @@ -31,7 +30,7 @@ import type { MqttSettingsType } from 'types'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { createMqttSettingsValidator, validate } from 'validators'; -const MqttSettings: FC = () => { +const MqttSettings = () => { const { loadData, saving, diff --git a/interface/src/app/settings/NTPSettings.tsx b/interface/src/app/settings/NTPSettings.tsx index ae8ef094a..9843ccc0d 100644 --- a/interface/src/app/settings/NTPSettings.tsx +++ b/interface/src/app/settings/NTPSettings.tsx @@ -1,13 +1,13 @@ import { useState } from 'react'; -import type { FC } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; import { Button, Checkbox, MenuItem } from '@mui/material'; import * as NTPApi from 'api/ntp'; +import { readNTPSettings } from 'api/ntp'; -import { updateState } from 'alova'; +import { updateState } from 'alova/client'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, @@ -26,7 +26,7 @@ import { NTP_SETTINGS_VALIDATOR } from 'validators/ntp'; import { TIME_ZONES, selectedTimeZone, timeZoneSelectItems } from './TZ'; -const NTPSettings: FC = () => { +const NTPSettings = () => { const { loadData, saving, @@ -72,8 +72,7 @@ const NTPSettings: FC = () => { const changeTimeZone = (event: React.ChangeEvent) => { updateFormValue(event); - - updateState('ntpSettings', (settings: NTPSettingsType) => ({ + void updateState(readNTPSettings(), (settings: NTPSettingsType) => ({ ...settings, tz_label: event.target.value, tz_format: TIME_ZONES[event.target.value] diff --git a/interface/src/app/settings/Settings.tsx b/interface/src/app/settings/Settings.tsx index 136753015..fdebb3dc9 100644 --- a/interface/src/app/settings/Settings.tsx +++ b/interface/src/app/settings/Settings.tsx @@ -1,4 +1,4 @@ -import { type FC, useState } from 'react'; +import { useState } from 'react'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -24,12 +24,12 @@ import { import * as SystemApi from 'api/system'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; +import { useRequest } from 'alova/client'; import { SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; import { useI18nContext } from 'i18n/i18n-react'; -const Settings: FC = () => { +const Settings = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.SETTINGS(0)); @@ -136,8 +136,8 @@ const Settings: FC = () => { diff --git a/interface/src/app/settings/UploadDownload.tsx b/interface/src/app/settings/UploadDownload.tsx deleted file mode 100644 index c041631db..000000000 --- a/interface/src/app/settings/UploadDownload.tsx +++ /dev/null @@ -1,367 +0,0 @@ -import { type FC, useState } from 'react'; -import { toast } from 'react-toastify'; - -import DownloadIcon from '@mui/icons-material/GetApp'; -import { Box, Button, Divider, Link, Typography } from '@mui/material'; - -import * as SystemApi from 'api/system'; - -import * as EMSESP from 'app/main/api'; -import { useRequest } from 'alova'; -import type { APIcall } from 'app/main/types'; -import { - FormLoader, - SectionContent, - SingleUpload, - useLayoutTitle -} from 'components'; -import { useI18nContext } from 'i18n/i18n-react'; - -import RestartMonitor from '../status/RestartMonitor'; - -const UploadDownload: FC = () => { - const { LL } = useI18nContext(); - const [restarting, setRestarting] = useState(); - const [md5, setMd5] = useState(); - - const { send: getSettings, onSuccess: onSuccessGetSettings } = useRequest( - EMSESP.getSettings(), - { - immediate: false - } - ); - const { send: getCustomizations, onSuccess: onSuccessGetCustomizations } = - useRequest(EMSESP.getCustomizations(), { - immediate: false - }); - const { send: getEntities, onSuccess: onSuccessGetEntities } = useRequest( - EMSESP.getEntities(), - { - immediate: false - } - ); - const { send: getSchedule, onSuccess: onSuccessGetSchedule } = useRequest( - EMSESP.getSchedule(), - { - immediate: false - } - ); - const { send: getAPI, onSuccess: onGetAPI } = useRequest( - (data: APIcall) => EMSESP.API(data), - { - immediate: false - } - ); - - const { - data: data, - send: loadData, - error - } = useRequest(SystemApi.readHardwareStatus, { force: true }); - - const { data: latestVersion } = useRequest(SystemApi.getStableVersion, { - immediate: true, - force: true - }); - - const { data: latestDevVersion } = useRequest(SystemApi.getDevVersion, { - immediate: true, - force: true - }); - - const STABLE_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/'; - const DEV_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/latest/'; - - const STABLE_RELNOTES_URL = - 'https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md'; - const DEV_RELNOTES_URL = - 'https://github.com/emsesp/EMS-ESP32/blob/dev/CHANGELOG_LATEST.md'; - - const getBinURL = (v: string) => - 'EMS-ESP-' + - v.replaceAll('.', '_') + - '-' + - getPlatform().replaceAll('-', '_') + - '.bin'; - - const getPlatform = () => { - if (data.flash_chip_size === 16384) { - return data.esp_platform + '-16M'; - } - return data.esp_platform; - }; - - const { - loading: isUploading, - uploading: progress, - send: sendUpload, - onSuccess: onSuccessUpload, - abort: cancelUpload - } = useRequest(SystemApi.uploadFile, { - immediate: false, - force: true - }); - - onSuccessUpload(({ data }) => { - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - setMd5(data.md5); - toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL()); - } else { - setRestarting(true); - } - }); - - const startUpload = async (files: File[]) => { - await sendUpload(files[0]).catch((error: Error) => { - if (error.message === 'The user aborted a request') { - toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED()); - } else if (error.message === 'Network Error') { - toast.warning('Invalid file extension or incompatible bin file'); - } else { - toast.error(error.message); - } - }); - }; - - const saveFile = (json: unknown, endpoint: string) => { - const anchor = document.createElement('a'); - anchor.href = URL.createObjectURL( - new Blob([JSON.stringify(json, null, 2)], { - type: 'text/plain' - }) - ); - anchor.download = 'emsesp_' + endpoint; - anchor.click(); - URL.revokeObjectURL(anchor.href); - toast.info(LL.DOWNLOAD_SUCCESSFUL()); - }; - - onSuccessGetSettings((event) => { - saveFile(event.data, 'settings.json'); - }); - onSuccessGetCustomizations((event) => { - saveFile(event.data, 'customizations.json'); - }); - onSuccessGetEntities((event) => { - saveFile(event.data, 'entities.json'); - }); - onSuccessGetSchedule((event) => { - saveFile(event.data, 'schedule.json'); - }); - onGetAPI((event) => { - saveFile( - event.data, - - event.sendArgs[0].device + '_' + event.sendArgs[0].entity + '.txt' - ); - }); - - const downloadSettings = async () => { - await getSettings().catch((error: Error) => { - toast.error(error.message); - }); - }; - - const downloadCustomizations = async () => { - await getCustomizations().catch((error: Error) => { - toast.error(error.message); - }); - }; - - const downloadEntities = async () => { - await getEntities().catch((error: Error) => { - toast.error(error.message); - }); - }; - - const downloadSchedule = async () => { - await getSchedule().catch((error: Error) => { - toast.error(error.message); - }); - }; - - const callAPI = async (device: string, entity: string) => { - await getAPI({ device, entity, id: 0 }).catch((error: Error) => { - toast.error(error.message); - }); - }; - - useLayoutTitle(LL.UPLOAD_DOWNLOAD()); - - const content = () => { - if (!data) { - return ; - } - - return ( - <> - - {LL.EMS_ESP_VER()} - - - {LL.VERSION_ON() + ' '} - {data.emsesp_version} ({getPlatform()}) - - {latestVersion && ( - - {LL.THE_LATEST()} {LL.OFFICIAL()} {LL.RELEASE_IS()} -  {latestVersion} -  ( - - {LL.RELEASE_NOTES()} - - ) ( - - {LL.DOWNLOAD(1)} - - ) - - )} - {latestDevVersion && ( - - {LL.THE_LATEST()} {LL.DEVELOPMENT()} {LL.RELEASE_IS()} -   - {latestDevVersion} -  ( - - {LL.RELEASE_NOTES()} - - ) ( - - {LL.DOWNLOAD(1)} - - ) - - )} - - - - {LL.UPLOAD()} - - - - {LL.UPLOAD_TEXT()} -
-
- {LL.RESTART_TEXT(1)}. -
-
- {md5 && ( - - {'MD5: ' + md5} - - )} - - {!isUploading && ( - <> - - {LL.DOWNLOAD(0)} - - - - {LL.HELP_INFORMATION_4()} - - - - - - - - {LL.DOWNLOAD_SETTINGS_TEXT()} - - - - - - - {LL.DOWNLOAD_CUSTOMIZATION_TEXT()} - - - - - - {LL.DOWNLOAD_SCHEDULE_TEXT()} - - - - - - )} - - ); - }; - - return ( - {restarting ? : content()} - ); -}; - -export default UploadDownload; diff --git a/interface/src/app/settings/network/Network.tsx b/interface/src/app/settings/network/Network.tsx index 0088a93b8..0a7feeb54 100644 --- a/interface/src/app/settings/network/Network.tsx +++ b/interface/src/app/settings/network/Network.tsx @@ -1,5 +1,4 @@ import { useCallback, useState } from 'react'; -import type { FC } from 'react'; import { Navigate, Route, Routes, useNavigate } from 'react-router-dom'; import { Tab } from '@mui/material'; @@ -12,7 +11,7 @@ import NetworkSettings from './NetworkSettings'; import { WiFiConnectionContext } from './WiFiConnectionContext'; import WiFiNetworkScanner from './WiFiNetworkScanner'; -const Network: FC = () => { +const Network = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.SETTINGS_OF(LL.NETWORK(0))); diff --git a/interface/src/app/settings/network/NetworkSettings.tsx b/interface/src/app/settings/network/NetworkSettings.tsx index cc1d8386a..4fc22b358 100644 --- a/interface/src/app/settings/network/NetworkSettings.tsx +++ b/interface/src/app/settings/network/NetworkSettings.tsx @@ -1,5 +1,4 @@ import { useContext, useEffect, useState } from 'react'; -import type { FC } from 'react'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -26,7 +25,7 @@ import { import * as NetworkApi from 'api/network'; import * as SystemApi from 'api/system'; -import { updateState, useRequest } from 'alova'; +import { updateState, useRequest } from 'alova/client'; import type { ValidateFieldsError } from 'async-validator'; import { BlockFormControlLabel, @@ -48,7 +47,7 @@ import RestartMonitor from '../../status/RestartMonitor'; import { WiFiConnectionContext } from './WiFiConnectionContext'; import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector'; -const NetworkSettings: FC = () => { +const NetworkSettings = () => { const { LL } = useI18nContext(); const { selectedNetwork, deselectNetwork } = useContext(WiFiConnectionContext); @@ -80,19 +79,22 @@ const NetworkSettings: FC = () => { useEffect(() => { if (!initialized && data) { if (selectedNetwork) { - updateState('networkSettings', (current_data: NetworkSettingsType) => ({ - ssid: selectedNetwork.ssid, - bssid: selectedNetwork.bssid, - password: current_data ? current_data.password : '', - hostname: current_data?.hostname, - static_ip_config: false, - bandwidth20: false, - tx_power: 0, - nosleep: false, - enableMDNS: true, - enableCORS: false, - CORSOrigin: '*' - })); + void updateState( + NetworkApi.readNetworkSettings(), + (current_data: NetworkSettingsType) => ({ + ssid: selectedNetwork.ssid, + bssid: selectedNetwork.bssid, + password: current_data ? current_data.password : '', + hostname: current_data?.hostname, + static_ip_config: false, + bandwidth20: false, + tx_power: 0, + nosleep: false, + enableMDNS: true, + enableCORS: false, + CORSOrigin: '*' + }) + ); } setInitialized(true); } diff --git a/interface/src/app/settings/network/WiFiNetworkScanner.tsx b/interface/src/app/settings/network/WiFiNetworkScanner.tsx index 3ffd32fb9..a73cdea7a 100644 --- a/interface/src/app/settings/network/WiFiNetworkScanner.tsx +++ b/interface/src/app/settings/network/WiFiNetworkScanner.tsx @@ -1,12 +1,11 @@ import { useRef, useState } from 'react'; -import type { FC } from 'react'; import PermScanWifiIcon from '@mui/icons-material/PermScanWifi'; import { Button } from '@mui/material'; import * as NetworkApi from 'api/network'; -import { updateState, useRequest } from 'alova'; +import { updateState, useRequest } from 'alova/client'; import { ButtonRow, FormLoader, SectionContent } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; @@ -15,23 +14,28 @@ import WiFiNetworkSelector from './WiFiNetworkSelector'; const NUM_POLLS = 10; const POLLING_FREQUENCY = 1000; -const WiFiNetworkScanner: FC = () => { +const WiFiNetworkScanner = () => { const pollCount = useRef(0); const { LL } = useI18nContext(); const [errorMessage, setErrorMessage] = useState(); - const { send: scanNetworks, onComplete: onCompleteScanNetworks } = useRequest( - NetworkApi.scanNetworks - ); // is called on page load to start network scan - const { - data: networkList, - send: getNetworkList, - onSuccess: onSuccessNetworkList - } = useRequest(NetworkApi.listNetworks, { - immediate: false - }); + // is called on page load to start network scan + const { send: scanNetworks } = useRequest(NetworkApi.scanNetworks).onComplete( + () => { + pollCount.current = 0; + setErrorMessage(undefined); + void updateState(NetworkApi.listNetworks(), () => undefined); + void getNetworkList(); + } + ); - onSuccessNetworkList((event) => { + const { data: networkList, send: getNetworkList } = useRequest( + NetworkApi.listNetworks, + { + immediate: false + } + ).onSuccess((event) => { + // is called when network scan is completed if (!event.data) { const completedPollCount = pollCount.current + 1; if (completedPollCount < NUM_POLLS) { @@ -44,13 +48,6 @@ const WiFiNetworkScanner: FC = () => { } }); - onCompleteScanNetworks(() => { - pollCount.current = 0; - setErrorMessage(undefined); - updateState('listNetworks', () => undefined); - void getNetworkList(); - }); - const renderNetworkScanner = () => { if (!networkList) { return ( diff --git a/interface/src/app/settings/network/WiFiNetworkSelector.tsx b/interface/src/app/settings/network/WiFiNetworkSelector.tsx index 9124a4678..f003ecd38 100644 --- a/interface/src/app/settings/network/WiFiNetworkSelector.tsx +++ b/interface/src/app/settings/network/WiFiNetworkSelector.tsx @@ -1,5 +1,4 @@ import { useContext } from 'react'; -import type { FC } from 'react'; import LockIcon from '@mui/icons-material/Lock'; import LockOpenIcon from '@mui/icons-material/LockOpen'; @@ -23,10 +22,6 @@ import { WiFiEncryptionType } from 'types'; import { WiFiConnectionContext } from './WiFiConnectionContext'; -interface WiFiNetworkSelectorProps { - networkList: WiFiNetworkList; -} - export const isNetworkOpen = ({ encryption_type }: WiFiNetwork) => encryption_type === WiFiEncryptionType.WIFI_AUTH_OPEN; @@ -62,7 +57,7 @@ const networkQualityHighlight = ({ rssi }: WiFiNetwork, theme: Theme) => { return theme.palette.success.main; }; -const WiFiNetworkSelector: FC = ({ networkList }) => { +const WiFiNetworkSelector = ({ networkList }: { networkList: WiFiNetworkList }) => { const { LL } = useI18nContext(); const theme = useTheme(); diff --git a/interface/src/app/settings/security/GenerateToken.tsx b/interface/src/app/settings/security/GenerateToken.tsx index 1d34536df..aed035276 100644 --- a/interface/src/app/settings/security/GenerateToken.tsx +++ b/interface/src/app/settings/security/GenerateToken.tsx @@ -1,5 +1,4 @@ import { useEffect } from 'react'; -import type { FC } from 'react'; import CloseIcon from '@mui/icons-material/Close'; import { @@ -17,7 +16,7 @@ import { import * as SecurityApi from 'api/security'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; +import { useRequest } from 'alova/client'; import { MessageBox } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; @@ -26,7 +25,7 @@ interface GenerateTokenProps { onClose: () => void; } -const GenerateToken: FC = ({ username, onClose }) => { +const GenerateToken = ({ username, onClose }: GenerateTokenProps) => { const { LL } = useI18nContext(); const open = !!username; diff --git a/interface/src/app/settings/security/ManageUsers.tsx b/interface/src/app/settings/security/ManageUsers.tsx index c49c20bc5..0cf5f191c 100644 --- a/interface/src/app/settings/security/ManageUsers.tsx +++ b/interface/src/app/settings/security/ManageUsers.tsx @@ -1,5 +1,4 @@ import { useContext, useState } from 'react'; -import type { FC } from 'react'; import { useBlocker } from 'react-router-dom'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -40,7 +39,7 @@ import { createUserValidator } from 'validators'; import GenerateToken from './GenerateToken'; import User from './User'; -const ManageUsers: FC = () => { +const ManageUsers = () => { const { loadData, saveData, saving, data, updateDataValue, errorMessage } = useRest({ read: SecurityApi.readSecuritySettings, @@ -221,8 +220,8 @@ const ManageUsers: FC = () => { )} - - {changed !== 0 && ( + {changed !== 0 && ( + - )} - - + + )} - - + + + + + + + + + + + + + IP + + + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/interface/src/app/status/Activity.tsx b/interface/src/app/status/Activity.tsx index 1caf3ee86..27d01a1fa 100644 --- a/interface/src/app/status/Activity.tsx +++ b/interface/src/app/status/Activity.tsx @@ -1,9 +1,3 @@ -import { useEffect } from 'react'; -import type { FC } from 'react'; - -import RefreshIcon from '@mui/icons-material/Refresh'; -import { Button } from '@mui/material'; - import { Body, Cell, @@ -14,16 +8,20 @@ import { Table } from '@table-library/react-table-library/table'; import { useTheme as tableTheme } from '@table-library/react-table-library/theme'; -import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; +import { useAutoRequest } from 'alova/client'; +import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { Translation } from 'i18n/i18n-types'; -import * as EMSESP from '../main/api'; +import { readActivity } from '../../api/app'; import type { Stat } from '../main/types'; -const SystemActivity: FC = () => { - const { data: data, send: loadData, error } = useRequest(EMSESP.readActivity); +const SystemActivity = () => { + const { + data: data, + send: loadData, + error + } = useAutoRequest(readActivity, { pollingTime: 2000 }); const { LL } = useI18nContext(); @@ -67,13 +65,6 @@ const SystemActivity: FC = () => { ` }); - useEffect(() => { - const timer = setInterval(() => loadData(), 30000); - return () => { - clearInterval(timer); - }; - }); - const showName = (id: number) => { const name: keyof Translation['STATUS_NAMES'] = id; return LL.STATUS_NAMES[name](); @@ -99,46 +90,34 @@ const SystemActivity: FC = () => { } return ( - <> - - {(tableList: Stat[]) => ( - <> -
- - - {LL.SUCCESS()} - {LL.FAIL()} - {LL.QUALITY()} - -
- - {tableList.map((stat: Stat) => ( - - {showName(stat.id)} - {Intl.NumberFormat().format(stat.s)} - {Intl.NumberFormat().format(stat.f)} - {showQuality(stat)} - - ))} - - - )} -
- - - - + + {(tableList: Stat[]) => ( + <> +
+ + + {LL.SUCCESS()} + {LL.FAIL()} + {LL.QUALITY()} + +
+ + {tableList.map((stat: Stat) => ( + + {showName(stat.id)} + {Intl.NumberFormat().format(stat.s)} + {Intl.NumberFormat().format(stat.f)} + {showQuality(stat)} + + ))} + + + )} +
); }; diff --git a/interface/src/app/status/HardwareStatus.tsx b/interface/src/app/status/HardwareStatus.tsx index 2b7c00340..5cf96e1a2 100644 --- a/interface/src/app/status/HardwareStatus.tsx +++ b/interface/src/app/status/HardwareStatus.tsx @@ -1,18 +1,13 @@ -import type { FC } from 'react'; - import AppsIcon from '@mui/icons-material/Apps'; import DeveloperBoardIcon from '@mui/icons-material/DeveloperBoard'; import DevicesIcon from '@mui/icons-material/Devices'; import FolderIcon from '@mui/icons-material/Folder'; import MemoryIcon from '@mui/icons-material/Memory'; -import RefreshIcon from '@mui/icons-material/Refresh'; import SdCardAlertIcon from '@mui/icons-material/SdCardAlert'; import SdStorageIcon from '@mui/icons-material/SdStorage'; import TapAndPlayIcon from '@mui/icons-material/TapAndPlay'; import { Avatar, - Box, - Button, Divider, List, ListItem, @@ -22,8 +17,8 @@ import { import * as SystemApi from 'api/system'; -import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; +import { useAutoRequest } from 'alova/client'; +import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import BBQKeesIcon from './bbqkees.svg'; @@ -32,7 +27,7 @@ function formatNumber(num: number) { return new Intl.NumberFormat().format(num); } -const HardwareStatus: FC = () => { +const HardwareStatus = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.STATUS_OF(LL.HARDWARE())); @@ -41,7 +36,7 @@ const HardwareStatus: FC = () => { data: data, send: loadData, error - } = useRequest(SystemApi.readHardwareStatus, { force: true }); + } = useAutoRequest(SystemApi.readHardwareStatus, { pollingTime: 2000 }); const content = () => { if (!data) { @@ -49,171 +44,155 @@ const HardwareStatus: FC = () => { } return ( - <> - - - - - {data.model ? ( - - ) : ( - - )} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {data.psram_size !== undefined && data.free_psram !== undefined && ( - <> - - - - - - - - + + + + {data.model ? ( + - - - )} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ) : ( + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {data.psram_size !== undefined && data.free_psram !== undefined && ( + <> + + + + + + + + + + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/interface/src/app/status/MqttStatus.tsx b/interface/src/app/status/MqttStatus.tsx index 81475b481..cf2943707 100644 --- a/interface/src/app/status/MqttStatus.tsx +++ b/interface/src/app/status/MqttStatus.tsx @@ -1,13 +1,9 @@ -import type { FC } from 'react'; - import AutoAwesomeMotionIcon from '@mui/icons-material/AutoAwesomeMotion'; import DeviceHubIcon from '@mui/icons-material/DeviceHub'; -import RefreshIcon from '@mui/icons-material/Refresh'; import ReportIcon from '@mui/icons-material/Report'; import SpeakerNotesOffIcon from '@mui/icons-material/SpeakerNotesOff'; import { Avatar, - Button, Divider, List, ListItem, @@ -19,8 +15,8 @@ import type { Theme } from '@mui/material'; import * as MqttApi from 'api/mqtt'; -import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; +import { useAutoRequest } from 'alova/client'; +import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { MqttStatusType } from 'types'; import { MqttDisconnectReason } from 'types'; @@ -57,8 +53,12 @@ export const mqttQueueHighlight = ( return theme.palette.warning.main; }; -const MqttStatus: FC = () => { - const { data: data, send: loadData, error } = useRequest(MqttApi.readMqttStatus); +const MqttStatus = () => { + const { + data: data, + send: loadData, + error + } = useAutoRequest(MqttApi.readMqttStatus, { pollingTime: 5000 }); const { LL } = useI18nContext(); useLayoutTitle(LL.STATUS_OF('MQTT')); @@ -148,30 +148,18 @@ const MqttStatus: FC = () => { ); return ( - <> - - - - - - - - - - - {data.enabled && renderConnectionStatus()} - - - - - + + + + + + + + + + + {data.enabled && renderConnectionStatus()} + ); }; diff --git a/interface/src/app/status/NTPStatus.tsx b/interface/src/app/status/NTPStatus.tsx index a07753f8e..0943e0aa0 100644 --- a/interface/src/app/status/NTPStatus.tsx +++ b/interface/src/app/status/NTPStatus.tsx @@ -1,11 +1,9 @@ import { useState } from 'react'; -import type { FC } from 'react'; import { toast } from 'react-toastify'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; import CancelIcon from '@mui/icons-material/Cancel'; import DnsIcon from '@mui/icons-material/Dns'; -import RefreshIcon from '@mui/icons-material/Refresh'; import SwapVerticalCircleIcon from '@mui/icons-material/SwapVerticalCircle'; import UpdateIcon from '@mui/icons-material/Update'; import { @@ -30,15 +28,19 @@ import type { Theme } from '@mui/material'; import * as NTPApi from 'api/ntp'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; +import { useAutoRequest, useRequest } from 'alova/client'; import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NTPStatusType, Time } from 'types'; import { NTPSyncStatus } from 'types'; import { formatDateTime, formatLocalDateTime } from 'utils'; -const NTPStatus: FC = () => { - const { data: data, send: loadData, error } = useRequest(NTPApi.readNTPStatus); +const NTPStatus = () => { + const { + data: data, + send: loadData, + error + } = useAutoRequest(NTPApi.readNTPStatus, { pollingTime: 5000 }); const [localTime, setLocalTime] = useState(''); const [settingTime, setSettingTime] = useState(false); @@ -215,18 +217,6 @@ const NTPStatus: FC = () => { - - - - - {data && !isNtpActive(data) && ( diff --git a/interface/src/app/status/NetworkStatus.tsx b/interface/src/app/status/NetworkStatus.tsx index 3ef8e6a63..812f8f537 100644 --- a/interface/src/app/status/NetworkStatus.tsx +++ b/interface/src/app/status/NetworkStatus.tsx @@ -1,16 +1,12 @@ -import type { FC } from 'react'; - import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import DnsIcon from '@mui/icons-material/Dns'; import GiteIcon from '@mui/icons-material/Gite'; -import RefreshIcon from '@mui/icons-material/Refresh'; import RouterIcon from '@mui/icons-material/Router'; import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; import SettingsInputComponentIcon from '@mui/icons-material/SettingsInputComponent'; import WifiIcon from '@mui/icons-material/Wifi'; import { Avatar, - Button, Divider, List, ListItem, @@ -22,8 +18,8 @@ import type { Theme } from '@mui/material'; import * as NetworkApi from 'api/network'; -import { useRequest } from 'alova'; -import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components'; +import { useAutoRequest } from 'alova/client'; +import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import type { NetworkStatusType } from 'types'; import { NetworkConnectionStatus } from 'types'; @@ -84,12 +80,12 @@ const IPs = (status: NetworkStatusType) => { return status.local_ip + ', ' + status.local_ipv6; }; -const NetworkStatus: FC = () => { +const NetworkStatus = () => { const { data: data, send: loadData, error - } = useRequest(NetworkApi.readNetworkStatus); + } = useAutoRequest(NetworkApi.readNetworkStatus, { pollingTime: 5000 }); const { LL } = useI18nContext(); useLayoutTitle(LL.STATUS_OF(LL.NETWORK(1))); @@ -125,112 +121,99 @@ const NetworkStatus: FC = () => { } return ( - <> - - - - - {isWiFi(data) && } - {isEthernet(data) && } - - - - - - - - - - - - - - - {isWiFi(data) && ( - <> - - - - - - - - - - - )} - {isConnected(data) && ( - <> - - - IP - - - - - - - - - - - - - - - - # - - - - - - - - - - - - - - - - - - - - - - - - )} - - - - - + + + + + {isWiFi(data) && } + {isEthernet(data) && } + + + + + + + + + + + + + + + {isWiFi(data) && ( + <> + + + + + + + + + + + )} + {isConnected(data) && ( + <> + + + IP + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + )} + ); }; diff --git a/interface/src/app/status/RestartMonitor.tsx b/interface/src/app/status/RestartMonitor.tsx index de77f7249..a8cb12774 100644 --- a/interface/src/app/status/RestartMonitor.tsx +++ b/interface/src/app/status/RestartMonitor.tsx @@ -1,20 +1,19 @@ import { useEffect, useRef, useState } from 'react'; -import type { FC } from 'react'; import * as SystemApi from 'api/system'; -import { useRequest } from 'alova'; +import { useRequest } from 'alova/client'; import { FormLoader } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; const RESTART_TIMEOUT = 2 * 60 * 1000; const POLL_INTERVAL = 3000; -const RestartMonitor: FC = () => { +const RestartMonitor = () => { const [failed, setFailed] = useState(false); const [timeoutId, setTimeoutId] = useState(); const { LL } = useI18nContext(); - const { send } = useRequest(SystemApi.readSystemStatus, { force: true }); + const { send } = useRequest(SystemApi.readSystemStatus); const timeoutAt = useRef(new Date().getTime() + RESTART_TIMEOUT); const poll = useRef(async () => { diff --git a/interface/src/app/status/Status.tsx b/interface/src/app/status/Status.tsx index 9e8d97327..c1af25414 100644 --- a/interface/src/app/status/Status.tsx +++ b/interface/src/app/status/Status.tsx @@ -1,4 +1,4 @@ -import { type FC, useContext, useState } from 'react'; +import { useContext, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { toast } from 'react-toastify'; @@ -10,7 +10,6 @@ import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; import LogoDevIcon from '@mui/icons-material/LogoDev'; import MemoryIcon from '@mui/icons-material/Memory'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; -import RefreshIcon from '@mui/icons-material/Refresh'; import RouterIcon from '@mui/icons-material/Router'; import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; import TimerIcon from '@mui/icons-material/Timer'; @@ -18,7 +17,6 @@ import UpgradeIcon from '@mui/icons-material/Upgrade'; import WifiIcon from '@mui/icons-material/Wifi'; import { Avatar, - Box, Button, Dialog, DialogActions, @@ -34,7 +32,7 @@ import { import * as SystemApi from 'api/system'; import { dialogStyle } from 'CustomTheme'; -import { useRequest } from 'alova'; +import { useAutoRequest, useRequest } from 'alova/client'; import { busConnectionStatus } from 'app/main/types'; import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; @@ -44,7 +42,7 @@ import { NTPSyncStatus, NetworkConnectionStatus } from 'types'; import RestartMonitor from './RestartMonitor'; -const SystemStatus: FC = () => { +const SystemStatus = () => { const { LL } = useI18nContext(); const navigate = useNavigate(); @@ -69,7 +67,10 @@ const SystemStatus: FC = () => { data: data, send: loadData, error - } = useRequest(SystemApi.readSystemStatus, { force: true }); + } = useAutoRequest(SystemApi.readSystemStatus, { + initialData: [], + pollingTime: 5000 + }); const theme = useTheme(); @@ -390,17 +391,6 @@ const SystemStatus: FC = () => { {renderRestartDialog()} - - - - ); }; diff --git a/interface/src/app/status/SystemLog.tsx b/interface/src/app/status/SystemLog.tsx index bf2ba5f48..32d649e6e 100644 --- a/interface/src/app/status/SystemLog.tsx +++ b/interface/src/app/status/SystemLog.tsx @@ -1,5 +1,4 @@ import { useEffect, useRef, useState } from 'react'; -import type { FC } from 'react'; import { toast } from 'react-toastify'; import DownloadIcon from '@mui/icons-material/GetApp'; @@ -17,8 +16,7 @@ import { import * as SystemApi from 'api/system'; import { fetchLogES } from 'api/system'; -import { useSSE } from '@alova/scene-react'; -import { useRequest } from 'alova'; +import { useRequest, useSSE } from 'alova/client'; import { BlockFormControlLabel, BlockNavigation, @@ -72,7 +70,7 @@ const levelLabel = (level: LogLevel) => { } }; -const SystemLog: FC = () => { +const SystemLog = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.LOG_OF(LL.SYSTEM(0))); diff --git a/interface/src/components/inputs/LanguageSelector.tsx b/interface/src/components/inputs/LanguageSelector.tsx index 6a1837c2f..ac049308a 100644 --- a/interface/src/components/inputs/LanguageSelector.tsx +++ b/interface/src/components/inputs/LanguageSelector.tsx @@ -1,4 +1,4 @@ -import { type ChangeEventHandler, type FC, useContext } from 'react'; +import { type ChangeEventHandler, useContext } from 'react'; import { MenuItem, TextField } from '@mui/material'; @@ -16,7 +16,7 @@ import { I18nContext } from 'i18n/i18n-react'; import type { Locales } from 'i18n/i18n-types'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; -const LanguageSelector: FC = () => { +const LanguageSelector = () => { const { setLocale, locale } = useContext(I18nContext); const onLocaleSelected: ChangeEventHandler = async ({ diff --git a/interface/src/components/layout/Layout.tsx b/interface/src/components/layout/Layout.tsx index 23f087adb..a552ea915 100644 --- a/interface/src/components/layout/Layout.tsx +++ b/interface/src/components/layout/Layout.tsx @@ -4,8 +4,7 @@ import { useLocation } from 'react-router-dom'; import { Box, Toolbar } from '@mui/material'; -import { PROJECT_NAME } from 'api/env'; - +import { PROJECT_NAME } from 'env'; import type { RequiredChildrenProps } from 'utils'; import LayoutAppBar from './LayoutAppBar'; diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx index 06e43e798..c8f31ee0c 100644 --- a/interface/src/components/layout/LayoutAppBar.tsx +++ b/interface/src/components/layout/LayoutAppBar.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; @@ -12,7 +11,7 @@ interface LayoutAppBarProps { onToggleDrawer: () => void; } -const LayoutAppBar: FC = ({ title, onToggleDrawer }) => { +const LayoutAppBar = ({ title, onToggleDrawer }: LayoutAppBarProps) => { const pathnames = useLocation() .pathname.split('/') .filter((x) => x); diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx index b1cd4f254..320208129 100644 --- a/interface/src/components/layout/LayoutDrawer.tsx +++ b/interface/src/components/layout/LayoutDrawer.tsx @@ -1,8 +1,6 @@ -import type { FC } from 'react'; - import { Box, Divider, Drawer, Toolbar, Typography, styled } from '@mui/material'; -import { PROJECT_NAME } from 'api/env'; +import { PROJECT_NAME } from 'env'; import { DRAWER_WIDTH } from './Layout'; import LayoutMenu from './LayoutMenu'; @@ -23,7 +21,7 @@ interface LayoutDrawerProps { onClose: () => void; } -const LayoutDrawer: FC = ({ mobileOpen, onClose }) => { +const LayoutDrawerProps = ({ mobileOpen, onClose }: LayoutDrawerProps) => { const drawer = ( <> @@ -68,4 +66,4 @@ const LayoutDrawer: FC = ({ mobileOpen, onClose }) => { ); }; -export default LayoutDrawer; +export default LayoutDrawerProps; diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx index f3efb398d..734010a3d 100644 --- a/interface/src/components/layout/LayoutMenu.tsx +++ b/interface/src/components/layout/LayoutMenu.tsx @@ -1,5 +1,4 @@ import { useContext, useState } from 'react'; -import type { FC } from 'react'; import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import AssessmentIcon from '@mui/icons-material/Assessment'; @@ -30,7 +29,7 @@ import LayoutMenuItem from 'components/layout/LayoutMenuItem'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -const LayoutMenu: FC = () => { +const LayoutMenu = () => { const { me, signOut } = useContext(AuthenticatedContext); const { LL } = useI18nContext(); diff --git a/interface/src/components/layout/LayoutMenuItem.tsx b/interface/src/components/layout/LayoutMenuItem.tsx index 03b48883a..9bcec5f3d 100644 --- a/interface/src/components/layout/LayoutMenuItem.tsx +++ b/interface/src/components/layout/LayoutMenuItem.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; @@ -13,12 +12,12 @@ interface LayoutMenuItemProps { disabled?: boolean; } -const LayoutMenuItem: FC = ({ +const LayoutMenuItem = ({ icon: Icon, label, to, disabled -}) => { +}: LayoutMenuItemProps) => { const { pathname } = useLocation(); const selected = routeMatches(to, pathname); diff --git a/interface/src/components/layout/ListMenuItem.tsx b/interface/src/components/layout/ListMenuItem.tsx index df5804e8c..49d7091a0 100644 --- a/interface/src/components/layout/ListMenuItem.tsx +++ b/interface/src/components/layout/ListMenuItem.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import { Link } from 'react-router-dom'; import NavigateNextIcon from '@mui/icons-material/NavigateNext'; @@ -34,14 +33,14 @@ function RenderIcon({ icon: Icon, bgcolor, label, text }: ListMenuItemProps) { ); } -const LayoutMenuItem: FC = ({ +const LayoutMenuItem = ({ icon, bgcolor, label, text, to, disabled -}) => ( +}: ListMenuItemProps) => ( <> {to && !disabled ? ( = ({ message }) => ( - - - - - - Application Error - - - - Failed to configure the application, please refresh to try again. - - {message && ( - - {message} - - )} - - -); - -export default ApplicationError; diff --git a/interface/src/components/loading/FormLoader.tsx b/interface/src/components/loading/FormLoader.tsx index 5525d3b81..bbf2ca7cc 100644 --- a/interface/src/components/loading/FormLoader.tsx +++ b/interface/src/components/loading/FormLoader.tsx @@ -1,5 +1,3 @@ -import type { FC } from 'react'; - import RefreshIcon from '@mui/icons-material/Refresh'; import { Box, Button, CircularProgress, Typography } from '@mui/material'; @@ -12,11 +10,11 @@ interface FormLoaderProps { onRetry?: () => void; } -const FormLoader: FC = ({ +const FormLoader = ({ errorMessage, onRetry, message = 'Loading…' -}) => { +}: FormLoaderProps) => { const { LL } = useI18nContext(); if (errorMessage) { diff --git a/interface/src/components/loading/LoadingSpinner.tsx b/interface/src/components/loading/LoadingSpinner.tsx index 3bd47ec4c..46e07af4c 100644 --- a/interface/src/components/loading/LoadingSpinner.tsx +++ b/interface/src/components/loading/LoadingSpinner.tsx @@ -1,5 +1,3 @@ -import type { FC } from 'react'; - import { Box, CircularProgress, Typography } from '@mui/material'; import type { Theme } from '@mui/material'; @@ -9,7 +7,7 @@ interface LoadingSpinnerProps { height?: number | string; } -const LoadingSpinner: FC = ({ height = '100%' }) => { +const LoadingSpinner = ({ height = '100%' }: LoadingSpinnerProps) => { const { LL } = useI18nContext(); return ( diff --git a/interface/src/components/loading/index.ts b/interface/src/components/loading/index.ts index f8c7b8608..76041e14b 100644 --- a/interface/src/components/loading/index.ts +++ b/interface/src/components/loading/index.ts @@ -1,3 +1,2 @@ -export { default as ApplicationError } from './ApplicationError'; export { default as LoadingSpinner } from './LoadingSpinner'; export { default as FormLoader } from './FormLoader'; diff --git a/interface/src/components/routing/BlockNavigation.tsx b/interface/src/components/routing/BlockNavigation.tsx index 361da67d7..1c56c8448 100644 --- a/interface/src/components/routing/BlockNavigation.tsx +++ b/interface/src/components/routing/BlockNavigation.tsx @@ -1,4 +1,3 @@ -import type { FC } from 'react'; import type { Blocker } from 'react-router-dom'; import { @@ -12,11 +11,7 @@ import { import { dialogStyle } from 'CustomTheme'; import { useI18nContext } from 'i18n/i18n-react'; -interface BlockNavigationProps { - blocker: Blocker; -} - -const BlockNavigation: FC = ({ blocker }) => { +const BlockNavigation = ({ blocker }: { blocker: Blocker }) => { const { LL } = useI18nContext(); return ( diff --git a/interface/src/components/routing/RequireAuthenticated.tsx b/interface/src/components/routing/RequireAuthenticated.tsx index c5fb96fd9..709e79ea1 100644 --- a/interface/src/components/routing/RequireAuthenticated.tsx +++ b/interface/src/components/routing/RequireAuthenticated.tsx @@ -2,8 +2,7 @@ import { useContext, useEffect } from 'react'; import type { FC } from 'react'; import { Navigate, useLocation } from 'react-router-dom'; -import { storeLoginRedirect } from 'api/authentication'; - +import { storeLoginRedirect } from 'components/routing/authentication'; import type { AuthenticatedContextValue } from 'contexts/authentication/context'; import { AuthenticatedContext, diff --git a/interface/src/components/routing/RequireUnauthenticated.tsx b/interface/src/components/routing/RequireUnauthenticated.tsx index d8e40ccc7..f98a78ac9 100644 --- a/interface/src/components/routing/RequireUnauthenticated.tsx +++ b/interface/src/components/routing/RequireUnauthenticated.tsx @@ -2,8 +2,7 @@ import { useContext } from 'react'; import type { FC } from 'react'; import { Navigate } from 'react-router-dom'; -import * as AuthenticationApi from 'api/authentication'; - +import { fetchLoginRedirect } from 'components/routing/authentication'; import { AuthenticationContext } from 'contexts/authentication'; import type { RequiredChildrenProps } from 'utils'; @@ -11,7 +10,7 @@ const RequireUnauthenticated: FC = ({ children }) => { const authenticationContext = useContext(AuthenticationContext); return authenticationContext.me ? ( - + ) : ( <>{children} ); diff --git a/interface/src/api/authentication.ts b/interface/src/components/routing/authentication.ts similarity index 96% rename from interface/src/api/authentication.ts rename to interface/src/components/routing/authentication.ts index 076b69bd5..822417b88 100644 --- a/interface/src/api/authentication.ts +++ b/interface/src/components/routing/authentication.ts @@ -4,7 +4,7 @@ import type * as H from 'history'; import { jwtDecode } from 'jwt-decode'; import type { Me, SignInRequest, SignInResponse } from 'types'; -import { ACCESS_TOKEN, alovaInstance } from './endpoints'; +import { ACCESS_TOKEN, alovaInstance } from '../../api/endpoints'; export const SIGN_IN_PATHNAME = 'loginPathname'; export const SIGN_IN_SEARCH = 'loginSearch'; diff --git a/interface/src/components/upload/DragNdrop.tsx b/interface/src/components/upload/DragNdrop.tsx new file mode 100644 index 000000000..f31402cd2 --- /dev/null +++ b/interface/src/components/upload/DragNdrop.tsx @@ -0,0 +1,112 @@ +// Code inspired by https://medium.com/@dprincecoder/creating-a-drag-and-drop-file-upload-component-in-react-a-step-by-step-guide-4d93b6cc21e0 +// (c) Prince Azubuike +import { type ChangeEvent, useRef, useState } from 'react'; + +import CancelIcon from '@mui/icons-material/Cancel'; +import CloudUploadIcon from '@mui/icons-material/CloudUpload'; +import UploadIcon from '@mui/icons-material/Upload'; +import { Box, Button } from '@mui/material'; + +import { useI18nContext } from 'i18n/i18n-react'; + +import './drag-drop.css'; + +const DragNdrop = ({ onFileSelected }) => { + const [file, setFile] = useState(); + const inputRef = useRef(null); + const { LL } = useI18nContext(); + + const checkFileExtension = (file: File) => { + const validExtensions = ['.json', '.txt', '.csv', '.bin', '.md5']; + const fileName = file.name; + const fileExtension = fileName.substring(fileName.lastIndexOf('.')); + if (validExtensions.includes(fileExtension)) { + setFile(file); + } else { + alert('Invalid file type'); + } + }; + + const handleFileChange = (e: ChangeEvent) => { + if (!e.target.files) { + return; + } + checkFileExtension(e.target.files[0]); + e.target.value = ''; // this is to allow the same file to be selected again + }; + + const handleDrop = (event) => { + event.preventDefault(); + const droppedFiles = event.dataTransfer.files; + if (droppedFiles.length > 0) { + checkFileExtension(droppedFiles[0]); + } + }; + + const handleRemoveFile = (event) => { + event.stopPropagation(); + setFile(undefined); + }; + + const handleUploadClick = (event) => { + event.stopPropagation(); + onFileSelected(file); + }; + + const handleBrowseClick = () => { + inputRef.current?.click(); + }; + + return ( +
event.preventDefault()} + onClick={handleBrowseClick} + > +
+ +

{LL.UPLOAD_DRAG()}

+
+ + + + {file && ( + <> +
+

{file.name}

+
+ + + + + + )} +
+ ); +}; + +export default DragNdrop; diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx index 74cd66b56..4fb55ee74 100644 --- a/interface/src/components/upload/SingleUpload.tsx +++ b/interface/src/components/upload/SingleUpload.tsx @@ -1,118 +1,132 @@ -import { Fragment } from 'react'; -import type { FC } from 'react'; -import { useDropzone } from 'react-dropzone'; -import type { DropzoneState } from 'react-dropzone'; +import { useEffect, useState } from 'react'; +import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; -import CloudUploadIcon from '@mui/icons-material/CloudUpload'; -import { Box, Button, LinearProgress, Typography, useTheme } from '@mui/material'; -import type { Theme } from '@mui/material'; +import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; +import { Box, Button, LinearProgress, Typography } from '@mui/material'; -import type { Progress } from 'alova'; +import * as SystemApi from 'api/system'; + +import { useRequest } from 'alova/client'; +import RestartMonitor from 'app/status/RestartMonitor'; +import MessageBox from 'components/MessageBox'; import { useI18nContext } from 'i18n/i18n-react'; -const getBorderColor = (theme: Theme, props: DropzoneState) => { - if (props.isDragAccept) { - return theme.palette.success.main; - } - if (props.isDragReject) { - return theme.palette.error.main; - } - if (props.isDragActive) { - return theme.palette.info.main; - } - return theme.palette.grey[700]; -}; +import DragNdrop from './DragNdrop'; -export interface SingleUploadProps { - onDrop: (acceptedFiles: File[]) => void; - onCancel: () => void; - isUploading: boolean; - progress: Progress; -} +const SingleUpload = () => { + const [md5, setMd5] = useState(); + const [restarting, setRestarting] = useState(false); + const [restartNeeded, setRestartNeeded] = useState(false); -const SingleUpload: FC = ({ - onDrop, - onCancel, - isUploading, - progress -}) => { - const uploading = isUploading && progress.total > 0; - - const dropzoneState = useDropzone({ - onDrop, - accept: { - 'application/octet-stream': ['.bin'], - 'application/json': ['.json'], - 'text/plain': ['.md5'] - }, - disabled: isUploading, - multiple: false - }); - - const { getRootProps, getInputProps } = dropzoneState; - const theme = useTheme(); + const [file, setFile] = useState(); const { LL } = useI18nContext(); - const progressText = () => { - if (uploading) { - return ( - LL.UPLOADING() + - ': ' + - Math.round((progress.loaded * 100) / progress.total) + - '%' - ); + const { + loading: isUploading, + uploading: progress, + send: sendUpload, + abort: cancelUpload + } = useRequest(SystemApi.uploadFile, { + immediate: false + }).onSuccess(({ data }) => { + if (data) { + setMd5(data.md5 as string); + toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL()); + setFile(undefined); + } else { + setRestartNeeded(true); } - return LL.UPLOAD_DROP_TEXT(); + }); + + const { send: restartCommand } = useRequest(SystemApi.restart(), { + immediate: false + }); + + const restart = async () => { + await restartCommand().catch((error: Error) => { + toast.error(error.message); + }); + setRestarting(true); }; - return ( - { + if (file) { + console.log('going to upload file ', file.name); + await sendUpload(file).catch((error: Error) => { + if (error.message === 'The user aborted a request') { + toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED()); + } else if (error.message === 'Network Error') { + toast.warning('Invalid file extension or incompatible bin file'); + } else { + toast.error(error.message); } - })} - > - - - - {progressText()} - {uploading && ( - - - - + }); + } + }, [file]); + + return ( + <> + + {LL.UPLOAD()} + + + + {LL.UPLOAD_TEXT()} + + + {isUploading || restartNeeded ? ( + <> + + + + + {!restartNeeded && ( - - )} - - + )} + + ) : ( + + )} + + {md5 && ( + + {'MD5: ' + md5} + + )} + + {restartNeeded && ( + + + + )} + + {restarting && } + ); }; diff --git a/interface/src/components/upload/drag-drop.css b/interface/src/components/upload/drag-drop.css new file mode 100644 index 000000000..f239b9831 --- /dev/null +++ b/interface/src/components/upload/drag-drop.css @@ -0,0 +1,33 @@ +.document-uploader { + border: 2px dashed #4282fe; + background-color: #2e3339; + padding: 10px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: relative; + border-radius: 8px; + cursor: pointer; + + &.active { + border-color: #6dc24b; + } + + .upload-info { + display: flex; + align-items: center; + } + + .file-info { + display: flex; + flex-direction: column; + width: 100%; + justify-content: space-between; + align-items: center; + p { + font-size: 14px; + color: #6dc24b; + } + } +} diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index bf71daf0f..632b0cc3b 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -3,11 +3,12 @@ import type { FC } from 'react'; import { redirect } from 'react-router-dom'; import { toast } from 'react-toastify'; -import * as AuthenticationApi from 'api/authentication'; import { ACCESS_TOKEN } from 'api/endpoints'; -import { useRequest } from 'alova'; +import * as AuthenticationApi from 'components/routing/authentication'; +import { useRequest } from 'alova/client'; import { LoadingSpinner } from 'components'; +import { verifyAuthorization } from 'components/routing/authentication'; import { useI18nContext } from 'i18n/i18n-react'; import type { Me } from 'types'; import type { RequiredChildrenProps } from 'utils'; @@ -20,12 +21,9 @@ const Authentication: FC = ({ children }) => { const [initialized, setInitialized] = useState(false); const [me, setMe] = useState(); - const { send: verifyAuthorization } = useRequest( - AuthenticationApi.verifyAuthorization(), - { - immediate: false - } - ); + const { send: sendVerifyAuthorization } = useRequest(verifyAuthorization(), { + immediate: false + }); const signIn = (accessToken: string) => { try { @@ -43,7 +41,6 @@ const Authentication: FC = ({ children }) => { AuthenticationApi.clearAccessToken(); setMe(undefined); if (doRedirect) { - // navigate('/'); redirect('/'); } }; @@ -51,7 +48,7 @@ const Authentication: FC = ({ children }) => { const refresh = useCallback(async () => { const accessToken = AuthenticationApi.getStorage().getItem(ACCESS_TOKEN); if (accessToken) { - await verifyAuthorization() + await sendVerifyAuthorization() .then(() => { setMe(AuthenticationApi.decodeMeJWT(accessToken)); setInitialized(true); diff --git a/interface/src/api/env.ts b/interface/src/env.ts similarity index 100% rename from interface/src/api/env.ts rename to interface/src/env.ts diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 5a9d56469..b065d8824 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -94,8 +94,6 @@ const de: Translation = { APPLICATION: 'Anwendung', CUSTOMIZATIONS: 'Anpassungen', APPLICATION_RESTARTING: 'EMS-ESP startet neu', - INTERFACE_BOARD_PROFILE: 'Interface Platinenprofil', - BOARD_PROFILE_TEXT: 'Wählen Sie ein vorkonfiguriertes Platinenprofil aus der Liste unten aus oder wählen Sie "Custom", um Ihre eigenen Hardwareeinstellungen zu konfigurieren', BOARD_PROFILE: 'Platinenprofil', CUSTOM: 'Custom', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const de: Translation = { TEMPERATURE: 'Temperatur', PHY_TYPE: 'Eth PHY Typ', DISABLED: 'deaktiviert', - TX_MODE: 'Tx Modus', + TX_MODE: 'EMS Tx Modus', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Allgemeine Optionen', @@ -128,7 +126,7 @@ const de: Translation = { BOOLEAN_FORMAT_API: 'Boolesches Format API/MQTT', ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Parasitäre Stomversorgung', + ENABLE_PARASITE: '1-wire Parasitäre Stomversorgung', LOGGING: 'Protokollierung', LOG_HEX: 'EMS-Telegramme hexadezimal protokollieren', ENABLE_SYSLOG: 'Syslog aktivieren', @@ -169,7 +167,7 @@ const de: Translation = { SYSTEM: 'System', LOG_OF: '{0}protokoll', STATUS_OF: '{0} Status', - UPLOAD_DOWNLOAD: 'Hoch-/Herunterladen', + DOWNLOAD_UPLOAD: 'Herunterladen/Hochladen', VERSION_ON: 'Sie verwenden derzeit', CLOSE: 'Schließen', USE: 'Verwenden Sie', @@ -194,7 +192,6 @@ const de: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Herunterladen geplanter Befehle', DOWNLOAD_SETTINGS_TEXT: 'Herunterladen der Anwendungseinstellungen. Vorsicht beim Teilen der Einstellungen, da sie Passwörter und andere sensitive Einstellungen enthalten', UPLOAD_TEXT: 'Hochladen von neuer Firmware (.bin), Geräte- oder Entitätseinstellungen (.json), zur optionalen Validitätsprüfung zuerst die (.md5) Datei hochladen', - UPLOADING: 'Hochladen', UPLOAD_DROP_TEXT: 'Klicken Sie hier, oder ziehen eine Datei hierher', ERROR: 'Unerwarteter Fehler, bitter versuchen Sie es erneut', TIME_SET: 'Zeit gesetzt', @@ -325,7 +322,7 @@ const de: Translation = { SYSTEM_MEMORY: 'Systemspeicher', APPLICATION_SETTINGS_1: 'Ändern Sie die EMS-ESP-Anwendungseinstellungen', SECURITY_1: 'Benutzer hinzufügen oder entfernen', - UPLOAD_DOWNLOAD_1: 'Einstellungen und Firmware hochladen/herunterladen', + DOWNLOAD_UPLOAD_1: 'Einstellungen und Firmware herunterladen/hochladen', MODULES: 'Module', MODULES_1: 'Externe Module aktivieren oder deaktivieren', MODULES_UPDATED: 'Module aktualisiert', @@ -333,7 +330,10 @@ const de: Translation = { MODULES_NONE: 'Keine externen Module erkannt', RENAME: 'Umbenennen', ENABLE_MODBUS: 'Modbus aktivieren', - VIEW_LOG: 'Sehen Sie sich das Protokoll an, um Probleme zu diagnostizieren' + VIEW_LOG: 'Sehen Sie sich das Protokoll an, um Probleme zu diagnostizieren', + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index 60997c25e..2c57d1da8 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -94,8 +94,6 @@ const en: Translation = { APPLICATION: 'Application', CUSTOMIZATIONS: 'Customizations', APPLICATION_RESTARTING: 'EMS-ESP is restarting', - INTERFACE_BOARD_PROFILE: 'Interface Board Profile', - BOARD_PROFILE_TEXT: 'Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings', BOARD_PROFILE: 'Board Profile', CUSTOM: 'Custom', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const en: Translation = { TEMPERATURE: 'Temperature', PHY_TYPE: 'Eth PHY Type', DISABLED: 'disabled', - TX_MODE: 'Tx Mode', + TX_MODE: 'EMS Tx Mode', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'General Options', @@ -124,11 +122,11 @@ const en: Translation = { TRIGGER_TIME: 'Trigger Time', COLD_SHOT_DURATION: 'Cold Shot Duration', FORMATTING_OPTIONS: 'Formatting Options', - BOOLEAN_FORMAT_DASHBOARD: 'Boolean Format Dashboard', + BOOLEAN_FORMAT_DASHBOARD: 'Boolean Format Web', BOOLEAN_FORMAT_API: 'Boolean Format API/MQTT', ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Enable parasite power', + ENABLE_PARASITE: 'Enable 1-Wire Parasite-Power', LOGGING: 'Logging', LOG_HEX: 'Log EMS telegrams in hexadecimal', ENABLE_SYSLOG: 'Enable Syslog', @@ -169,7 +167,7 @@ const en: Translation = { SYSTEM: 'System', LOG_OF: '{0} Log', STATUS_OF: '{0} Status', - UPLOAD_DOWNLOAD: 'Upload/Download', + DOWNLOAD_UPLOAD: 'Download/Upload', VERSION_ON: 'You are currently on version', CLOSE: 'Close', USE: 'Use', @@ -194,7 +192,6 @@ const en: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', DOWNLOAD_SETTINGS_TEXT: 'Download the application settings. Be careful when sharing your settings as this file contains passwords and other sensitive system information', UPLOAD_TEXT: 'Upload a new firmware (.bin) file, settings or customizations (.json) file below, for optional validation upload (.md5) first', - UPLOADING: 'Uploading', UPLOAD_DROP_TEXT: 'Drop file or click here', ERROR: 'Unexpected Error, please try again', TIME_SET: 'Time set', @@ -252,9 +249,9 @@ const en: Translation = { TIME_ZONE: 'Time Zone', ACCESS_POINT: 'Access Point', AP_PROVIDE: 'Enable Access Point', - AP_PROVIDE_TEXT_1: 'always', - AP_PROVIDE_TEXT_2: 'when WiFi is disconnected', - AP_PROVIDE_TEXT_3: 'never', + AP_PROVIDE_TEXT_1: 'Always', + AP_PROVIDE_TEXT_2: 'When WiFi is disconnected', + AP_PROVIDE_TEXT_3: 'Never', AP_PREFERRED_CHANNEL: 'Preferred Channel', AP_HIDE_SSID: 'Hide SSID', AP_CLIENTS: 'AP Clients', @@ -325,7 +322,7 @@ const en: Translation = { SYSTEM_MEMORY: 'System Memory', APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', SECURITY_1: 'Add or remove users', - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', MODULES: 'Modules', MODULES_1: 'Activate or deactivate external modules', MODULES_UPDATED: 'Modules updated', @@ -333,7 +330,10 @@ const en: Translation = { MODULES_NONE: 'No external modules detected', RENAME: 'Rename', ENABLE_MODBUS: 'Enable Modbus', - VIEW_LOG: 'View log to diagnose issues' + VIEW_LOG: 'View log to diagnose issues', + UPLOAD_DRAG: 'drag and drop a file here or click to select one', + SERVICES: 'Services', + ALLVALUES: 'All Values' }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 9e348b904..f8eef75a9 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -94,8 +94,6 @@ const fr: Translation = { APPLICATION: "l'application", CUSTOMIZATIONS: 'Personnalisation', APPLICATION_RESTARTING: 'EMS-ESP redémarre', - INTERFACE_BOARD_PROFILE: "Profile de carte d'interface", - BOARD_PROFILE_TEXT: "Sélectionnez un profil de carte d'interface préconfiguré dans la liste ci-dessous ou choisissez Personnalisé pour configurer vos propres paramètres matériels", BOARD_PROFILE: 'Profil de carte', CUSTOM: 'Personnalisé', GPIO_OF: 'GPIO {0}', @@ -103,7 +101,7 @@ const fr: Translation = { TEMPERATURE: 'Température', PHY_TYPE: 'Eth PHY Type', DISABLED: 'désactivé', - TX_MODE: 'Tx Mode', + TX_MODE: 'EMS Tx Mode', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Options générales', @@ -128,7 +126,7 @@ const fr: Translation = { BOOLEAN_FORMAT_API: 'Format booléen API/MQTT', ENUM_FORMAT: 'Format enum API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Activer la puissance parasite', + ENABLE_PARASITE: 'Activer la puissance 1-wire parasite', LOGGING: 'Journal', LOG_HEX: 'Enregistrer les télégrammes EMS en hexadécimal', ENABLE_SYSLOG: 'Activer les logs système', @@ -169,7 +167,7 @@ const fr: Translation = { SYSTEM: 'Système', LOG_OF: '{0} Log', STATUS_OF: 'Statut {0}', - UPLOAD_DOWNLOAD: 'Upload/Download', + DOWNLOAD_UPLOAD: 'Download/Upload', // TODO translate VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Fermer', USE: 'Utiliser', @@ -194,7 +192,6 @@ const fr: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', // TODO translate DOWNLOAD_SETTINGS_TEXT: "Téléchargez les paramètres de l'application. Soyez prudent lorsque vous partagez vos paramètres car ce fichier contient des mots de passe et d'autres informations système sensibles.", UPLOAD_TEXT: "Téléchargez un nouveau fichier de firmware (.bin), un fichier de paramètres ou de personnalisations (.json) ci-dessous, pour une validation optionnelle téléchargez d'abord un fichier (.md5)", - UPLOADING: 'Téléchargement', UPLOAD_DROP_TEXT: 'Déposer le fichier ou cliquer ici', ERROR: 'Erreur inattendue, veuillez réessayer', TIME_SET: 'Time set', @@ -325,7 +322,7 @@ const fr: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Activer ou désactiver les modules externes', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const fr: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Activer Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default fr; diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index aa4480f29..d4cd4278a 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -94,8 +94,6 @@ const it: Translation = { APPLICATION: 'Applicazione', CUSTOMIZATIONS: 'Personalizzazione', APPLICATION_RESTARTING: 'EMS-ESP sta riavviando', - INTERFACE_BOARD_PROFILE: 'Profilo scheda di interfaccia', - BOARD_PROFILE_TEXT: 'Selezionare un profilo di interfaccia pre-configurato dalla lista sottostante o scegliere un profilo personalizzato per configurare le impostazioni del tuo hardware', BOARD_PROFILE: 'Profilo Scheda', CUSTOM: 'Personalizzazione', GPIO_OF: 'GPIO {0}', @@ -103,7 +101,7 @@ const it: Translation = { TEMPERATURE: 'Temperatura', PHY_TYPE: 'Eth PHY Type', DISABLED: 'disattivato', - TX_MODE: 'Modo Tx ', + TX_MODE: 'EMS Modo Tx ', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Opzioni Generali', @@ -128,7 +126,7 @@ const it: Translation = { BOOLEAN_FORMAT_API: 'Formato booleano API/MQTT', ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Indice', - ENABLE_PARASITE: 'Abilita potenza parassita', + ENABLE_PARASITE: 'Abilita potenza 1-wire parassita', LOGGING: 'Registrazione', LOG_HEX: 'Registra telegrammi EMS in esadecimale', ENABLE_SYSLOG: 'Abilita Syslog', @@ -169,7 +167,7 @@ const it: Translation = { SYSTEM: 'Sistema', LOG_OF: 'Registro {0}', STATUS_OF: 'Stato {0}', - UPLOAD_DOWNLOAD: 'Caricamento/Scaricamento', + DOWNLOAD_UPLOAD: 'Scaricamento/Caricamento', VERSION_ON: 'Attualmente stai eseguendo la versione', CLOSE: 'Chiudere', USE: 'Usa', @@ -194,7 +192,6 @@ const it: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', DOWNLOAD_SETTINGS_TEXT: 'Scarica le impostazioni dell applicazione. Fai attenzione quando condividi le tue impostazioni poiché questo file contiene password e altre informazioni di sistema riservate', UPLOAD_TEXT: 'Carica un nuovo file firmware (.bin) , file delle impostazioni o delle personalizzazioni (.json) di seguito, per un opzione di convalida scaricare dapprima un file "*.MD5" ', - UPLOADING: 'Caricamento', UPLOAD_DROP_TEXT: 'Trascina il file o clicca qui', ERROR: 'Errore Inaspettato, prego tenta ancora', TIME_SET: 'Imposta Ora', @@ -325,7 +322,7 @@ const it: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Attiva o disattiva i moduli esterni', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const it: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Abilita Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default it; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index dd0c85d2a..c857ced07 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -94,15 +94,13 @@ const nl: Translation = { APPLICATION: 'Applicatie', CUSTOMIZATIONS: 'Aanpassingen van entiteiten', APPLICATION_RESTARTING: 'EMS-ESP herstarten', - INTERFACE_BOARD_PROFILE: 'Interface Apparaatprofiel', - BOARD_PROFILE_TEXT: 'Selecteer een vooraf ingesteld apparaat profiel uit de lijst of kies Eigen om zelf uw hardware te configureren', BOARD_PROFILE: 'Apparaatprofiel', CUSTOM: 'Custom', GPIO_OF: '{0} GPIO', BUTTON: 'Toets', TEMPERATURE: 'Temperatuur', PHY_TYPE: 'Eth PHY Type', - TX_MODE: 'Tx Mode', + TX_MODE: 'EMS Tx Mode', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', DISABLED: 'Uitgeschakeld', @@ -124,11 +122,11 @@ const nl: Translation = { TRIGGER_TIME: 'Trigger tijd', COLD_SHOT_DURATION: 'Tijd Shot koud water', FORMATTING_OPTIONS: 'Formatteringsopties', - BOOLEAN_FORMAT_DASHBOARD: 'Boolean formaat dashboard', + BOOLEAN_FORMAT_DASHBOARD: 'Boolean formaat web', BOOLEAN_FORMAT_API: 'Boolean formaat API/MQTT', ENUM_FORMAT: 'Enum formaat API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Activeer parasitaire modus', + ENABLE_PARASITE: 'Activeer 1-wire parasitaire modus', LOGGING: 'Logging', LOG_HEX: 'Log EMS telegrammen in hexadecimaal', ENABLE_SYSLOG: 'Activeer Syslog', @@ -169,7 +167,7 @@ const nl: Translation = { SYSTEM: 'Systeem', LOG_OF: '{0} Log', STATUS_OF: '{0} Status', - UPLOAD_DOWNLOAD: 'Upload/Download', + DOWNLOAD_UPLOAD: 'Download/Upload', VERSION_ON: 'U bevindt zich momenteel op versie', CLOSE: 'Sluiten', USE: 'Gebruik', @@ -194,7 +192,6 @@ const nl: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', DOWNLOAD_SETTINGS_TEXT: 'Download de applicatie settings. Wees voorzichting met het delen van dit bestand want het bevat o.a. de wachtwoorden in plain text', UPLOAD_TEXT: 'Upload een nieuwe firmware (.bin) file, instellingen of custom instellingen (.json) bestand hieronder', - UPLOADING: 'Uploading', UPLOAD_DROP_TEXT: 'Sleep bestand hierheen of klik hier', ERROR: 'Onverwachte fout, probeer opnieuw', TIME_SET: 'Tijd ingesteld', @@ -325,7 +322,7 @@ const nl: Translation = { SYSTEM_MEMORY: 'System Geheugen', APPLICATION_SETTINGS_1: 'Applicatie-instellingen wijzigen', SECURITY_1: 'Gebruikers toevoegen of verwijderen', - UPLOAD_DOWNLOAD_1: 'Upload-/downloadinstellingen en firmware', + DOWNLOAD_UPLOAD_1: 'Download en upload instellingen en firmware', MODULES: 'Module', MODULES_1: 'Externe modules activeren of deactiveren', // TODO translate MODULES_UPDATED: 'Modules geüpdatet', @@ -333,7 +330,10 @@ const nl: Translation = { MODULES_NONE: 'Geen externe modules gedetecteerd', RENAME: 'Hernoemen', ENABLE_MODBUS: 'Activeer Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default nl; diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index e5da9a714..434e3e485 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -94,8 +94,6 @@ const no: Translation = { APPLICATION: 'Søknad', CUSTOMIZATIONS: 'Tilpasninger', APPLICATION_RESTARTING: 'EMS-ESP restarter', - INTERFACE_BOARD_PROFILE: 'Interface Prosessor Profil', - BOARD_PROFILE_TEXT: 'Velg en pre-konfigurert prosessor profil fra listen under eller velg Tilpasset for å konfigurere dine egne innstillinger', BOARD_PROFILE: 'Prosessor Profil', CUSTOM: 'Custom', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const no: Translation = { TEMPERATURE: 'Temperatur', PHY_TYPE: 'Eth PHY Type', DISABLED: 'avslått', - TX_MODE: 'Tx Mode', + TX_MODE: 'EMS Tx Mode', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Generelle Innstillinger', @@ -124,11 +122,11 @@ const no: Translation = { TRIGGER_TIME: 'Aktiveringstid', COLD_SHOT_DURATION: 'Tid på kaldt vann', FORMATTING_OPTIONS: 'Formatteringsalternativs', - BOOLEAN_FORMAT_DASHBOARD: 'Bool Format Dashboard', + BOOLEAN_FORMAT_DASHBOARD: 'Bool Format Web', BOOLEAN_FORMAT_API: 'Bool Format API/MQTT', ENUM_FORMAT: 'Enum Format API/MQTT', INDEX: 'Indeks', - ENABLE_PARASITE: 'Aktiver parasitt strømforsyning', + ENABLE_PARASITE: 'Aktiver 1-wire parasitt strømforsyning', LOGGING: 'Logging', LOG_HEX: 'Logg EMS telegrammer i hexadesimal', ENABLE_SYSLOG: 'Aktiver Syslog', @@ -169,7 +167,7 @@ const no: Translation = { SYSTEM: 'System', LOG_OF: '{0} Logg', STATUS_OF: '{0} Status', - UPLOAD_DOWNLOAD: 'Opp/Nedlasting', + DOWNLOAD_UPLOAD: 'Nedlasting/Opp', VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Steng', USE: 'Bruk', @@ -194,7 +192,6 @@ const no: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Last ned planlagte oppgaver', DOWNLOAD_SETTINGS_TEXT: 'Last ned applikasjonskonfigurasjon. Vær varsom med å dele fila da den inneholder passord og annen sensitiv system informasjon', UPLOAD_TEXT: 'Last opp en ny firmware (.bin) fil, innstillinger eller tilpassninger (.json) fil nedenfor', - UPLOADING: 'Opplasting', UPLOAD_DROP_TEXT: 'Slipp fil eller klikk her', ERROR: 'Ukjent feil, prøv igjen', TIME_SET: 'Still in tid', @@ -325,7 +322,7 @@ const no: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Aktiver eller deaktiver eksterne moduler', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const no: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Aktiver Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index f63a093d8..fb4b2ff74 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -94,8 +94,6 @@ const pl: BaseTranslation = { APPLICATION: 'Aplikacji', CUSTOMIZATIONS: 'Personalizacja', APPLICATION_RESTARTING: 'Trwa ponowne uruchamianie', - INTERFACE_BOARD_PROFILE: 'Profil płytki interfejsu', - BOARD_PROFILE_TEXT: 'Wybierz z listy gotowy profil płytki interfejsu lub "własny..." i samodzielnie skonfiguruj posiadany sprzęt.', BOARD_PROFILE: 'Profil płytki', CUSTOM: 'własny', GPIO_OF: 'GPIO {0}', @@ -103,7 +101,7 @@ const pl: BaseTranslation = { TEMPERATURE: '1-Wire®', PHY_TYPE: 'Typ układu ethernetowego (PHY)', DISABLED: '{{wyłączono|brak|}}', - TX_MODE: 'Tryb transmisji (Tx)', + TX_MODE: 'EMS Tryb transmisji (Tx)', EMS_BUS: '{{magistrali EMS|na magistrali|}}', HARDWARE: 'sprzętowy', GENERAL_OPTIONS: 'Opcje podstawowe', @@ -128,7 +126,7 @@ const pl: BaseTranslation = { BOOLEAN_FORMAT_API: 'Wartości dwustanowe w API/MQTT', ENUM_FORMAT: 'Wartości z listy w API/MQTT', INDEX: 'indeks', - ENABLE_PARASITE: 'Aktywuj zasilanie pasożytnicze', + ENABLE_PARASITE: 'Aktywuj zasilanie 1-wire pasożytnicze', LOGGING: 'Logowanie', LOG_HEX: 'Loguj telegramy EMS w systemie szesnastkowym (hex)', ENABLE_SYSLOG: 'Aktywuj SysLog', @@ -169,7 +167,7 @@ const pl: BaseTranslation = { SYSTEM: '{{S|s||s}}yste{{m|mu||mowy}}', LOG_OF: 'Log {0}', STATUS_OF: 'Status {0}', - UPLOAD_DOWNLOAD: 'Przesyłanie plików', + DOWNLOAD_UPLOAD: 'Plików przesyłanie', VERSION_ON: 'Aktualnie używasz', CLOSE: 'Zamknij', USE: 'Aby zaktualizować firmware skorzystaj z funkcji', @@ -194,7 +192,6 @@ const pl: BaseTranslation = { DOWNLOAD_SCHEDULE_TEXT: 'Pobierz harmonogram zdarzeń.', DOWNLOAD_SETTINGS_TEXT: 'Pobierz ustawienia aplikacji. Uwaga! Plik z ustawieniami zawiera hasła oraz inne wrażliwe informacje systemowe! Nie udostepniaj go pochopnie!', UPLOAD_TEXT: 'Wyślij firmware (.bin), ustawienia lub personalizacje (.json). Opcjonalnie, wyślij wcześniej plik walidacji z sumą kontrolną (.md5).', - UPLOADING: 'Wysłano', UPLOAD_DROP_TEXT: 'Przeciągnij tutaj plik lub kliknij', ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!', TIME_SET: 'Zegar został ustawiony.', @@ -325,7 +322,7 @@ const pl: BaseTranslation = { SYSTEM_MEMORY: 'Pamięć systemowa', APPLICATION_SETTINGS_1: 'Modyfikacja ustawień aplikacji EMS-ESP', SECURITY_1: 'Dodawanie i usuwanie użytkowników', - UPLOAD_DOWNLOAD_1: 'Wysyłanie/pobieranie ustawień i firmware', + DOWNLOAD_UPLOAD_1: 'Pobieranie/wysyłanie ustawień i firmware', MODULES: 'Module', // TODO translate MODULES_1: 'Aktywuj lub dezaktywuj moduły zewnętrzne', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const pl: BaseTranslation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Aktywuj Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default pl; diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 53ae6522a..fe1addab5 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -94,8 +94,6 @@ const sk: Translation = { APPLICATION: 'Aplikácie', CUSTOMIZATIONS: 'Prispôsobenia', APPLICATION_RESTARTING: 'EMS-ESP sa reštartuje', - INTERFACE_BOARD_PROFILE: 'Profil dosky rozhrania', - BOARD_PROFILE_TEXT: 'Vyberte vopred nakonfigurovaný profil dosky rozhrania zo zoznamu nižšie, alebo vyberte možnosť Vlastné a nakonfigurujte svoje vlastné hardvérové nastavenia', BOARD_PROFILE: 'Profil dosky', CUSTOM: 'Vlastné', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const sk: Translation = { TEMPERATURE: 'Teplota', PHY_TYPE: 'Eth PHY Typ', DISABLED: 'zakázané', - TX_MODE: 'Tx režim', + TX_MODE: 'EMS Tx režim', HARDWARE: 'Hardware', EMS_BUS: '{{BUS|EMS BUS}}', GENERAL_OPTIONS: 'Všeobecné možnosti', @@ -124,11 +122,11 @@ const sk: Translation = { TRIGGER_TIME: 'Čas spustenia', COLD_SHOT_DURATION: 'Trvanie studeného záberu', FORMATTING_OPTIONS: 'Možnosti formátovania', - BOOLEAN_FORMAT_DASHBOARD: 'Panel Boolean formát', + BOOLEAN_FORMAT_DASHBOARD: 'Web panel Boolean formát', BOOLEAN_FORMAT_API: 'Boolean formát API/MQTT', ENUM_FORMAT: 'Enum formát API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Povoliť parazité napájanie DS18B20', + ENABLE_PARASITE: 'Povoliť 1-wire parazité napájanie DS18B20', LOGGING: 'Logovanie', LOG_HEX: 'Záznam telegramov EMS v hexadecimálnej sústave', ENABLE_SYSLOG: 'Povoliť Syslog', @@ -169,7 +167,7 @@ const sk: Translation = { SYSTEM: 'Systém', LOG_OF: '{0} Log', STATUS_OF: '{0} Stav', - UPLOAD_DOWNLOAD: 'Nahrať/Stiahnuť', + DOWNLOAD_UPLOAD: 'Stiahnuť/Nahrať', VERSION_ON: 'Momentálne nainštalovaná verzia: ', CLOSE: 'Zatvoriť', USE: 'Použiť', @@ -194,7 +192,6 @@ const sk: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Stiahnutie plánovača udalostí', DOWNLOAD_SETTINGS_TEXT: 'Stiahnite si nastavenia aplikácie. Pri zdieľaní nastavení buďte opatrní, pretože tento súbor obsahuje heslá a iné citlivé systémové informácie.', UPLOAD_TEXT: 'Najskôr nahrajte nový súbor firmvéru (.bin), nastavenia alebo prispôsobenia (.json), pre voliteľné overenie nahrajte súbor (.md5)', - UPLOADING: 'Nahrávanie', UPLOAD_DROP_TEXT: 'Potiahnúť a pripnúť súbor alebo kliknúť sem', ERROR: 'Neočakávaná chyba, prosím skúste to znova', TIME_SET: 'Nastavený čas', @@ -325,7 +322,7 @@ const sk: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Aktivujte alebo deaktivujte externé moduly', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const sk: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Povoliť Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default sk; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index dcc51c9f8..754a61d4f 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -94,8 +94,6 @@ const sv: Translation = { APPLICATION: 'Apliká', CUSTOMIZATIONS: 'Anpassningr', APPLICATION_RESTARTING: 'EMS-ESP startar om', - INTERFACE_BOARD_PROFILE: 'Interface Hårdvaruprofil', - BOARD_PROFILE_TEXT: 'Välj en förkonfigurerad hårdvaruprofil från listan nedan eller välj Anpassad för att konfigurera dina egna hårdvaruinställningar', BOARD_PROFILE: 'Hårdvarutyp', CUSTOM: 'Anpassa', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const sv: Translation = { TEMPERATURE: 'Temperatur', PHY_TYPE: 'Eth PHY-typ', DISABLED: 'inaktiverad', - TX_MODE: 'Tx-läge', + TX_MODE: 'EMS Tx-läge', HARDWARE: 'Hårdvara', EMS_BUS: '{{BUSS|EMS-BUSS}}', GENERAL_OPTIONS: 'Allmänna Inställningar', @@ -128,7 +126,7 @@ const sv: Translation = { BOOLEAN_FORMAT_API: 'Bool-format API/MQTT', ENUM_FORMAT: 'Enum-format API/MQTT', INDEX: 'Index', - ENABLE_PARASITE: 'Aktivera parasitström', + ENABLE_PARASITE: 'Aktivera 1-wire parasitström', LOGGING: 'Loggning', LOG_HEX: 'Logga EMS-telegram i hexadecimal', ENABLE_SYSLOG: 'Aktivera Syslog', @@ -169,7 +167,7 @@ const sv: Translation = { SYSTEM: 'System', LOG_OF: '{0} Logg', STATUS_OF: '{0} Status', - UPLOAD_DOWNLOAD: 'Upp/Nedladdning', + DOWNLOAD_UPLOAD: 'Nedladdning/Upp', VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Stäng', USE: 'Använd', @@ -194,7 +192,6 @@ const sv: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', // TODO translate DOWNLOAD_SETTINGS_TEXT: 'Ladda ner applikationsinställningar. Var försiktig om du delar dina iställlningar då de innehåller lösenord och annan känslig systeminformation', UPLOAD_TEXT: 'Ladda upp ett nytt firmware (.bin), inställningar eller anpassningar (.json) nedan', - UPLOADING: 'Laddar upp', UPLOAD_DROP_TEXT: 'Släpp fil eller klicka här', ERROR: 'Okänt Fel, var god försök igen', TIME_SET: 'Ställ in tid', @@ -325,7 +322,7 @@ const sv: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Aktivera eller avaktivera externa moduler', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const sv: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Aktivera Modbus', - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index bfe20c3d9..f0bc997b2 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -94,8 +94,6 @@ const tr: Translation = { APPLICATION: 'Uygulama', CUSTOMIZATIONS: 'Özelleştirme', APPLICATION_RESTARTING: 'EMS-ESP yeniden başlatılıyor', - INTERFACE_BOARD_PROFILE: 'Arabirim Kart Profili', - BOARD_PROFILE_TEXT: 'Aşağıdan hazır kart profillerinden birini seçin yada kendi donanımınızı ayarlamak için Özeli tercih edin', BOARD_PROFILE: 'Kart Profili', CUSTOM: 'Özel', GPIO_OF: '{0} GPIO', @@ -103,7 +101,7 @@ const tr: Translation = { TEMPERATURE: 'Sıcaklık', PHY_TYPE: 'Eth PHY Tipi', DISABLED: 'devre dışı', - TX_MODE: 'Tx Modu', + TX_MODE: 'EMS Tx Modu', HARDWARE: 'Donanım', EMS_BUS: '{{HAT|EMS HATTI}}', GENERAL_OPTIONS: 'Genel Seçenekler', @@ -128,7 +126,7 @@ const tr: Translation = { BOOLEAN_FORMAT_API: 'Boolean Biçimleme API/MQTT', ENUM_FORMAT: 'Enum Biçimleme API/MQTT', INDEX: 'İndeks', - ENABLE_PARASITE: 'Parazit gücü devreye al', + ENABLE_PARASITE: '1-wire parazit gücü devreye al', LOGGING: 'Kayıt ediliyor', LOG_HEX: 'EMS telegramlarını hexadecimal olarak kayıt et', ENABLE_SYSLOG: 'Sistem Kaydını Devreye Al', @@ -169,7 +167,7 @@ const tr: Translation = { SYSTEM: 'Sistem', LOG_OF: '{0} Kaydı', STATUS_OF: '{0} Durumu', - UPLOAD_DOWNLOAD: 'Yükleme/İndirme', + DOWNLOAD_UPLOAD: 'İndirme/Yükleme', VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Kapat', USE: 'KUllan', @@ -194,7 +192,6 @@ const tr: Translation = { DOWNLOAD_SCHEDULE_TEXT: 'Download Scheduler Events', // TODO translate DOWNLOAD_SETTINGS_TEXT: 'Uygulama ayarlarını indir. Bu dosya hassas sistem bilgileri ve şifrelerinizi içerdiğinden ayarlarınızı paylaşırken dikkatli olun', UPLOAD_TEXT: 'Yeni bir bellenim(.bin) dosyası yükleyin, ayarlar ve özelleştirmeler(.json) dosyası aşağıda, sçenekli denetim yüklemesi(.md5) için önce', - UPLOADING: 'Yüklüyor', UPLOAD_DROP_TEXT: 'Buraya tıklayın yada dosyayı sürükleyip bırakın', ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.', TIME_SET: 'Zaman ayarı', @@ -325,7 +322,7 @@ const tr: Translation = { SYSTEM_MEMORY: 'System Memory', // TODO translate APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate SECURITY_1: 'Add or remove users', // TODO translate - UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate MODULES: 'Module', // TODO translate MODULES_1: 'Harici modülleri etkinleştirin veya devre dışı bırakın', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate @@ -333,7 +330,10 @@ const tr: Translation = { MODULES_NONE: 'No external modules detected', // TODO translate RENAME: 'Rename', // TODO translate ENABLE_MODBUS: 'Enable Modbus', // TODO translate - VIEW_LOG: 'View log to diagnose issues' // TODO translate + VIEW_LOG: 'View log to diagnose issues', // TODO translate + UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate + SERVICES: 'Services', // TODO translate + ALLVALUES: 'All Values' // TODO translate }; export default tr; diff --git a/interface/src/utils/useRest.ts b/interface/src/utils/useRest.ts index 539b8f007..02e42dc40 100644 --- a/interface/src/utils/useRest.ts +++ b/interface/src/utils/useRest.ts @@ -2,51 +2,42 @@ import { useState } from 'react'; import { useBlocker } from 'react-router-dom'; import { toast } from 'react-toastify'; -import { type Method, useRequest } from 'alova'; +import type { AlovaGenerics, Method } from 'alova'; +import { useRequest } from 'alova/client'; import { useI18nContext } from 'i18n/i18n-react'; export interface RestRequestOptions { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - read: () => Method; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - update: (value: D) => Method; + read: () => Method; + update: (value: D) => Method; } export const useRest = ({ read, update }: RestRequestOptions) => { const { LL } = useI18nContext(); - const [errorMessage, setErrorMessage] = useState(); const [restartNeeded, setRestartNeeded] = useState(false); const [origData, setOrigData] = useState(); - const [dirtyFlags, setDirtyFlags] = useState([]); const blocker = useBlocker(dirtyFlags.length !== 0); const { data, send: readData, - update: updateData, - onComplete: onReadComplete - } = useRequest(read()); + update: updateData + } = useRequest(read()).onComplete((event) => { + setOrigData(event.data as D); + }); - const { - loading: saving, - send: writeData, - onSuccess: onWriteSuccess - } = useRequest((newData: D) => update(newData), { immediate: false }); - - const updateDataValue = (new_data: D) => { - updateData({ data: new_data }); - }; - - onWriteSuccess(() => { + const { loading: saving, send: writeData } = useRequest( + (newData: D) => update(newData), + { immediate: false } + ).onSuccess(() => { toast.success(LL.UPDATED_OF(LL.SETTINGS(1))); setDirtyFlags([]); }); - onReadComplete((event) => { - setOrigData(event.data as D); - }); + const updateDataValue = (new_data: D) => { + updateData({ data: new_data }); + }; const loadData = async () => { setDirtyFlags([]); @@ -74,7 +65,6 @@ export const useRest = ({ read, update }: RestRequestOptions) => { } }); }; - return { loadData, saveData, diff --git a/interface/src/validators/shared.ts b/interface/src/validators/shared.ts index 4c9d5c23b..b297f30a9 100644 --- a/interface/src/validators/shared.ts +++ b/interface/src/validators/shared.ts @@ -12,7 +12,7 @@ export const validate = ( options ? options : {}, (errors, fieldErrors) => { if (errors) { - reject(fieldErrors); + reject(fieldErrors as Error); } else { resolve(source as T); } diff --git a/interface/vite.config.ts b/interface/vite.config.ts index e6af6f13b..faf902d63 100644 --- a/interface/vite.config.ts +++ b/interface/vite.config.ts @@ -4,11 +4,13 @@ import { defineConfig } from 'vite'; import viteImagemin from 'vite-plugin-imagemin'; import viteTsconfigPaths from 'vite-tsconfig-paths'; +import mockServer from '../mock-api/mockServer.js'; + export default defineConfig(({ command, mode }) => { if (command === 'serve') { console.log('Preparing for standalone build with server, mode=' + mode); return { - plugins: [preact(), viteTsconfigPaths()], + plugins: [preact(), viteTsconfigPaths(), mockServer()], server: { open: true, port: mode == 'production' ? 4173 : 3000, @@ -18,12 +20,6 @@ export default defineConfig(({ command, mode }) => { changeOrigin: true, secure: false }, - '/es': { - target: 'http://localhost:3081', - changeOrigin: true, - secure: false - }, - '/rest/uploadFile': 'http://localhost:3082', // this must come first to work! '/rest': 'http://localhost:3080' } } diff --git a/interface/yarn.lock b/interface/yarn.lock index 3af1b5415..f72df1585 100644 --- a/interface/yarn.lock +++ b/interface/yarn.lock @@ -5,17 +5,21 @@ __metadata: version: 8 cacheKey: 10c0 -"@alova/adapter-xhr@npm:^1.0.6": - version: 1.0.6 - resolution: "@alova/adapter-xhr@npm:1.0.6" - checksum: 10c0/1cd4f2da4f1c58865e14999d9cf367635f72f8e6bd41497366c25681154ffc7a4dedd70f234610c5e028c01418992dab709c777d986a6432d7d9783beeeb150e +"@alova/adapter-xhr@npm:2.0.4": + version: 2.0.4 + resolution: "@alova/adapter-xhr@npm:2.0.4" + dependencies: + "@alova/shared": "npm:^1.0.4" + peerDependencies: + alova: ^3.0.5 + checksum: 10c0/c68f51b83c75844cf2cddc47d6e08fa7a6f0af83cc6213b60d0d8ac32988f8e7b44f321b1f926fa282a2cda02757ce3cbfe94e86f140fd025ab22f0dfee9bed9 languageName: node linkType: hard -"@alova/scene-react@npm:^1.6.2": - version: 1.6.2 - resolution: "@alova/scene-react@npm:1.6.2" - checksum: 10c0/dac01605df824e66dba92c5d7073e33f98ad47367a7180bd0ddc78c01f1e672ac665c1ff0445df7299be1426ca92e325cf0b9fa459984125d6391e9e9eb9d439 +"@alova/shared@npm:^1.0.4": + version: 1.0.4 + resolution: "@alova/shared@npm:1.0.4" + checksum: 10c0/308b3163ee81fe98bb8372bd8a7df2a053be508167c86c6cfa2b3610c79389621e9a3466c391210e3f058799733465cf7dd153fcae536b03ea58dabff9d6eab4 languageName: node linkType: hard @@ -29,17 +33,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" - dependencies: - "@babel/highlight": "npm:^7.24.2" - picocolors: "npm:^1.0.0" - checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.24.7": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" dependencies: @@ -49,13 +43,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.24.4 - resolution: "@babel/compat-data@npm:7.24.4" - checksum: 10c0/9cd8a9cd28a5ca6db5d0e27417d609f95a8762b655e8c9c97fd2de08997043ae99f0139007083c5e607601c6122e8432c85fe391731b19bf26ad458fa0c60dd3 - languageName: node - linkType: hard - "@babel/compat-data@npm:^7.25.2": version: 7.25.2 resolution: "@babel/compat-data@npm:7.25.2" @@ -63,30 +50,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.22.1": - version: 7.24.5 - resolution: "@babel/core@npm:7.24.5" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.5" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.24.5" - "@babel/helpers": "npm:^7.24.5" - "@babel/parser": "npm:^7.24.5" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e26ba810a77bc8e21579a12fc36c79a0a60554404dc9447f2d64eb1f26d181c48d3b97d39d9f158e9911ec7162a8280acfaf2b4b210e975f0dd4bd4dbb1ee159 - languageName: node - linkType: hard - -"@babel/core@npm:^7.25.2": +"@babel/core@npm:^7.22.1, @babel/core@npm:^7.25.2": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -120,31 +84,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/generator@npm:7.24.5" - dependencies: - "@babel/types": "npm:^7.24.5" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/0d64f880150e7dfb92ceff2b4ac865f36aa1e295120920246492ffd0146562dabf79ba8699af1c8833f8a7954818d4d146b7b02f808df4d6024fb99f98b2f78d - languageName: node - linkType: hard - -"@babel/generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/generator@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10c0/06b1f3350baf527a3309e50ffd7065f7aee04dd06e1e7db794ddfde7fe9d81f28df64edd587173f8f9295496a7ddb74b9a185d4bf4de7bb619e6d4ec45c8fd35 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.0": +"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.25.0": version: 7.25.0 resolution: "@babel/generator@npm:7.25.0" dependencies: @@ -156,25 +96,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" +"@babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" - dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa + "@babel/types": "npm:^7.24.7" + checksum: 10c0/4679f7df4dffd5b3e26083ae65228116c3da34c3fff2c11ae11b259a61baec440f51e30fd236f7a0435b9d471acd93d0bc5a95df8213cbf02b1e083503d81b9a languageName: node linkType: hard @@ -192,13 +119,6 @@ __metadata: linkType: hard "@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-environment-visitor@npm:7.24.7" dependencies: @@ -208,16 +128,6 @@ __metadata: linkType: hard "@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" - dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-function-name@npm:7.24.7" dependencies: @@ -228,15 +138,6 @@ __metadata: linkType: hard "@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-hoist-variables@npm:7.24.7" dependencies: @@ -245,16 +146,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.3": - version: 7.24.3 - resolution: "@babel/helper-module-imports@npm:7.24.3" - dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.24.7": +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-module-imports@npm:7.24.7" dependencies: @@ -264,21 +156,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-module-transforms@npm:7.24.5" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.24.3" - "@babel/helper-simple-access": "npm:^7.24.5" - "@babel/helper-split-export-declaration": "npm:^7.24.5" - "@babel/helper-validator-identifier": "npm:^7.24.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/6e77d72f62b7e87abaea800ea0bccd4d54cde26485750969f5f493c032eb63251eb50c3522cace557781565d51c1d0c4bcc866407d24becfb109c18fb92c978d - languageName: node - linkType: hard - "@babel/helper-module-transforms@npm:^7.25.2": version: 7.25.2 resolution: "@babel/helper-module-transforms@npm:7.25.2" @@ -293,19 +170,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0": - version: 7.24.5 - resolution: "@babel/helper-plugin-utils@npm:7.24.5" - checksum: 10c0/4ae40094e6a2f183281213344f4df60c66b16b19a2bc38d2bb11810a6dc0a0e7ec638957d0e433ff8b615775b8f3cd1b7edbf59440d1b50e73c389fc22913377 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-simple-access@npm:7.24.5" - dependencies: - "@babel/types": "npm:^7.24.5" - checksum: 10c0/d96a0ab790a400f6c2dcbd9457b9ca74b9ba6d0f67ff9cd5bcc73792c8fbbd0847322a0dddbd8987dd98610ee1637c680938c7d83d3ffce7d06d7519d823d996 +"@babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-plugin-utils@npm:7.24.8" + checksum: 10c0/0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d languageName: node linkType: hard @@ -319,16 +187,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6, @babel/helper-split-export-declaration@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-split-export-declaration@npm:7.24.5" - dependencies: - "@babel/types": "npm:^7.24.5" - checksum: 10c0/d7a812d67d031a348f3fb0e6263ce2dbe6038f81536ba7fb16db385383bcd6542b71833194303bf6d3d0e4f7b6b584c9c8fae8772122e2ce68fc9bdf07f4135d - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.24.7": +"@babel/helper-split-export-declaration@npm:^7.22.6": version: 7.24.7 resolution: "@babel/helper-split-export-declaration@npm:7.24.7" dependencies: @@ -337,20 +196,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helper-string-parser@npm:7.24.1" - checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-string-parser@npm:7.24.7" - checksum: 10c0/47840c7004e735f3dc93939c77b099bb41a64bf3dda0cae62f60e6f74a5ff80b63e9b7cf77b5ec25a324516381fc994e1f62f922533236a8e3a6af57decb5e1e - languageName: node - linkType: hard - "@babel/helper-string-parser@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-string-parser@npm:7.24.8" @@ -358,27 +203,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-validator-identifier@npm:7.24.5" - checksum: 10c0/05f957229d89ce95a137d04e27f7d0680d84ae48b6ad830e399db0779341f7d30290f863a93351b4b3bde2166737f73a286ea42856bb07c8ddaa95600d38645c - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.7": +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-identifier@npm:7.24.7" checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 - languageName: node - linkType: hard - "@babel/helper-validator-option@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-validator-option@npm:7.24.8" @@ -386,17 +217,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helpers@npm:7.24.5" - dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" - checksum: 10c0/0630b0223c3a9a34027ddc05b3bac54d68d5957f84e92d2d4814b00448a76e12f9188f9c85cfce2011696d82a8ffcbd8189da097c0af0181d32eb27eca34185e - languageName: node - linkType: hard - "@babel/helpers@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helpers@npm:7.25.0" @@ -407,18 +227,6 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.24.2": - version: 7.24.5 - resolution: "@babel/highlight@npm:7.24.5" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.5" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/e98047d3ad24608bfa596d000c861a2cc875af897427f2833b91a4e0d4cead07301a7ec15fa26093dcd61e036e2eed2db338ae54f93016fe0dc785fadc4159db - languageName: node - linkType: hard - "@babel/highlight@npm:^7.24.7": version: 7.24.7 resolution: "@babel/highlight@npm:7.24.7" @@ -431,25 +239,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/parser@npm:7.24.5" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/8333a6ad5328bad34fa0e12bcee147c3345ea9a438c0909e7c68c6cfbea43c464834ffd7eabd1cbc1c62df0a558e22ffade9f5b29440833ba7b33d96a71f88c0 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/parser@npm:7.24.7" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/8b244756872185a1c6f14b979b3535e682ff08cb5a2a5fd97cc36c017c7ef431ba76439e95e419d43000c5b07720495b00cf29a7f0d9a483643d08802b58819b - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": version: 7.25.3 resolution: "@babel/parser@npm:7.25.3" dependencies: @@ -460,75 +250,53 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" +"@babel/plugin-syntax-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-plugin-utils": "npm:^7.24.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a + checksum: 10c0/f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51 languageName: node linkType: hard "@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" + "@babel/plugin-transform-react-jsx": "npm:^7.24.7" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2 + checksum: 10c0/fce647db50f90a5291681f0f97865d9dc76981262dff71d6d0332e724b85343de5860c26f9e9a79e448d61e1d70916b07ce91e8c7f2b80dceb4b16aee41794d8 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.23.4 - resolution: "@babel/plugin-transform-react-jsx@npm:7.23.4" +"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.24.7": + version: 7.25.2 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.23.3" - "@babel/types": "npm:^7.23.4" + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/plugin-syntax-jsx": "npm:^7.24.7" + "@babel/types": "npm:^7.25.2" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8851b3adc515cd91bdb06ff3a23a0f81f0069cfef79dfb3fa744da4b7a82e3555ccb6324c4fa71ecf22508db13b9ff6a0ed96675f95fc87903b9fc6afb699580 + checksum: 10c0/8c5b515f38118471197605e02bea54a8a4283010e3c55bad8cfb78de59ad63612b14d40baca63689afdc9d57b147aac4c7794fe5f7736c9e1ed6dd38784be624 languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7": - version: 7.24.5 - resolution: "@babel/runtime@npm:7.24.5" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.25.0 + resolution: "@babel/runtime@npm:7.25.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/05730e43e8ba6550eae9fd4fb5e7d9d3cb91140379425abcb2a1ff9cebad518a280d82c4c4b0f57ada26a863106ac54a748d90c775790c0e2cd0ddd85ccdf346 + checksum: 10c0/bd3faf246170826cef2071a94d7b47b49d532351360ecd17722d03f6713fd93a3eb3dbd9518faa778d5e8ccad7392a7a604e56bd37aaad3f3aa68d619ccd983d languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" - dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 - languageName: node - linkType: hard - -"@babel/template@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/template@npm:7.24.7" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10c0/95b0b3ee80fcef685b7f4426f5713a855ea2cd5ac4da829b213f8fb5afe48a2a14683c2ea04d446dbc7f711c33c5cd4a965ef34dcbe5bc387c9e966b67877ae3 - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.0": +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": version: 7.25.0 resolution: "@babel/template@npm:7.25.0" dependencies: @@ -557,43 +325,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/traverse@npm:7.24.5" - dependencies: - "@babel/code-frame": "npm:^7.24.2" - "@babel/generator": "npm:^7.24.5" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.24.5" - "@babel/parser": "npm:^7.24.5" - "@babel/types": "npm:^7.24.5" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/3f22534bc2b2ed9208e55ef48af3b32939032b23cb9dc4037447cb108640df70bbb0b9fea86e9c58648949fdc2cb14e89aa79ffa3c62a5dd43459a52fe8c01d1 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/traverse@npm:7.24.7" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/a5135e589c3f1972b8877805f50a084a04865ccb1d68e5e1f3b94a8841b3485da4142e33413d8fd76bc0e6444531d3adf1f59f359c11ffac452b743d835068ab - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.2": +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": version: 7.25.3 resolution: "@babel/traverse@npm:7.25.3" dependencies: @@ -618,29 +350,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.5, @babel/types@npm:^7.8.3": - version: 7.24.5 - resolution: "@babel/types@npm:7.24.5" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.1" - "@babel/helper-validator-identifier": "npm:^7.24.5" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/e1284eb046c5e0451b80220d1200e2327e0a8544a2fe45bb62c952e5fdef7099c603d2336b17b6eac3cc046b7a69bfbce67fe56e1c0ea48cd37c65cb88638f2a - languageName: node - linkType: hard - -"@babel/types@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/types@npm:7.24.7" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/d9ecbfc3eb2b05fb1e6eeea546836ac30d990f395ef3fe3f75ced777a222c3cfc4489492f72e0ce3d9a5a28860a1ce5f81e66b88cf5088909068b3ff4fab72c1 - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2": version: 7.25.2 resolution: "@babel/types@npm:7.25.2" dependencies: @@ -670,29 +380,16 @@ __metadata: languageName: node linkType: hard -"@emotion/cache@npm:^11.11.0": - version: 11.11.0 - resolution: "@emotion/cache@npm:11.11.0" - dependencies: - "@emotion/memoize": "npm:^0.8.1" - "@emotion/sheet": "npm:^1.2.2" - "@emotion/utils": "npm:^1.2.1" - "@emotion/weak-memoize": "npm:^0.3.1" - stylis: "npm:4.2.0" - checksum: 10c0/a23ab5ab2fd08e904698106d58ad3536fed51cc1aa0ef228e95bb640eaf11f560dbd91a395477b0d84e1e3c20150263764b4558517cf6576a89d2d6cc5253688 - languageName: node - linkType: hard - -"@emotion/cache@npm:^11.13.0": - version: 11.13.0 - resolution: "@emotion/cache@npm:11.13.0" +"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.13.0": + version: 11.13.1 + resolution: "@emotion/cache@npm:11.13.1" dependencies: "@emotion/memoize": "npm:^0.9.0" "@emotion/sheet": "npm:^1.4.0" "@emotion/utils": "npm:^1.4.0" "@emotion/weak-memoize": "npm:^0.4.0" stylis: "npm:4.2.0" - checksum: 10c0/24cfba12a3494fb49b1ce522cba7ffdca45794a412e8a0da7658c5cb70b4182a852078116e4f66252f167ccd58e5876cfc4f9d1bfcb2618b1887febf835f816a + checksum: 10c0/321e97d8980885737de13b47e41fd4febfbd83086f10c620f865fcbddb29b8fe198adec7e1c69cc7b137638ea9242d7c475c57f954f7ca229157fa92e368f473 languageName: node linkType: hard @@ -712,13 +409,6 @@ __metadata: languageName: node linkType: hard -"@emotion/memoize@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/memoize@npm:0.8.1" - checksum: 10c0/dffed372fc3b9fa2ba411e76af22b6bb686fb0cb07694fdfaa6dd2baeb0d5e4968c1a7caa472bfcf06a5997d5e7c7d16b90e993f9a6ffae79a2c3dbdc76dfe78 - languageName: node - linkType: hard - "@emotion/memoize@npm:^0.9.0": version: 0.9.0 resolution: "@emotion/memoize@npm:0.9.0" @@ -747,20 +437,7 @@ __metadata: languageName: node linkType: hard -"@emotion/serialize@npm:^1.2.0": - version: 1.2.0 - resolution: "@emotion/serialize@npm:1.2.0" - dependencies: - "@emotion/hash": "npm:^0.9.2" - "@emotion/memoize": "npm:^0.9.0" - "@emotion/unitless": "npm:^0.9.0" - "@emotion/utils": "npm:^1.3.0" - csstype: "npm:^3.0.2" - checksum: 10c0/bac56ccc42b4842bbb55139296bfef812ec6d26cf92db1a7adfc90dcab8d2b717706828ff474feff227ef1a5f611020c5a2443ba600ed01d28095f0201b352e2 - languageName: node - linkType: hard - -"@emotion/serialize@npm:^1.3.0": +"@emotion/serialize@npm:^1.2.0, @emotion/serialize@npm:^1.3.0": version: 1.3.0 resolution: "@emotion/serialize@npm:1.3.0" dependencies: @@ -773,13 +450,6 @@ __metadata: languageName: node linkType: hard -"@emotion/sheet@npm:^1.2.2": - version: 1.2.2 - resolution: "@emotion/sheet@npm:1.2.2" - checksum: 10c0/69827a1bfa43d7b188f1d8cea42163143a36312543fdade5257c459a2b3efd7ce386aac84ba152bc2517a4f7e54384c04800b26adb382bb284ac7e4ad40e584b - languageName: node - linkType: hard - "@emotion/sheet@npm:^1.4.0": version: 1.4.0 resolution: "@emotion/sheet@npm:1.4.0" @@ -823,20 +493,6 @@ __metadata: languageName: node linkType: hard -"@emotion/utils@npm:^1.2.1": - version: 1.2.1 - resolution: "@emotion/utils@npm:1.2.1" - checksum: 10c0/db43ca803361740c14dfb1cca1464d10d27f4c8b40d3e8864e6932ccf375d1450778ff4e4eadee03fb97f2aeb18de9fae98294905596a12ff7d4cd1910414d8d - languageName: node - linkType: hard - -"@emotion/utils@npm:^1.3.0": - version: 1.3.0 - resolution: "@emotion/utils@npm:1.3.0" - checksum: 10c0/a42ec56b78e4fea16d120da31fb1d5ccffb9ad372e26c620eb6fe3ca5bb63f9d0d88497af01cd503e4baea9b1dd6d4fe04b897b7720c26a53eee8b993bc8000d - languageName: node - linkType: hard - "@emotion/utils@npm:^1.4.0": version: 1.4.0 resolution: "@emotion/utils@npm:1.4.0" @@ -844,13 +500,6 @@ __metadata: languageName: node linkType: hard -"@emotion/weak-memoize@npm:^0.3.1": - version: 0.3.1 - resolution: "@emotion/weak-memoize@npm:0.3.1" - checksum: 10c0/ed514b3cb94bbacece4ac2450d98898066c0a0698bdeda256e312405ca53634cb83c75889b25cd8bbbe185c80f4c05a1f0a0091e1875460ba6be61d0334f0b8a - languageName: node - linkType: hard - "@emotion/weak-memoize@npm:^0.4.0": version: 0.4.0 resolution: "@emotion/weak-memoize@npm:0.4.0" @@ -1037,14 +686,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.11.0": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0": version: 4.11.0 resolution: "@eslint-community/regexpp@npm:4.11.0" checksum: 10c0/0f6328869b2741e2794da4ad80beac55cba7de2d3b44f796a60955b0586212ec75e6b0253291fd4aad2100ad471d1480d8895f2b54f1605439ba4c875e05e523 @@ -1079,10 +721,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.8.0, @eslint/js@npm:^9.8.0": - version: 9.8.0 - resolution: "@eslint/js@npm:9.8.0" - checksum: 10c0/42edaae6b020436410454579509dcb6a8cd5b260e9f18e037fd803ae28d35eb13663d4019f0ab8ba686a19d3c4a43b0e11394c148e23345377ab694da0e83262 +"@eslint/js@npm:9.9.0, @eslint/js@npm:^9.9.0": + version: 9.9.0 + resolution: "@eslint/js@npm:9.9.0" + checksum: 10c0/6ec9f1f0d576132444d6a5c66a8a08b0be9444e3ebb563fa6a6bebcf5299df3da7e454dc04c0fa601bb811197f00764b3a04430d8458cdb8e3a4677993d23f30 languageName: node linkType: hard @@ -1157,9 +799,9 @@ __metadata: linkType: hard "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 languageName: node linkType: hard @@ -1173,16 +815,16 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.16.6": - version: 5.16.6 - resolution: "@mui/core-downloads-tracker@npm:5.16.6" - checksum: 10c0/ee7655eda56e8eeb18ae600b24182c10caab4468d33179de3e76a783a827be9577afe114750835f7c9c7f555c0de0845c0500e91ed2e669b16399a1ffe41c33d +"@mui/core-downloads-tracker@npm:^5.16.7": + version: 5.16.7 + resolution: "@mui/core-downloads-tracker@npm:5.16.7" + checksum: 10c0/4644c850160d01232c1abdbed141e4fa70e155891a9c68f0c2cc3054b4a3cdc1d28cf2d6665366fd8c725b2b091db677e11831552889a4e4e14f1e44450cf654 languageName: node linkType: hard -"@mui/icons-material@npm:^5.16.6": - version: 5.16.6 - resolution: "@mui/icons-material@npm:5.16.6" +"@mui/icons-material@npm:^5.16.7": + version: 5.16.7 + resolution: "@mui/icons-material@npm:5.16.7" dependencies: "@babel/runtime": "npm:^7.23.9" peerDependencies: @@ -1192,17 +834,17 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/9d24d95e8b4606b5fa2a2e40319255e2e6da52845db50d2d3ca6fd526102be3c498ec1aa9be8d33aad52cf531749b15d490abca5f23af92afc86cf45dc62ce24 + checksum: 10c0/49bab1754334798acaf93187d27200cf90d7c50b6a019531594aeac9e5ced9168281fec70bb040792dc86c8bc0d3bf9a876f22cfbf86ad07941ca6bc6c564921 languageName: node linkType: hard -"@mui/material@npm:^5.16.6": - version: 5.16.6 - resolution: "@mui/material@npm:5.16.6" +"@mui/material@npm:^5.16.7": + version: 5.16.7 + resolution: "@mui/material@npm:5.16.7" dependencies: "@babel/runtime": "npm:^7.23.9" - "@mui/core-downloads-tracker": "npm:^5.16.6" - "@mui/system": "npm:^5.16.6" + "@mui/core-downloads-tracker": "npm:^5.16.7" + "@mui/system": "npm:^5.16.7" "@mui/types": "npm:^7.2.15" "@mui/utils": "npm:^5.16.6" "@popperjs/core": "npm:^2.11.8" @@ -1225,7 +867,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10c0/52cbffd87a36b9f8e16ba59030e89501e680ddea4d3dcf3db5d8fb7b86205444b00162e656c79571824a74769f879f39df2e7671d1e7ca8bc23602a7bf588dc5 + checksum: 10c0/b11419c1a77835413471f9352586fed65fb5de19c6737e121669da0484c441c7dd9939aa73fdad779482c30efaa694fb9fdcf18dcf418af07881e60eaff92b4f languageName: node linkType: hard @@ -1267,9 +909,9 @@ __metadata: languageName: node linkType: hard -"@mui/system@npm:^5.16.6": - version: 5.16.6 - resolution: "@mui/system@npm:5.16.6" +"@mui/system@npm:^5.16.7": + version: 5.16.7 + resolution: "@mui/system@npm:5.16.7" dependencies: "@babel/runtime": "npm:^7.23.9" "@mui/private-theming": "npm:^5.16.6" @@ -1291,7 +933,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 10c0/493900594f51d1fc84994042e5cfa000b2d7664f86c8c0d62b87dbbb51cf7e789a700512f98e18c82e605beab38c20d0714ec25c46e2f6a5024f79f16db743f7 + checksum: 10c0/c07479c0728433847c1e3d7f57b96d9e0770cc814dfd1c9e070304955984a0b706832703b22388eb83906d1a01691f37047e2bac6a5e5c083e8c29a54302d476 languageName: node linkType: hard @@ -1447,8 +1089,8 @@ __metadata: linkType: hard "@prefresh/vite@npm:^2.4.1": - version: 2.4.5 - resolution: "@prefresh/vite@npm:2.4.5" + version: 2.4.6 + resolution: "@prefresh/vite@npm:2.4.6" dependencies: "@babel/core": "npm:^7.22.1" "@prefresh/babel-plugin": "npm:0.5.1" @@ -1458,7 +1100,7 @@ __metadata: peerDependencies: preact: ^10.4.0 vite: ">=2.0.0" - checksum: 10c0/7a147c7b94a8e734e1df6fda2cec0f5796823e42261b08742d0763a60fed916555305e8b0a5f192ee06fc078c8e222cdf79dedc311819169cfd43083e9ab106d + checksum: 10c0/d37bbe9297ae977fb039dc3092cecc6f18716f6c1ef834bfc2a317c87469aae955a3f81a342056adb7260db7e54e6d08b2d3d552dde3603b851916329908f75a languageName: node linkType: hard @@ -1479,114 +1121,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.17.2" +"@rollup/rollup-android-arm-eabi@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.20.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-android-arm64@npm:4.17.2" +"@rollup/rollup-android-arm64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-android-arm64@npm:4.20.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.17.2" +"@rollup/rollup-darwin-arm64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.20.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.17.2" +"@rollup/rollup-darwin-x64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.20.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.17.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.17.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.20.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.17.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.20.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.17.2" +"@rollup/rollup-linux-arm64-musl@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.20.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.17.2" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.17.2" +"@rollup/rollup-linux-riscv64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.20.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.17.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.20.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.17.2" +"@rollup/rollup-linux-x64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.20.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.17.2" +"@rollup/rollup-linux-x64-musl@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.20.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.17.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.20.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.17.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.20.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.17.2": - version: 4.17.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.17.2" +"@rollup/rollup-win32-x64-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.20.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1673,11 +1315,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10c0/033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 languageName: node linkType: hard @@ -1688,6 +1330,15 @@ __metadata: languageName: node linkType: hard +"@types/formidable@npm:^3": + version: 3.4.5 + resolution: "@types/formidable@npm:3.4.5" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/733dc59d4d12152ba5fb70751184812345ff08691864dd9b1b7626b9d40045a306021b9721495cafb56cd375da54fecaaebdada98fc390b7406ebb81efe0bfbe + languageName: node + linkType: hard + "@types/glob@npm:^7.1.1": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -1761,11 +1412,11 @@ __metadata: linkType: hard "@types/imagemin@npm:*": - version: 8.0.5 - resolution: "@types/imagemin@npm:8.0.5" + version: 9.0.0 + resolution: "@types/imagemin@npm:9.0.0" dependencies: "@types/node": "npm:*" - checksum: 10c0/6c5a8d16715f69132c3bafef23b5bb47cb8d88fcfbd376c67acd97b75f6d5a4104ac4d7ef1045b765a28c84d2474d6e12e34cef71f4c84cff19f0c86f6f8877e + checksum: 10c0/b68f227bd39357ea6b4d0c6b020906ba48e5cc8490b0e3aebc9540d662565fc523cf9578f7f53c9351ddcdec5d0f3685679e83be50803234ea83cc743b07dc67 languageName: node linkType: hard @@ -1787,22 +1438,6 @@ __metadata: languageName: node linkType: hard -"@types/lodash-es@npm:^4.17.12": - version: 4.17.12 - resolution: "@types/lodash-es@npm:4.17.12" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/5d12d2cede07f07ab067541371ed1b838a33edb3c35cb81b73284e93c6fd0c4bbeaefee984e69294bffb53f62d7272c5d679fdba8e595ff71e11d00f2601dde0 - languageName: node - linkType: hard - -"@types/lodash@npm:*": - version: 4.17.1 - resolution: "@types/lodash@npm:4.17.1" - checksum: 10c0/af2ad8a3c8d7deb170a7ec6e18afc5ae8980576e5f7fe798d8a95a1df7222c15bdf967a25a35879f575a3b64743de00145710ee461a0051e055e94e4fe253f45 - languageName: node - linkType: hard - "@types/minimatch@npm:*": version: 5.1.2 resolution: "@types/minimatch@npm:5.1.2" @@ -1811,20 +1446,20 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.12.10 - resolution: "@types/node@npm:20.12.10" + version: 22.2.0 + resolution: "@types/node@npm:22.2.0" dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/2cc3b6ea09894ed1a3cf39f6491ec539281580f4ff83216e7d26ce85c83237fe0543c0ca49e25b2515ccdb6c8814b488d17a64a05f536dcaea94f9d32a60c7d7 + undici-types: "npm:~6.13.0" + checksum: 10c0/c17900b34faecfec204f72970bd658d0c217aaf739c1bf7690c969465b6b26b77a8be1cd9ba735aadbd1dd20b5c3e4f406ec33528bf7c6eec90744886c5d5608 languageName: node linkType: hard -"@types/node@npm:^22.0.2": - version: 22.0.2 - resolution: "@types/node@npm:22.0.2" +"@types/node@npm:^22.3.0": + version: 22.3.0 + resolution: "@types/node@npm:22.3.0" dependencies: - undici-types: "npm:~6.11.1" - checksum: 10c0/59ee26fb1104674b2e23981d7569ad113aa8ee23c8449af8e4312aa9352ac738c5ffd0ae4d8077db0467704a3b9ccc662048e39716cb5ad51cdb24d106c7871b + undici-types: "npm:~6.18.2" + checksum: 10c0/855be3b97f4262a84818f889ff898e147dcef4f72b866e3551a8367380cdb63a45cf3929f09d9a0647f62706f8d4772e91a1ecd1bd7c6a80d6744c2b0cbca608 languageName: node linkType: hard @@ -1881,17 +1516,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*": - version: 18.3.1 - resolution: "@types/react@npm:18.3.1" - dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10c0/18d856c12a4ec93f3cda2d58ef3d77a9480818afd3af895f812896fb82cfca1f35a692ab1add4ce826a4eb58a071624c7d1c8c6c4ccfb81c100d2916dc607614 - languageName: node - linkType: hard - -"@types/react@npm:^18.3.3": +"@types/react@npm:*, @types/react@npm:^18.3.3": version: 18.3.3 resolution: "@types/react@npm:18.3.3" dependencies: @@ -1919,15 +1544,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.0.0" +"@typescript-eslint/eslint-plugin@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.1.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.0.0" - "@typescript-eslint/type-utils": "npm:8.0.0" - "@typescript-eslint/utils": "npm:8.0.0" - "@typescript-eslint/visitor-keys": "npm:8.0.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/type-utils": "npm:8.1.0" + "@typescript-eslint/utils": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -1938,66 +1563,66 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/e98304410039bbb7104fdd8ad7a70f2fb81430c117b66d609b44d10cc8937c8a936a4e5993b0b6df5361c00df43a146e89632a37f2407ce9bed3555733c71fc2 + checksum: 10c0/7bbeae588f859b59c34d6a76cac06ef0fa605921b40c5d3b65b94829984280ea84c4dd3f5cb9ce2eb326f5563e9abb4c90ebff05c47f83f4def296c2ea1fa86c languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/parser@npm:8.0.0" +"@typescript-eslint/parser@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/parser@npm:8.1.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.0.0" - "@typescript-eslint/types": "npm:8.0.0" - "@typescript-eslint/typescript-estree": "npm:8.0.0" - "@typescript-eslint/visitor-keys": "npm:8.0.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/7b462bc975c8e0c0d9fbc4955186d61b73aad9d5b9392e8fa68ad4b7c631582edc05176fcbfbebee603695421225e8c5f5ee28812fa47e3060fc7854b84497d5 + checksum: 10c0/b94b2d3ab5ca505484d100701fad6a04a5dc8d595029bac1b9f5b8a4a91d80fd605b0f65d230b36a97ab7e5d55eeb0c28af2ab63929a3e4ab8fdefd2a548c36b languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/scope-manager@npm:8.0.0" +"@typescript-eslint/scope-manager@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/scope-manager@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0" - "@typescript-eslint/visitor-keys": "npm:8.0.0" - checksum: 10c0/d8397055f046be54302b603a59d358c74292f72af3d12ca1e652316a785400d3e2fd20d79e3e316e3278ff7f1c1ffb271f9f6a7a265b88041c5a4e8332f550a0 + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" + checksum: 10c0/2bcf8cd176a1819bddcae16c572e7da8fba821b995a91cd53d64d8d6b85a17f5a895522f281ba57e34929574bddd4d6684ee3e545ec4e8096be4c3198e253a9a languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/type-utils@npm:8.0.0" +"@typescript-eslint/type-utils@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/type-utils@npm:8.1.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.0.0" - "@typescript-eslint/utils": "npm:8.0.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" + "@typescript-eslint/utils": "npm:8.1.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.3.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/96ba2a58ceff420dac79a9c3c2bde15e0a56e8c47baf441a62886c9d8df3db6e9d886cd5c717c6f9a8cfceb545a511c7d452aa1537c2cd3b127bd47509e559ae + checksum: 10c0/62753941c4136e8d2daa72fe0410dea48e5317a6f12ece6382ca85e29912bd1b3f739b61d1060fc0a1f8c488dfc905beab4c8b8497951a21c3138a659c7271ec languageName: node linkType: hard -"@typescript-eslint/types@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/types@npm:8.0.0" - checksum: 10c0/c15efce96e4b80c2bef7ea4fa7f046609816ae8bc3a4e31d9d671e237520f6b96595e1330a891ec7042bc7b09fc16d265bad49fd878d5fb8be4b59b8a752e5b5 +"@typescript-eslint/types@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/types@npm:8.1.0" + checksum: 10c0/ceade44455f45974e68956016c4d1c6626580732f7f9675e14ffa63db80b551752b0df596b20473dae9f0dc6ed966e17417dc2cf36e1a82b6ab0edc97c5eaa50 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.0.0" +"@typescript-eslint/typescript-estree@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0" - "@typescript-eslint/visitor-keys": "npm:8.0.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/visitor-keys": "npm:8.1.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -2007,31 +1632,31 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/a82f3eb2a66a4b2715d09f8f9547c1f0c27ea60c1d10d0777c8ce998b760dbb8ef14466fc2056220b8a236c2d2dc3ee99f482502f5c268bd40909b272bb47eb4 + checksum: 10c0/a7bc8275df1c79c4cb14ef086c56674316dd4907efec53eddca35d0b5220428b69c82178ce2d95138da2e398269c8bd0764cae8020a36417e411e35c3c47bc4b languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/utils@npm:8.0.0" +"@typescript-eslint/utils@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/utils@npm:8.1.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.0.0" - "@typescript-eslint/types": "npm:8.0.0" - "@typescript-eslint/typescript-estree": "npm:8.0.0" + "@typescript-eslint/scope-manager": "npm:8.1.0" + "@typescript-eslint/types": "npm:8.1.0" + "@typescript-eslint/typescript-estree": "npm:8.1.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/ecba01996d1aa330c640c41c1212fed2328a47768348ab6886080e0e55bc3b2041939a635a7440d47db533f0c4b21e1eb8b58535a9eaebbbe2c035906e12ba06 + checksum: 10c0/c95503a6bdcd98b1ff04d1adbf46377b2036b1c510d90a4a056401f996f775f06c3108c95fb81cd6babc9c97b73b91b8e848f0337bc508de8a49c993582f0e75 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.0.0": - version: 8.0.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.0.0" +"@typescript-eslint/visitor-keys@npm:8.1.0": + version: 8.1.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.1.0" dependencies: - "@typescript-eslint/types": "npm:8.0.0" + "@typescript-eslint/types": "npm:8.1.0" eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/8c59a2e971370c2b9a5727541c72d6b64fd0448ab03dd8b4274a26bddea5e1b4c560dd7856e1f48577cd333f7bbbed7a0f1849d39e2d1b48a748a3668c1a3723 + checksum: 10c0/b7544dbb0eec1ddbfcd95c04b51b9a739c2e768c16d1c88508f976a2b0d1bc02fefb7491930e06e48073a5c07c6f488cd8403bba3a8b918888b93a88d5ac3869 languageName: node linkType: hard @@ -2039,49 +1664,46 @@ __metadata: version: 0.0.0-use.local resolution: "EMS-ESP@workspace:." dependencies: - "@alova/adapter-xhr": "npm:^1.0.6" - "@alova/scene-react": "npm:^1.6.2" + "@alova/adapter-xhr": "npm:2.0.4" "@babel/core": "npm:^7.25.2" "@emotion/react": "npm:^11.13.0" "@emotion/styled": "npm:^11.13.0" - "@eslint/js": "npm:^9.8.0" - "@mui/icons-material": "npm:^5.16.6" - "@mui/material": "npm:^5.16.6" + "@eslint/js": "npm:^9.9.0" + "@mui/icons-material": "npm:^5.16.7" + "@mui/material": "npm:^5.16.7" "@preact/compat": "npm:^17.1.2" "@preact/preset-vite": "npm:^2.9.0" "@table-library/react-table-library": "npm:4.1.7" "@trivago/prettier-plugin-sort-imports": "npm:^4.3.0" "@types/babel__core": "npm:^7" - "@types/lodash-es": "npm:^4.17.12" - "@types/node": "npm:^22.0.2" + "@types/formidable": "npm:^3" + "@types/node": "npm:^22.3.0" "@types/react": "npm:^18.3.3" "@types/react-dom": "npm:^18.3.0" "@types/react-router-dom": "npm:^5.3.3" - alova: "npm:^2.21.4" + alova: "npm:3.0.9" async-validator: "npm:^4.2.5" concurrently: "npm:^8.2.2" - eslint: "npm:^9.8.0" + eslint: "npm:^9.9.0" eslint-config-prettier: "npm:^9.1.0" - history: "npm:^5.3.0" + formidable: "npm:^3.5.1" jwt-decode: "npm:^4.0.0" - lodash-es: "npm:^4.17.21" mime-types: "npm:^2.1.35" - preact: "npm:^10.23.1" + preact: "npm:^10.23.2" prettier: "npm:^3.3.3" - react: "npm:latest" - react-dom: "npm:latest" - react-dropzone: "npm:^14.2.3" - react-icons: "npm:^5.2.1" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + react-icons: "npm:^5.3.0" react-router-dom: "npm:^6.26.0" react-toastify: "npm:^10.0.5" rollup-plugin-visualizer: "npm:^5.12.0" - terser: "npm:^5.31.3" + terser: "npm:^5.31.6" typesafe-i18n: "npm:^5.26.2" typescript: "npm:^5.5.4" - typescript-eslint: "npm:8.0.0" - vite: "npm:^5.3.5" + typescript-eslint: "npm:8.1.0" + vite: "npm:^5.4.1" vite-plugin-imagemin: "npm:^0.6.1" - vite-tsconfig-paths: "npm:^4.3.2" + vite-tsconfig-paths: "npm:^5.0.1" languageName: unknown linkType: soft @@ -2101,21 +1723,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.8.2": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.12.0, acorn@npm:^8.8.2": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" bin: acorn: bin/acorn - checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 - languageName: node - linkType: hard - -"acorn@npm:^8.12.0": - version: 8.12.0 - resolution: "acorn@npm:8.12.0" - bin: - acorn: bin/acorn - checksum: 10c0/a19f9dead009d3b430fa3c253710b47778cdaace15b316de6de93a68c355507bc1072a9956372b6c990cbeeb167d4a929249d0faeb8ae4bb6911d68d53299549 + checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 languageName: node linkType: hard @@ -2150,10 +1763,13 @@ __metadata: languageName: node linkType: hard -"alova@npm:^2.21.4": - version: 2.21.4 - resolution: "alova@npm:2.21.4" - checksum: 10c0/6600826747eecc85f750904cd5a9f75361bd5b542615b027fae072cafe72cb27b9f7b260a834063c0734a9b41a7aa8b15396a190f8ce9a46713d01b073296a50 +"alova@npm:3.0.9": + version: 3.0.9 + resolution: "alova@npm:3.0.9" + dependencies: + "@alova/shared": "npm:^1.0.4" + rate-limiter-flexible: "npm:^5.0.3" + checksum: 10c0/df4cf0e513e10cf12d0af37c3b4f04bd81c5f1681073335c23d8d6d32f7d08aaba88822c7ff99f862ef55a959f336c9f26d14bb7dde051b2add813cc9a6ffdad languageName: node linkType: hard @@ -2247,6 +1863,13 @@ __metadata: languageName: node linkType: hard +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + "async-validator@npm:^4.2.5": version: 4.2.5 resolution: "async-validator@npm:4.2.5" @@ -2254,13 +1877,6 @@ __metadata: languageName: node linkType: hard -"attr-accept@npm:^2.2.2": - version: 2.2.2 - resolution: "attr-accept@npm:2.2.2" - checksum: 10c0/f77c073ac9616a783f2df814a56f65f1c870193e8da6097139e30b3be84ecc19fb835b93e81315d1da4f19e80721f14e8c8075014205e00abd37b856fe030b80 - languageName: node - linkType: hard - "babel-plugin-macros@npm:^3.1.0": version: 3.1.0 resolution: "babel-plugin-macros@npm:3.1.0" @@ -2389,40 +2005,26 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 - languageName: node - linkType: hard - -"browserslist@npm:^4.22.2": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" - dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" - bin: - browserslist: cli.js - checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 languageName: node linkType: hard "browserslist@npm:^4.23.1": - version: 4.23.2 - resolution: "browserslist@npm:4.23.2" + version: 4.23.3 + resolution: "browserslist@npm:4.23.3" dependencies: - caniuse-lite: "npm:^1.0.30001640" - electron-to-chromium: "npm:^1.4.820" - node-releases: "npm:^2.0.14" + caniuse-lite: "npm:^1.0.30001646" + electron-to-chromium: "npm:^1.5.4" + node-releases: "npm:^2.0.18" update-browserslist-db: "npm:^1.1.0" bin: browserslist: cli.js - checksum: 10c0/0217d23c69ed61cdd2530c7019bf7c822cd74c51f8baab18dd62457fed3129f52499f8d3a6f809ae1fb7bb3050aa70caa9a529cc36c7478427966dbf429723a5 + checksum: 10c0/3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 languageName: node linkType: hard @@ -2475,8 +2077,8 @@ __metadata: linkType: hard "cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" + version: 18.0.4 + resolution: "cacache@npm:18.0.4" dependencies: "@npmcli/fs": "npm:^3.1.0" fs-minipass: "npm:^3.0.0" @@ -2490,7 +2092,7 @@ __metadata: ssri: "npm:^10.0.0" tar: "npm:^6.1.11" unique-filename: "npm:^3.0.0" - checksum: 10c0/dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 + checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f languageName: node linkType: hard @@ -2533,17 +2135,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001616 - resolution: "caniuse-lite@npm:1.0.30001616" - checksum: 10c0/4c29f0a6c65ec888fadf5112cffc3b162872b74dce6ca4964d242c1c0fd05ab284f8e500f85739d5c96573589cf6e0e911424646b1009440a7c142ef6a5187ce - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001640": - version: 1.0.30001641 - resolution: "caniuse-lite@npm:1.0.30001641" - checksum: 10c0/a065b641cfcc84b36955ee909bfd7313ad103d6a299f0fd261e0e4160e8f1cec79d685c5a9f11097a77687cf47154eddb8133163f2a34bcb8d73c45033a014d2 +"caniuse-lite@npm:^1.0.30001646": + version: 1.0.30001651 + resolution: "caniuse-lite@npm:1.0.30001651" + checksum: 10c0/7821278952a6dbd17358e5d08083d258f092e2a530f5bc1840657cb140fbbc5ec44293bc888258c44a18a9570cde149ed05819ac8320b9710cf22f699891e6ad languageName: node linkType: hard @@ -2899,14 +2494,14 @@ __metadata: linkType: hard "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" + version: 4.3.6 + resolution: "debug@npm:4.3.6" dependencies: ms: "npm:2.1.2" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + checksum: 10c0/3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 languageName: node linkType: hard @@ -3010,6 +2605,16 @@ __metadata: languageName: node linkType: hard +"dezalgo@npm:^1.0.4": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -3151,17 +2756,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.758 - resolution: "electron-to-chromium@npm:1.4.758" - checksum: 10c0/60151ca87bfdf50ee8fc47df4db32f62f33c972259856bc308134bf278d21af62842d9f9f1e1f397df6bb82925e83745f6d3a4ecda00813d14c2156f0e681d3f - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.820": - version: 1.4.827 - resolution: "electron-to-chromium@npm:1.4.827" - checksum: 10c0/e37719d8f13da78eb2bc68184cdf73d167ecf413abc28afef2b0a5c55866293752fda980d83a5f42b5780781bde418b24c12e1c38f2662d25ed1c2f71880bc24 +"electron-to-chromium@npm:^1.5.4": + version: 1.5.6 + resolution: "electron-to-chromium@npm:1.5.6" + checksum: 10c0/1dfef4feaa9f4e5231b8b0697f1f55623eb2ffd263b50e6d4ff995a0927653997ba116640ae06786661f8d24c7b99fa6727c0796e9c60d748f473674d78ab31e languageName: node linkType: hard @@ -3584,15 +3182,15 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.8.0": - version: 9.8.0 - resolution: "eslint@npm:9.8.0" +"eslint@npm:^9.9.0": + version: 9.9.0 + resolution: "eslint@npm:9.9.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.11.0" "@eslint/config-array": "npm:^0.17.1" "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.8.0" + "@eslint/js": "npm:9.9.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.3.0" "@nodelib/fs.walk": "npm:^1.2.8" @@ -3622,24 +3220,18 @@ __metadata: optionator: "npm:^0.9.3" strip-ansi: "npm:^6.0.1" text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/a2ee0cce1147565d011fe185733af482f34d5466f5df5f390d0ea2ecf78097883cf568ed6c771d687138609c63cd55cd1e3ff12de7393c03f54fcffcdd0f225d + checksum: 10c0/3a22f68c99d75dcbafe6e2fef18d2b5bbcc960c2437f48a414ccf9ca214254733a18e6b79d07bbd374a2369a648413e421aabd07b11be3de5a44d5a4b9997877 languageName: node linkType: hard -"espree@npm:^10.0.1": - version: 10.0.1 - resolution: "espree@npm:10.0.1" - dependencies: - acorn: "npm:^8.11.3" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.0.0" - checksum: 10c0/7c0f84afa0f9db7bb899619e6364ed832ef13fe8943691757ddde9a1805ae68b826ed66803323015f707a629a5507d0d290edda2276c25131fe0ad883b8b5636 - languageName: node - linkType: hard - -"espree@npm:^10.1.0": +"espree@npm:^10.0.1, espree@npm:^10.1.0": version: 10.1.0 resolution: "espree@npm:10.1.0" dependencies: @@ -3651,11 +3243,11 @@ __metadata: linkType: hard "esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10c0/a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 languageName: node linkType: hard @@ -3836,13 +3428,13 @@ __metadata: linkType: hard "fast-xml-parser@npm:^4.1.3": - version: 4.3.6 - resolution: "fast-xml-parser@npm:4.3.6" + version: 4.4.1 + resolution: "fast-xml-parser@npm:4.4.1" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10c0/9ebe2ac142c6978cae423c39c2a9b561edb76be584317d578768ed4a006a61fc0e83abf8c6fe31029139c4ad15ea1f2e7b6720ba9e6eda0e5266d7f2770fb079 + checksum: 10c0/7f334841fe41bfb0bf5d920904ccad09cefc4b5e61eaf4c225bf1e1bb69ee77ef2147d8942f783ee8249e154d1ca8a858e10bda78a5d78b8bed3f48dcee9bf33 languageName: node linkType: hard @@ -3883,15 +3475,6 @@ __metadata: languageName: node linkType: hard -"file-selector@npm:^0.6.0": - version: 0.6.0 - resolution: "file-selector@npm:0.6.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/477ca1b56274db9fee1a8a623c4bfef580389726a5fef843af8c1f2f17f70ec2d1e41b29115777c92e120a15f1cca734c6ef36bb48bfa2ee027c68da16cd0d28 - languageName: node - linkType: hard - "file-type@npm:5.2.0, file-type@npm:^5.2.0": version: 5.2.0 resolution: "file-type@npm:5.2.0" @@ -3959,12 +3542,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard @@ -4022,12 +3605,23 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"formidable@npm:^3.5.1": + version: 3.5.1 + resolution: "formidable@npm:3.5.1" + dependencies: + dezalgo: "npm:^1.0.4" + hexoid: "npm:^1.0.0" + once: "npm:^1.4.0" + checksum: 10c0/c02fa1a027876dd9fc5abde16e9c537bec41bc652b362d0b3fd26daaae0615b9a472129c29b328a130d11f543f676acd1b13e6f28f3adc1b088cdaea9fb9e054 languageName: node linkType: hard @@ -4228,17 +3822,18 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.12 - resolution: "glob@npm:10.3.12" + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.6" - minimatch: "npm:^9.0.1" - minipass: "npm:^7.0.4" - path-scurry: "npm:^1.10.2" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/f60cefdc1cf3f958b2bb5823e1b233727f04916d489dc4641d76914f016e6704421e06a83cbb68b0cb1cb9382298b7a88075b844ad2127fc9727ea22b18b0711 + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e languageName: node linkType: hard @@ -4407,7 +4002,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -4425,12 +4020,10 @@ __metadata: languageName: node linkType: hard -"history@npm:^5.3.0": - version: 5.3.0 - resolution: "history@npm:5.3.0" - dependencies: - "@babel/runtime": "npm:^7.7.6" - checksum: 10c0/812ec839386222d6437bd78d9f05db32e47d105ada0ad8834b32626919dd2fee7a10001bc489510f93a8069d02f118214bd8d42a82f7cf9daf8e84fbcbbb2016 +"hexoid@npm:^1.0.0": + version: 1.0.0 + resolution: "hexoid@npm:1.0.0" + checksum: 10c0/9c45e8ba676b9eb88455631ebceec4c829a8374a583410dc735472ab9808bf11339fcd074633c3fa30e420901b894d8a92ffd5e2e21eddd41149546e05a91f69 languageName: node linkType: hard @@ -4475,12 +4068,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.4 - resolution: "https-proxy-agent@npm:7.0.4" + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" dependencies: agent-base: "npm:^7.0.2" debug: "npm:4" - checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c languageName: node linkType: hard @@ -4706,11 +4299,11 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" + version: 2.15.0 + resolution: "is-core-module@npm:2.15.0" dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + hasown: "npm:^2.0.2" + checksum: 10c0/da161f3d9906f459486da65609b2f1a2dfdc60887c689c234d04e88a062cb7920fa5be5fb7ab08dc43b732929653c4135ef05bf77888ae2a9040ce76815eb7b1 languageName: node linkType: hard @@ -4904,16 +4497,16 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 languageName: node linkType: hard @@ -5118,13 +4711,6 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash-es@npm:4.17.21" - checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -5206,9 +4792,9 @@ __metadata: linkType: hard "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 10c0/402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb languageName: node linkType: hard @@ -5332,22 +4918,29 @@ __metadata: linkType: hard "micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + checksum: 10c0/58fa99bc5265edec206e9163a1d2cec5fabc46a5b473c45f4a700adce88c2520456ae35f2b301e4410fb3afb27e9521fb2813f6fc96be0a48a89430e0916a772 languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:^1.28.0": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa languageName: node linkType: hard +"mime-db@npm:^1.28.0": + version: 1.53.0 + resolution: "mime-db@npm:1.53.0" + checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4 + languageName: node + linkType: hard + "mime-types@npm:^2.1.35": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -5380,12 +4973,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10c0/2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed languageName: node linkType: hard @@ -5463,10 +5056,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": - version: 7.1.0 - resolution: "minipass@npm:7.1.0" - checksum: 10c0/6861c6ec9dc3cb99c745b287d92b2a8f409951852940205b4bb106faceb790544288622a0db7aa152f37793e2fc8f303628787883d9a679f2126605204feb97f +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 languageName: node linkType: hard @@ -5539,8 +5132,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.1.0 - resolution: "node-gyp@npm:10.1.0" + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -5548,13 +5141,13 @@ __metadata: graceful-fs: "npm:^4.2.6" make-fetch-happen: "npm:^13.0.0" nopt: "npm:^7.0.0" - proc-log: "npm:^3.0.0" + proc-log: "npm:^4.1.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" + tar: "npm:^6.2.1" which: "npm:^4.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b languageName: node linkType: hard @@ -5568,10 +5161,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 +"node-releases@npm:^2.0.18": + version: 2.0.18 + resolution: "node-releases@npm:2.0.18" + checksum: 10c0/786ac9db9d7226339e1dc84bbb42007cb054a346bd9257e6aa154d294f01bc6a6cddb1348fa099f079be6580acbb470e3c048effd5f719325abd0179e566fd27 languageName: node linkType: hard @@ -5840,6 +5433,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.0 + resolution: "package-json-from-dist@npm:1.0.0" + checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -5914,13 +5514,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.2": - version: 1.10.2 - resolution: "path-scurry@npm:1.10.2" +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: lru-cache: "npm:^10.2.0" minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/d723777fbf9627f201e64656680f66ebd940957eebacf780e6cce1c2919c29c116678b2d7dbf8821b3a2caa758d125f4444005ccec886a25c8f324504e48e601 + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d languageName: node linkType: hard @@ -5956,14 +5556,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": version: 1.0.1 resolution: "picocolors@npm:1.0.1" checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 @@ -6027,21 +5620,21 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.39": - version: 8.4.39 - resolution: "postcss@npm:8.4.39" +"postcss@npm:^8.4.41": + version: 8.4.41 + resolution: "postcss@npm:8.4.41" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.1" source-map-js: "npm:^1.2.0" - checksum: 10c0/16f5ac3c4e32ee76d1582b3c0dcf1a1fdb91334a45ad755eeb881ccc50318fb8d64047de4f1601ac96e30061df203f0f2e2edbdc0bfc49b9c57bc9fb9bedaea3 + checksum: 10c0/c1828fc59e7ec1a3bf52b3a42f615dba53c67960ed82a81df6441b485fe43c20aba7f4e7c55425762fd99c594ecabbaaba8cf5b30fd79dfec5b52a9f63a2d690 languageName: node linkType: hard -"preact@npm:^10.23.1": - version: 10.23.1 - resolution: "preact@npm:10.23.1" - checksum: 10c0/f0eb37999bfa9cbc725e57e189387c77919fa05d17cdc3c4ff41660298805159867689f1d974eb8e6496288c0212760490d0e6f1c12022e0f5a74d06cc618e85 +"preact@npm:^10.23.2": + version: 10.23.2 + resolution: "preact@npm:10.23.2" + checksum: 10c0/6e0dc1b38ead7554c99ddec9a32162b456e8f622229413b136042a777445a12d115633cd49d6df83c30b64d721a0ad4d3c71bb468edc759c15799896e96fd9f2 languageName: node linkType: hard @@ -6075,14 +5668,7 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^3.0.0": - version: 3.0.0 - resolution: "proc-log@npm:3.0.0" - checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc - languageName: node - linkType: hard - -"proc-log@npm:^4.2.0": +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 @@ -6166,7 +5752,14 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:latest": +"rate-limiter-flexible@npm:^5.0.3": + version: 5.0.3 + resolution: "rate-limiter-flexible@npm:5.0.3" + checksum: 10c0/4ae8290cf57cbd9bc8dfd9829ed821ffad2bc6d4699170608b4b85b010059981e591803a4b1974f25755f1cbf25ff8208795cc325d5bed9d2315717865e25697 + languageName: node + linkType: hard + +"react-dom@npm:^18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" dependencies: @@ -6178,25 +5771,12 @@ __metadata: languageName: node linkType: hard -"react-dropzone@npm:^14.2.3": - version: 14.2.3 - resolution: "react-dropzone@npm:14.2.3" - dependencies: - attr-accept: "npm:^2.2.2" - file-selector: "npm:^0.6.0" - prop-types: "npm:^15.8.1" - peerDependencies: - react: ">= 16.8 || 18.0.0" - checksum: 10c0/6433517c53309aca1bb4f4a535aeee297345ca1e11b123676f46c7682ffab34a3428cbda106448fc92b5c9a5e0fa5d225bc188adebcd4d302366bf6b1f9c3fc1 - languageName: node - linkType: hard - -"react-icons@npm:^5.2.1": - version: 5.2.1 - resolution: "react-icons@npm:5.2.1" +"react-icons@npm:^5.3.0": + version: 5.3.0 + resolution: "react-icons@npm:5.3.0" peerDependencies: react: "*" - checksum: 10c0/9d52b975afaf27dab07dcaefd50497ba43cc57076fc26ccac5142965e01c7fd0c503a62ea31c3bb710e0b2959a4620c2fed12c3c86960ad8ceb63de7f0085f3a + checksum: 10c0/a53af0de558f0e2bacfbafc973aa8ca1e6a429006a2f83d70becad5be431726a691e096336c95949bb0d967587b145264c5046d2bc1518969dbae731855d0712 languageName: node linkType: hard @@ -6288,7 +5868,7 @@ __metadata: languageName: node linkType: hard -"react@npm:latest": +"react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -6460,25 +6040,25 @@ __metadata: linkType: hard "rollup@npm:^4.13.0": - version: 4.17.2 - resolution: "rollup@npm:4.17.2" + version: 4.20.0 + resolution: "rollup@npm:4.20.0" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.17.2" - "@rollup/rollup-android-arm64": "npm:4.17.2" - "@rollup/rollup-darwin-arm64": "npm:4.17.2" - "@rollup/rollup-darwin-x64": "npm:4.17.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.17.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.17.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.17.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.17.2" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.17.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.17.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.17.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.17.2" - "@rollup/rollup-linux-x64-musl": "npm:4.17.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.17.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.17.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.17.2" + "@rollup/rollup-android-arm-eabi": "npm:4.20.0" + "@rollup/rollup-android-arm64": "npm:4.20.0" + "@rollup/rollup-darwin-arm64": "npm:4.20.0" + "@rollup/rollup-darwin-x64": "npm:4.20.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.20.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.20.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.20.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.20.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.20.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.20.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.20.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.20.0" + "@rollup/rollup-linux-x64-musl": "npm:4.20.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.20.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.20.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.20.0" "@types/estree": "npm:1.0.5" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -6518,7 +6098,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/4fa6644e5c7fc4a34f654ea7e209be6c2c5897ed9dd43e7135230137204df748a795c7553804130f6c41da0b71e83f8c35a4a7881d385a77996adee50b609a6e + checksum: 10c0/9b23bf0e3380e64573a5f68a55274d5c7969036e55c19aab9fb4deea2e938d76769db70f3c95ee3783c24af152bea1772ad73f9e3625b6ffd4e600a788fe97ea languageName: node linkType: hard @@ -6617,11 +6197,11 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.6.0": - version: 7.6.1 - resolution: "semver@npm:7.6.1" + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10c0/fd28315954ffc80204df0cb5c62355160ebf54059f5ffe386e9903162ddf687ed14004c30f6e5347fa695fc77bafa242798af8d351f1d260207f007cfbeccb82 + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf languageName: node linkType: hard @@ -6693,17 +6273,17 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.3 - resolution: "socks-proxy-agent@npm:8.0.3" + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" dependencies: agent-base: "npm:^7.1.1" debug: "npm:^4.3.4" - socks: "npm:^2.7.1" - checksum: 10c0/4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + socks: "npm:^2.8.3" + checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a languageName: node linkType: hard -"socks@npm:^2.7.1": +"socks@npm:^2.8.3": version: 2.8.3 resolution: "socks@npm:2.8.3" dependencies: @@ -6813,9 +6393,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.17 - resolution: "spdx-license-ids@npm:3.0.17" - checksum: 10c0/ddf9477b5afc70f1a7d3bf91f0b8e8a1c1b0fa65d2d9a8b5c991b1a2ba91b693d8b9749700119d5ce7f3fbf307ac421087ff43d321db472605e98a5804f80eac + version: 3.0.18 + resolution: "spdx-license-ids@npm:3.0.18" + checksum: 10c0/c64ba03d4727191c8fdbd001f137d6ab51386c350d5516be8a4576c2e74044cb27bc8a758f6a04809da986cc0b14213f069b04de72caccecbc9f733753ccde32 languageName: node linkType: hard @@ -7071,7 +6651,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": +"tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -7102,9 +6682,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.31.3": - version: 5.31.3 - resolution: "terser@npm:5.31.3" +"terser@npm:^5.31.6": + version: 5.31.6 + resolution: "terser@npm:5.31.6" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -7112,7 +6692,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/eb2b525dada9febd3db74e94bd295f9cd7abd809e4f9c6bbc795a3048ad50fd327c15eab99db383fa820239680eef6d2dbd7dc05361769c204ddee5cf684d41e + checksum: 10c0/b17d02b65a52a5041430572b3c514475820f5e7590fa93773c0f5b4be601ccf3f6d745bf5a79f3ee58187cf85edf61c24ddf4345783839fccb44c9c8fa9b427e languageName: node linkType: hard @@ -7195,8 +6775,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.0.3 - resolution: "tsconfck@npm:3.0.3" + version: 3.1.1 + resolution: "tsconfck@npm:3.1.1" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -7204,14 +6784,14 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10c0/d45009230c4caa5fc765bdded96f3b8703a7cdd44a1d63024914b0fb1c4dabf9e94d28cc9f9edccaef9baa7b99adc963502d34943d82fcb07b92e1161ee03c56 + checksum: 10c0/e133eb308ba37e8db8dbac1905bddaaf4a62f0e01aa88143e19867e274a877b86b35cf69c9a0172ca3e7d1a4bb32400381ac7f7a1429e34250a8d7ae55aee3e7 languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.4.0": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb +"tslib@npm:^2.1.0": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10c0/2598aef53d9dbe711af75522464b2104724d6467b26a60f2bdac8297d2b5f1f6b86a71f61717384aa8fd897240467aaa7bcc36a0700a0faf751293d1331db39a languageName: node linkType: hard @@ -7251,17 +6831,17 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:8.0.0": - version: 8.0.0 - resolution: "typescript-eslint@npm:8.0.0" +"typescript-eslint@npm:8.1.0": + version: 8.1.0 + resolution: "typescript-eslint@npm:8.1.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.0.0" - "@typescript-eslint/parser": "npm:8.0.0" - "@typescript-eslint/utils": "npm:8.0.0" + "@typescript-eslint/eslint-plugin": "npm:8.1.0" + "@typescript-eslint/parser": "npm:8.1.0" + "@typescript-eslint/utils": "npm:8.1.0" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/138ba4767e16bcb1bde3e6becbe92a548091d27c5584cf60d5c78d599085e06172791ab297447b9245f5387c9777b76683c2afd0e0234ed20d67a1de1192a7c9 + checksum: 10c0/9b5769b95aeca54ae9fa15cd2f0e5656747f643a7be220513555de143ff19d70c5945eb82259a3fb29ab4d37f4d158f7f088e7b2cf98e2e8253a7429ac19d072 languageName: node linkType: hard @@ -7295,17 +6875,17 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 +"undici-types@npm:~6.13.0": + version: 6.13.0 + resolution: "undici-types@npm:6.13.0" + checksum: 10c0/2de55181f569c77a4f08063f8bf2722fcbb6ea312a26a9e927bd1f5ea5cf3a281c5ddf23155061db083e0a25838f54813543ff13b0ac34d230d5c1205ead66c1 languageName: node linkType: hard -"undici-types@npm:~6.11.1": - version: 6.11.1 - resolution: "undici-types@npm:6.11.1" - checksum: 10c0/d8f5739a8e6c779d72336c82deb49c56d5ac9f9f6e0eb2e8dd4d3f6929ae9db7cde370d2e46516fe6cad04ea53e790c5e16c4c75eed7cd0f9bd31b0763bb2fa3 +"undici-types@npm:~6.18.2": + version: 6.18.2 + resolution: "undici-types@npm:6.18.2" + checksum: 10c0/dea28163891a5af7624c120107dc07a74c369ee94c6dd1d0de29af061ee129fac4846f97130589f4436b85f6102c73d30328ca908be02626dd8ab9fec5642aba languageName: node linkType: hard @@ -7334,20 +6914,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.15 - resolution: "update-browserslist-db@npm:1.0.15" - dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.0" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/c5f67dc68aba9a37701a14199e57e22f20c579411d386f47b4d81f6e3f06fd3ec256310594f4f9d6b01bc1cfb93cb1ebb1a1da70c4fa28720bc1d030f55bb8a1 - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.1.0": version: 1.1.0 resolution: "update-browserslist-db@npm:1.1.0" @@ -7455,9 +7021,9 @@ __metadata: languageName: node linkType: hard -"vite-tsconfig-paths@npm:^4.3.2": - version: 4.3.2 - resolution: "vite-tsconfig-paths@npm:4.3.2" +"vite-tsconfig-paths@npm:^5.0.1": + version: 5.0.1 + resolution: "vite-tsconfig-paths@npm:5.0.1" dependencies: debug: "npm:^4.1.1" globrex: "npm:^0.1.2" @@ -7467,23 +7033,24 @@ __metadata: peerDependenciesMeta: vite: optional: true - checksum: 10c0/f390ac1d1c3992fc5ac50f9274c1090f8b55ab34a89ea88893db9a6924a3b26c9f64bc1163615150ad100749db73b6b2cf1d57f6cd60df6e762ceb5b8ad30024 + checksum: 10c0/3c68a4d5df21ed4ef81749c20e91c5978989ed06bffc01688b3f1a0fe65951b461a68f0c017ad930a088cfe7a8cc04d0c8d955dfb8719d5edc7fb0ba9bf38a73 languageName: node linkType: hard -"vite@npm:^5.3.5": - version: 5.3.5 - resolution: "vite@npm:5.3.5" +"vite@npm:^5.4.1": + version: 5.4.1 + resolution: "vite@npm:5.4.1" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.39" + postcss: "npm:^8.4.41" rollup: "npm:^4.13.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -7499,6 +7066,8 @@ __metadata: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -7507,7 +7076,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/795c7e0dbc94b96c4a0aff0d5d4b349dd28ad8b7b70979c1010f96b4d83f7d6c1700ebd6fed91de2e021b0a3689b9abc2d8017f6dfa8c9a6ca5c7af637d6afc6 + checksum: 10c0/b9ea824f1a946aa494f756e6d9dd88869baa62ae5ba3071b32b6a20958fd622cb624c860bdd7daee201c83ca029feaf8bbe2d2a6e172a5d49308772f8899d86d languageName: node linkType: hard diff --git a/lib/framework/APSettingsService.cpp b/lib/framework/APSettingsService.cpp index 76809c3f0..309e9b62b 100644 --- a/lib/framework/APSettingsService.cpp +++ b/lib/framework/APSettingsService.cpp @@ -75,6 +75,7 @@ void APSettingsService::manageAP() { } void APSettingsService::startAP() { + WiFi.softAPenableIpV6(); // force IPV6, same as for WiFi - fixes https://github.com/emsesp/EMS-ESP32/issues/1922 WiFi.softAPConfig(_state.localIP, _state.gatewayIP, _state.subnetMask); esp_wifi_set_bandwidth(static_cast(ESP_IF_WIFI_AP), WIFI_BW_HT20); WiFi.softAP(_state.ssid.c_str(), _state.password.c_str(), _state.channel, _state.ssidHidden, _state.maxClients); @@ -149,7 +150,7 @@ StateUpdateResult APSettings::update(JsonObject root, APSettings & settings) { newSettings.maxClients = static_cast(root["max_clients"] | FACTORY_AP_MAX_CLIENTS); JsonUtils::readIP(root, "local_ip", newSettings.localIP, String(FACTORY_AP_LOCAL_IP)); - JsonUtils::readIP(root, "gateway_ip", newSettings.gatewayIP,String(FACTORY_AP_GATEWAY_IP)); + JsonUtils::readIP(root, "gateway_ip", newSettings.gatewayIP, String(FACTORY_AP_GATEWAY_IP)); JsonUtils::readIP(root, "subnet_mask", newSettings.subnetMask, String(FACTORY_AP_SUBNET_MASK)); if (newSettings == settings) { diff --git a/mock-api/es_server.ts b/mock-api/es_server.ts deleted file mode 100644 index 480d42757..000000000 --- a/mock-api/es_server.ts +++ /dev/null @@ -1,69 +0,0 @@ -import express from 'express'; - -const rest_server = express(); - -const port = 3081; - -const ES_ENDPOINT_ROOT = '/es/'; -const ES_LOG_ENDPOINT = ES_ENDPOINT_ROOT + 'log'; - -const INTERVAL = 1000; - -function pad(number) { - var r = String(number); - if (r.length === 1) { - r = '0' + r; - } - return r; -} - -// e.g. 2024-03-29 07:02:37.856 -Date.prototype.toISOString = function () { - return ( - this.getUTCFullYear() + - '-' + - pad(this.getUTCMonth() + 1) + - '-' + - pad(this.getUTCDate()) + - ' ' + - pad(this.getUTCHours()) + - ':' + - pad(this.getUTCMinutes()) + - ':' + - pad(this.getUTCSeconds()) + - '.' + - String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) - ); -}; - -rest_server.get(ES_LOG_ENDPOINT, (_req, res) => { - res.writeHead(200, { - Connection: 'keep-alive', - 'Cache-Control': 'no-cache', - 'Content-Type': 'text/event-stream' - }); - - let count = 0; - const interval = setInterval(() => { - const data = { - t: new Date().toISOString(), - l: (3 + (count % 6)), - i: count, - n: 'system', - m: 'message #' + count++ - }; - res.write(`data: ${JSON.stringify(data)}\n\n`); - }, INTERVAL); - - - - // if client closes connection - res.on('close', () => { - console.log('Closing ES connection'); - clearInterval(interval); - res.end(); - }); -}); - -// start eventsource server -rest_server.listen(port, () => console.log(`EMS-ESP EventSource mock server running on http://localhost:${port}/`)); diff --git a/mock-api/mockServer.js b/mock-api/mockServer.js new file mode 100644 index 000000000..b75a49bf6 --- /dev/null +++ b/mock-api/mockServer.js @@ -0,0 +1,123 @@ +import formidable from 'formidable'; + +function pad(number) { + var r = String(number); + if (r.length === 1) { + r = '0' + r; + } + return r; +} + +// e.g. 2024-03-29 07:02:37.856 +Date.prototype.toISOString = function () { + return ( + this.getUTCFullYear() + + '-' + + pad(this.getUTCMonth() + 1) + + '-' + + pad(this.getUTCDate()) + + ' ' + + pad(this.getUTCHours()) + + ':' + + pad(this.getUTCMinutes()) + + ':' + + pad(this.getUTCSeconds()) + + '.' + + String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) + ); +}; + +export default () => { + return { + name: 'vite:mockserver', + configureServer: async (server) => { + server.middlewares.use(async (req, res, next) => { + // catch any file uploads + if (req.url.startsWith('/rest/uploadFile')) { + let progress = 0; + const file_size = req.headers['content-length']; + + req.on('data', async (chunk) => { + progress += chunk.length; + const percentage = (progress / file_size) * 100; + console.log(`Progress: ${Math.round(percentage)}%`); + // await new Promise((resolve) => setTimeout(() => resolve(), 3000)); // slow it down + }); + + const form = formidable({}); + let fields; + let files; + try { + [fields, files] = await form.parse(req); + } catch (err) { + console.error(err); + res.writeHead(err.httpCode || 400, { + 'Content-Type': 'text/plain' + }); + res.end(String(err)); + return; + } + + // only process when we have a file + if (Object.keys(files).length > 0) { + const uploaded_file = files.file[0]; + const file_name = uploaded_file.originalFilename; + const file_extension = file_name.substring( + file_name.lastIndexOf('.') + 1 + ); + + console.log('Filename: ' + file_name); + console.log('Extension: ' + file_extension); + console.log('File size: ' + file_size); + + if (file_extension === 'bin' || file_extension === 'json') { + console.log('File uploaded successfully!'); + } else if (file_extension === 'md5') { + console.log('MD5 hash generated successfully!'); + res.end( + JSON.stringify({ + md5: 'ef4304fc4d9025a58dcf25d71c882d2c' + }) + ); + } else { + res.statusCode = 400; + console.log('Invalid file extension!'); + } + } + + res.end(); + } + + // SSE Eventsource + else if (req.url.startsWith('/es/log')) { + res.writeHead(200, { + Connection: 'keep-alive', + 'Cache-Control': 'no-cache', + 'Content-Type': 'text/event-stream' + }); + + let count = 0; + const interval = setInterval(() => { + const data = { + t: new Date().toISOString(), + l: 3 + (count % 6), + i: count, + n: 'system', + m: 'message #' + count++ + }; + res.write(`data: ${JSON.stringify(data)}\n\n`); + }, 1000); + + // if client closes connection + res.on('close', () => { + console.log('Closing ES connection'); + clearInterval(interval); + res.end(); + }); + } else { + next(); // move on to the next middleware function in chain + } + }); + } + }; +}; diff --git a/mock-api/package.json b/mock-api/package.json index ceb516ae8..3a347032f 100644 --- a/mock-api/package.json +++ b/mock-api/package.json @@ -6,15 +6,16 @@ "license": "MIT", "scripts": { "mock-rest": "bun --watch rest_server.ts", - "mock-es": "bun --watch es_server.ts", - "mock-upload": "bun --watch upload_server.ts" + "format": "prettier -l -w '**/*.{ts,tsx,js,css,json,md}'" }, "dependencies": { "@msgpack/msgpack": "^2.8.0", - "@types/multer": "^1.4.11", - "express": "^4.19.2", + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "eslint": "^9.9.0", + "eslint-config-prettier": "^9.1.0", + "formidable": "^3.5.1", "itty-router": "^5.0.17", - "multer": "^1.4.5-lts.1" + "prettier": "^3.3.3" }, - "packageManager": "yarn@4.2.1" + "packageManager": "yarn@4.4.0" } diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts index 16ef11f18..f5ebe5f40 100644 --- a/mock-api/rest_server.ts +++ b/mock-api/rest_server.ts @@ -1,11 +1,22 @@ -import { AutoRouter, error, status } from 'itty-router'; import { Encoder } from '@msgpack/msgpack'; +import { AutoRouter, type ResponseHandler, error, status } from 'itty-router'; const encoder = new Encoder(); +const logger: ResponseHandler = (response, request) => { + console.log( + response.status, + request.url, + request.method, + 'at', + new Date().toLocaleString() + ); +}; + const router = AutoRouter({ port: 3080, missing: () => error(404, 'Error, endpoint not found') + // finally: [logger] }); const REST_ENDPOINT_ROOT = '/rest/'; @@ -43,7 +54,9 @@ function updateMask(entity: any, de: any, dd: any) { // find in dd, either looking for fullname or custom name // console.log('looking for ' + fullname + ' in ' + dd.data); - const dd_objIndex = dd.data.findIndex((obj: any) => obj.id.slice(2) === fullname); + const dd_objIndex = dd.data.findIndex( + (obj: any) => obj.id.slice(2) === fullname + ); if (dd_objIndex !== -1) { let changed = new Boolean(false); @@ -56,7 +69,13 @@ function updateMask(entity: any, de: any, dd: any) { // see if the custom name has changed const old_custom_name = dd.data[dd_objIndex].cn; - console.log('comparing names, old (' + old_custom_name + ') with new (' + new_custom_name + ')'); + console.log( + 'comparing names, old (' + + old_custom_name + + ') with new (' + + new_custom_name + + ')' + ); if (old_custom_name !== new_custom_name) { changed = true; new_fullname = new_custom_name; @@ -89,7 +108,8 @@ function updateMask(entity: any, de: any, dd: any) { if (new_max) { de[de_objIndex].ma = new_max; } - dd.data[dd_objIndex].id = current_mask.toString(16).padStart(2, '0') + new_fullname; + dd.data[dd_objIndex].id = + current_mask.toString(16).padStart(2, '0') + new_fullname; dd.data[dd_objIndex].cn = new_fullname; } } @@ -437,10 +457,13 @@ const EMSESP_DEVICEENTITIES_ENDPOINT2 = REST_ENDPOINT_ROOT + 'deviceEntities/:id const EMSESP_BOARDPROFILE_ENDPOINT = REST_ENDPOINT_ROOT + 'boardProfile'; const EMSESP_WRITE_DEVICEVALUE_ENDPOINT = REST_ENDPOINT_ROOT + 'writeDeviceValue'; const EMSESP_WRITE_DEVICENAME_ENDPOINT = REST_ENDPOINT_ROOT + 'writeDeviceName'; -const EMSESP_WRITE_TEMPSENSOR_ENDPOINT = REST_ENDPOINT_ROOT + 'writeTemperatureSensor'; +const EMSESP_WRITE_TEMPSENSOR_ENDPOINT = + REST_ENDPOINT_ROOT + 'writeTemperatureSensor'; const EMSESP_WRITE_ANALOGSENSOR_ENDPOINT = REST_ENDPOINT_ROOT + 'writeAnalogSensor'; -const EMSESP_CUSTOMIZATION_ENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customizationEntities'; -const EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'resetCustomizations'; +const EMSESP_CUSTOMIZATION_ENTITIES_ENDPOINT = + REST_ENDPOINT_ROOT + 'customizationEntities'; +const EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT = + REST_ENDPOINT_ROOT + 'resetCustomizations'; const EMSESP_SCHEDULE_ENDPOINT = REST_ENDPOINT_ROOT + 'schedule'; const EMSESP_CUSTOMENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'customEntities'; const EMSESP_MODULES_ENDPOINT = REST_ENDPOINT_ROOT + 'modules'; @@ -606,53 +629,53 @@ const emsesp_allvalues = { }; let settings = { - "locale": "en", - "tx_mode": 1, - "ems_bus_id": 11, - "syslog_enabled": false, - "syslog_level": 3, - "trace_raw": false, - "syslog_mark_interval": 0, - "syslog_host": "192.168.1.8", - "syslog_port": 514, - "boiler_heatingoff": false, - "remote_timeout": 24, - "remote_timeout_en": false, - "shower_timer": true, - "shower_alert": false, - "shower_alert_coldshot": 10, - "shower_alert_trigger": 7, - "shower_min_duration": 180, - "rx_gpio": 4, - "tx_gpio": 5, - "dallas_gpio": 14, - "dallas_parasite": false, - "led_gpio": 2, - "hide_led": true, - "low_clock": false, - "telnet_enabled": true, - "notoken_api": false, - "readonly_mode": false, - "analog_enabled": true, - "pbutton_gpio": 34, - "solar_maxflow": 30, - "board_profile": "E32V2", - "fahrenheit": false, - "bool_format": 1, - "bool_dashboard": 1, - "enum_format": 1, - "weblog_level": 6, - "weblog_buffer": 50, - "weblog_compact": true, - "phy_type": 1, - "eth_power": 15, - "eth_phy_addr": 0, - "eth_clock_mode": 1, - "platform": "ESP32R", - "modbus_enabled": false, - "modbus_port": 502, - "modbus_max_clients": 10, - "modbus_timeout": 10000 + locale: 'en', + tx_mode: 1, + ems_bus_id: 11, + syslog_enabled: false, + syslog_level: 3, + trace_raw: false, + syslog_mark_interval: 0, + syslog_host: '192.168.1.8', + syslog_port: 514, + boiler_heatingoff: false, + remote_timeout: 24, + remote_timeout_en: false, + shower_timer: true, + shower_alert: false, + shower_alert_coldshot: 10, + shower_alert_trigger: 7, + shower_min_duration: 180, + rx_gpio: 4, + tx_gpio: 5, + dallas_gpio: 14, + dallas_parasite: false, + led_gpio: 2, + hide_led: true, + low_clock: false, + telnet_enabled: true, + notoken_api: false, + readonly_mode: false, + analog_enabled: true, + pbutton_gpio: 34, + solar_maxflow: 30, + board_profile: 'E32V2', + fahrenheit: false, + bool_format: 1, + bool_dashboard: 1, + enum_format: 1, + weblog_level: 6, + weblog_buffer: 50, + weblog_compact: true, + phy_type: 1, + eth_power: 15, + eth_phy_addr: 0, + eth_clock_mode: 1, + platform: 'ESP32R', + modbus_enabled: false, + modbus_port: 502, + modbus_max_clients: 10, + modbus_timeout: 10000 }; const emsesp_devices = { @@ -719,7 +742,7 @@ const emsesp_devices = { t: 6, tn: 'Thermostat', url: 'thermostat' - }, + } ] }; @@ -806,37 +829,37 @@ const emsesp_coredata = { e: 22 }, { - "id": 8, - "tn": "Boiler/HP", - "t": 5, - "b": "", - "n": "Bosch Compress 7000i AW Heat Pump", - "d": 8, - "p": 172, - "v": "01.20", - "e": 152 + id: 8, + tn: 'Boiler/HP', + t: 5, + b: '', + n: 'Bosch Compress 7000i AW Heat Pump', + d: 8, + p: 172, + v: '01.20', + e: 152 }, { - "id": 9, - "tn": "Thermostat", - "t": 6, - "b": "", - "n": "RC100H", - "d": 56, - "p": 200, - "v": "40.07", - "e": 4 + id: 9, + tn: 'Thermostat', + t: 6, + b: '', + n: 'RC100H', + d: 56, + p: 200, + v: '40.07', + e: 4 }, { - "id": 10, - "tn": "Thermostat", - "t": 6, - "b": "", - "n": "RC310", - "d": 16, - "p": 158, - "v": "73.03", - "e": 63 + id: 10, + tn: 'Thermostat', + t: 6, + b: '', + n: 'RC310', + d: 16, + p: 158, + v: '73.03', + e: 63 } ] }; @@ -858,7 +881,7 @@ const emsesp_sensordata = { ts: [ { id: '28-233D-9497-0C03', n: 'Dallas 1', t: 25.7, o: 1.2, u: 1 }, { id: '28-243D-7437-1E3A', n: 'Dallas 2 outside', t: 26.1, o: 0, u: 1 }, - { id: '28-243E-7437-1E3B', n: 'Zolder', t: 27.1, o: 0, u: 16 }, + { id: '28-243E-7437-1E3B', n: 'Zolder', t: 27.1, o: 0, u: 1 }, { id: '28-183D-1892-0C33', n: 'Roof', o: 2, u: 1 } // no temperature ], // as: [], @@ -1238,7 +1261,19 @@ const emsesp_devicedata_1 = { u: 0, id: '00hc2 program', c: 'hc2/program', - l: ['own 1', 'family', 'morning', 'evening', 'am', 'pm', 'midday', 'singles', 'seniors', 'new', 'own 2'] + l: [ + 'own 1', + 'family', + 'morning', + 'evening', + 'am', + 'pm', + 'midday', + 'singles', + 'seniors', + 'new', + 'own 2' + ] }, { v: 0, @@ -1519,7 +1554,15 @@ const emsesp_devicedata_3 = { u: 0, id: '00boiler pump characteristic', c: 'pumpcharacter', - l: ['proportional', 'pressure1', 'pressure2', 'pressure3', 'pressure4', 'pressure5', 'pressure6'] + l: [ + 'proportional', + 'pressure1', + 'pressure2', + 'pressure3', + 'pressure4', + 'pressure5', + 'pressure6' + ] }, { v: 6, @@ -1759,7 +1802,16 @@ const emsesp_devicedata_3 = { u: 0, id: '00dhw circulation pump mode', c: 'dhw/circmode', - l: ['off', '1x3min', '2x3min', '3x3min', '4x3min', '5x3min', '6x3min', 'continuous'] + l: [ + 'off', + '1x3min', + '2x3min', + '3x3min', + '4x3min', + '5x3min', + '6x3min', + 'continuous' + ] }, { v: 'off', @@ -2086,7 +2138,13 @@ const emsesp_devicedata_7 = { { v: 'off', u: 0, id: '00fan' }, { v: 'off', u: 0, id: '00ignition' }, { v: 'off', u: 0, id: '00oil preheating' }, - { v: 'on', u: 0, id: '00heating activated', c: 'heatingactivated', l: ['off', 'on'] }, + { + v: 'on', + u: 0, + id: '00heating activated', + c: 'heatingactivated', + l: ['off', 'on'] + }, { v: 80, u: 1, id: '00heating temperature', c: 'heatingtemp' }, { v: 70, u: 3, id: '00burner pump max power', c: 'pumpmodmax' }, { v: 30, u: 3, id: '00burner pump min power', c: 'pumpmodmin' }, @@ -2107,17 +2165,47 @@ const emsesp_devicedata_7 = { { v: '0H', u: 0, id: '00service code' }, { v: 203, u: 0, id: '00service code number' }, { v: 'H00', u: 0, id: '00maintenance message' }, - { v: 'manual', u: 0, id: '00maintenance scheduled', c: 'maintenance', l: ['off', 'time', 'date', 'manual'] }, + { + v: 'manual', + u: 0, + id: '00maintenance scheduled', + c: 'maintenance', + l: ['off', 'time', 'date', 'manual'] + }, { v: 6000, u: 7, id: '00time to next maintenance', c: 'maintenancetime' }, - { v: '01.01.2012', u: 0, id: '00next maintenance date', c: 'maintenancedate', h: 'dd.mm.yyyy' }, - { v: 'on', u: 0, id: '00dhw turn on/off', c: 'dhw/tapactivated', l: ['off', 'on'] }, + { + v: '01.01.2012', + u: 0, + id: '00next maintenance date', + c: 'maintenancedate', + h: 'dd.mm.yyyy' + }, + { + v: 'on', + u: 0, + id: '00dhw turn on/off', + c: 'dhw/tapactivated', + l: ['off', 'on'] + }, { v: 62, u: 1, id: '00dhw set temperature' }, { v: 60, u: 1, id: '00dhw selected temperature', c: 'dhw/seltemp' }, { v: 'flow', u: 0, id: '00dhw type' }, - { v: 'hot', u: 0, id: '00dhw comfort', c: 'dhw/comfort', l: ['hot', 'eco', 'intelligent'] }, + { + v: 'hot', + u: 0, + id: '00dhw comfort', + c: 'dhw/comfort', + l: ['hot', 'eco', 'intelligent'] + }, { v: 40, u: 2, id: '00dhw flow temperature offset', c: 'dhw/flowtempoffset' }, { v: 100, u: 3, id: '00dhw max power', c: 'dhw/maxpower' }, - { v: 'off', u: 0, id: '00dhw circulation pump available', c: 'dhw/circpump', l: ['off', 'on'] }, + { + v: 'off', + u: 0, + id: '00dhw circulation pump available', + c: 'dhw/circpump', + l: ['off', 'on'] + }, { v: '3-way valve', u: 0, id: '00dhw charging type' }, { v: -5, u: 2, id: '00dhw hysteresis on temperature', c: 'dhw/hyston' }, { v: 0, u: 2, id: '00dhw hysteresis off temperature', c: 'dhw/hystoff' }, @@ -2127,15 +2215,42 @@ const emsesp_devicedata_7 = { u: 0, id: '00dhw circulation pump mode', c: 'dhw/circmode', - l: ['off', '1x3min', '2x3min', '3x3min', '4x3min', '5x3min', '6x3min', 'continuous'] + l: [ + 'off', + '1x3min', + '2x3min', + '3x3min', + '4x3min', + '5x3min', + '6x3min', + 'continuous' + ] + }, + { + v: 'off', + u: 0, + id: '00dhw circulation active', + c: 'dhw/circ', + l: ['off', 'on'] }, - { v: 'off', u: 0, id: '00dhw circulation active', c: 'dhw/circ', l: ['off', 'on'] }, { v: 47.3, u: 1, id: '00dhw current intern temperature' }, { v: 0, u: 4, id: '00dhw current tap water flow' }, { v: 47.3, u: 1, id: '00dhw storage intern temperature' }, { v: 'on', u: 0, id: '00dhw activated', c: 'dhw/activated', l: ['off', 'on'] }, - { v: 'off', u: 0, id: '00dhw one time charging', c: 'dhw/onetime', l: ['off', 'on'] }, - { v: 'off', u: 0, id: '00dhw disinfecting', c: 'dhw/disinfecting', l: ['off', 'on'] }, + { + v: 'off', + u: 0, + id: '00dhw one time charging', + c: 'dhw/onetime', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00dhw disinfecting', + c: 'dhw/disinfecting', + l: ['off', 'on'] + }, { v: 'off', u: 0, id: '00dhw charging' }, { v: 'off', u: 0, id: '00dhw recharging' }, { v: 'on', u: 0, id: '00dhw temperature ok' }, @@ -2148,1685 +2263,1496 @@ const emsesp_devicedata_7 = { }; const emsesp_devicedata_8 = { - "data": [ + data: [ { - "v": "", - "u": 0, - "id": "00reset", - "c": "reset", - "l": [ - "-", - "maintenance", - "error", - "history", - "message" + v: '', + u: 0, + id: '00reset', + c: 'reset', + l: ['-', 'maintenance', 'error', 'history', 'message'] + }, + { + v: 'off', + u: 0, + id: '00force heating off', + c: 'heatingoff', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00heating active' + }, + { + v: 'off', + u: 0, + id: '00tapwater active' + }, + { + v: 19, + u: 1, + id: '00selected flow temperature', + c: 'selflowtemp', + m: 0, + x: 90, + s: '1' + }, + { + v: 0, + u: 3, + id: '00heating pump modulation' + }, + { + v: 30.299999237060547, + u: 1, + id: '00outside temperature' + }, + { + v: 18.700000762939453, + u: 1, + id: '00current flow temperature' + }, + { + v: 21.399999618530273, + u: 1, + id: '00return temperature' + }, + { + v: 18.700000762939453, + u: 1, + id: '00low loss header' + }, + { + v: 'on', + u: 0, + id: '00heating activated', + c: 'heatingactivated', + l: ['off', 'on'] + }, + { + v: 85, + u: 1, + id: '00heating temperature', + c: 'heatingtemp', + m: 0, + x: 90, + s: '1' + }, + { + v: 'on', + u: 0, + id: '00heating pump' + }, + { + v: 44, + u: 3, + id: '00burner selected max power', + c: 'selburnpow', + m: 0, + x: 254, + s: '1' + }, + { + v: 45, + u: 3, + id: '00burner current power' + }, + { + v: 0, + u: 0, + id: '00burner starts' + }, + { + v: 0, + u: 8, + id: '00total burner operating time' + }, + { + v: 0, + u: 8, + id: '00burner stage 2 operating time' + }, + { + v: 0, + u: 8, + id: '00total heat operating time' + }, + { + v: 0, + u: 0, + id: '00burner starts heating' + }, + { + v: 764598, + u: 8, + id: '00total UBA operating time' + }, + { + v: 'A01(5453) 01.06.2023 09:23 - 01.06.2023 09:31', + u: 0, + id: '00last error code' + }, + { + v: ' 0H', + u: 0, + id: '00service code' + }, + { + v: 203, + u: 0, + id: '00service code number' + }, + { + v: 'off', + u: 0, + id: '00emergency operation', + c: 'emergencyops', + l: ['off', 'on'] + }, + { + v: 0, + u: 1, + id: '00emergency temperature', + c: 'emergencytemp', + m: 0, + x: 70, + s: '1' + }, + { + v: 763575, + u: 8, + id: '00heatpump total uptime' + }, + { + v: 309983, + u: 8, + id: '00total operating time heat' + }, + { + v: 203673, + u: 8, + id: '00operating time compressor heating' + }, + { + v: 29682, + u: 8, + id: '00operating time compressor cooling' + }, + { + v: 76627, + u: 8, + id: '00dhw operating time compressor' + }, + { + v: 0, + u: 8, + id: '00operating time compressor pool' + }, + { + v: 2054, + u: 0, + id: '00total compressor control starts' + }, + { + v: 1287, + u: 0, + id: '00heating control starts' + }, + { + v: 160, + u: 0, + id: '00cooling control starts' + }, + { + v: 607, + u: 0, + id: '00dhw control starts2' + }, + { + v: 0, + u: 0, + id: '00pool control starts' + }, + { + v: 5368, + u: 5, + id: '00total energy consumption' + }, + { + v: 5336, + u: 5, + id: '00total energy consumption compressor' + }, + { + v: 2977, + u: 5, + id: '00energy consumption compressor heating' + }, + { + v: 2047, + u: 5, + id: '00dhw energy consumption compressor' + }, + { + v: 295, + u: 5, + id: '00energy consumption compressor cooling' + }, + { + v: 0, + u: 5, + id: '00energy consumption compressor pool' + }, + { + v: 32, + u: 5, + id: '00total aux elec. heater energy consumption' + }, + { + v: 0, + u: 5, + id: '00aux elec. heater energy consumption heating' + }, + { + v: 32, + u: 5, + id: '00dhw aux elec. heater energy consumption' + }, + { + v: 0, + u: 5, + id: '00aux elec. heater energy consumption pool' + }, + { + v: 19052, + u: 5, + id: '00total energy supplied' + }, + { + v: 11053, + u: 5, + id: '00total energy supplied heating' + }, + { + v: 5978, + u: 5, + id: '00dhw total energy warm supplied' + }, + { + v: 2019, + u: 5, + id: '00total energy supplied cooling' + }, + { + v: 0, + u: 5, + id: '00total energy supplied pool' + }, + { + v: 4.5, + u: 11, + id: '00compressor power output' + }, + { + v: 100, + u: 3, + id: '00compressor max power', + c: 'hpmaxpower', + m: 0, + x: 100, + s: '1' + }, + { + v: 'off', + u: 0, + id: '00hp compressor' + }, + { + v: 'cooling', + u: 0, + id: '00compressor activity' + }, + { + v: 0, + u: 3, + id: '00brine pump speed' + }, + { + v: 'off', + u: 0, + id: '00switch valve' + }, + { + v: 45, + u: 3, + id: '00compressor speed' + }, + { + v: 33, + u: 3, + id: '00circulation pump speed' + }, + { + v: 0, + u: 1, + id: '00brine in/evaporator' + }, + { + v: 0, + u: 1, + id: '00brine out/condenser' + }, + { + v: 21.399999618530273, + u: 1, + id: '00heat carrier return (TC0)' + }, + { + v: 17.5, + u: 1, + id: '00heat carrier forward (TC1)' + }, + { + v: 18, + u: 1, + id: '00condenser temperature (TC3)' + }, + { + v: 51.599998474121094, + u: 1, + id: '00compressor temperature (TR1)' + }, + { + v: 14.600000381469727, + u: 1, + id: '00refrigerant temperature liquid side (condenser output) (TR3)' + }, + { + v: 37, + u: 1, + id: '00evaporator inlet temperature (TR4)' + }, + { + v: 20.200000762939453, + u: 1, + id: '00compressor inlet temperature (TR5)' + }, + { + v: 54.599998474121094, + u: 1, + id: '00compressor outlet temperature (TR6)' + }, + { + v: 29.600000381469727, + u: 1, + id: '00air inlet temperature (TL2)' + }, + { + v: 13.899999618530273, + u: 1, + id: '00low pressure side temperature (PL1)' + }, + { + v: 37.79999923706055, + u: 1, + id: '00high pressure side temperature (PH1)' + }, + { + v: 25.600000381469727, + u: 1, + id: '00drain pan temp (TA4)' + }, + { + v: 58.5, + u: 1, + id: '00reservoir temp (TW1)' + }, + { + v: 28, + u: 1, + id: '00pool set temperature', + c: 'poolsettemp', + m: 0, + x: 127, + s: '0.5' + }, + { + v: 'cooling & defrost', + u: 0, + id: '004-way valve (VR4)' + }, + { + v: 'off', + u: 0, + id: '00input 1 state' + }, + { + v: '000000000000000', + u: 0, + id: '00input 1 options', + c: 'hpin1opt', + h: '[]' + }, + { + v: 'off', + u: 0, + id: '00input 2 state' + }, + { + v: '000000000000000', + u: 0, + id: '00input 2 options', + c: 'hpin2opt', + h: '[]' + }, + { + v: 'off', + u: 0, + id: '00input 3 state' + }, + { + v: '000000000000000', + u: 0, + id: '00input 3 options', + c: 'hpin3opt', + h: '[]' + }, + { + v: 'off', + u: 0, + id: '00input 4 state' + }, + { + v: '000000000000', + u: 0, + id: '00input 4 options', + c: 'hpin4opt', + h: '[]' + }, + { + v: '6 kW', + u: 0, + id: '00heat limit compressor', + c: 'maxheatcomp', + l: ['0 kW', '2 kW', '3 kW', '4 kW', '6 kW', '9 kW'] + }, + { + v: '9 kW', + u: 0, + id: '00heat limit heating', + c: 'maxheatheat', + l: ['0 kW', '2 kW', '3 kW', '4 kW', '6 kW', '9 kW'] + }, + { + v: '9 kW', + u: 0, + id: '00dhw heat limit', + c: 'dhw/maxheat', + l: ['0 kW', '2 kW', '3 kW', '4 kW', '6 kW', '9 kW'] + }, + { + v: 'on', + u: 0, + id: '00manual defrost', + c: 'mandefrost', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00cooling only with PV', + c: 'pvcooling', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00aux heater only', + c: 'auxheateronly', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00disable aux heater', + c: 'auxheateroff', + l: ['off', 'on'] + }, + { + v: 0, + u: 3, + id: '00aux heater status' + }, + { + v: 500, + u: 21, + id: '00aux heater on delay', + c: 'auxheaterdelay', + m: 10, + x: 1000, + s: '10' + }, + { + v: 0, + u: 22, + id: '00aux heater max limit', + c: 'auxmaxlimit', + m: 0, + x: 10, + s: '0.1' + }, + { + v: 0.10000000149011612, + u: 22, + id: '00aux heater limit start', + c: 'auxlimitstart', + m: 0, + x: 10, + s: '0.1' + }, + { + v: 'eco', + u: 0, + id: '00aux heater mode', + c: 'auxheatrmode', + l: ['eco', 'comfort'] + }, + { + v: 0, + u: 21, + id: '00on/off hyst heat', + c: 'hphystheat', + m: 0, + x: 1500, + s: '5' + }, + { + v: 0, + u: 21, + id: '00on/off hyst cool', + c: 'hphystcool', + m: 0, + x: 1500, + s: '5' + }, + { + v: 1125, + u: 21, + id: '00on/off hyst pool', + c: 'hphystpool', + m: 50, + x: 1500, + s: '5' + }, + { + v: 'auto', + u: 0, + id: '00silent mode', + c: 'silentmode', + l: ['off', 'auto', 'on'] + }, + { + v: 1320, + u: 8, + id: '00silent mode from', + c: 'silentfrom', + m: 0, + x: 3810, + s: '15' + }, + { + v: 360, + u: 8, + id: '00silent mode to', + c: 'silentto', + m: 0, + x: 3810, + s: '15' + }, + { + v: -10, + u: 1, + id: '00min outside temp for silent mode', + c: 'mintempsilent', + m: -126, + x: 126, + s: '1' + }, + { + v: -5, + u: 1, + id: '00outside temp parallel mode', + c: 'tempparmode', + m: -126, + x: 126, + s: '1' + }, + { + v: 0, + u: 3, + id: '00aux heater mixing valve' + }, + { + v: 7, + u: 22, + id: '00temp diff TC3/TC0 heat', + c: 'tempdiffheat', + m: 2, + x: 10, + s: '0.1' + }, + { + v: 3, + u: 22, + id: '00temp diff TC3/TC0 cool', + c: 'tempdiffcool', + m: 2, + x: 10, + s: '0.1' + }, + { + v: 'off', + u: 0, + id: '00valve/pump cooling', + c: 'vpcooling', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00heating cable', + c: 'heatcable', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00VC0 valve', + c: 'vc0valve', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00primary heatpump', + c: 'primepump', + l: ['off', 'on'] + }, + { + v: 0, + u: 3, + id: '00primary heatpump modulation', + c: 'primepumpmod', + m: 0, + x: 100, + s: '1' + }, + { + v: 'off', + u: 0, + id: '003-way valve', + c: 'hp3way', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00el. heater step 1', + c: 'elheatstep1', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00el. heater step 2', + c: 'elheatstep2', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00el. heater step 3', + c: 'elheatstep3', + l: ['off', 'on'] + }, + { + v: 'off', + u: 0, + id: '00condensate reservoir heating (EA0)' + }, + { + v: 'auto', + u: 0, + id: '00primary heatpump mode', + c: 'hppumpmode', + l: ['auto', 'continuous'] + }, + { + v: '', + u: 0, + id: '00shutdown', + c: 'shutdown', + l: ['off', 'on'] + }, + { + v: 'on', + u: 0, + id: '00dhw alternating operation', + c: 'dhw/alternatingop', + l: ['off', 'on'] + }, + { + v: 35, + u: 8, + id: '00dhw prioritise heating during dhw', + c: 'dhw/altopprioheat', + m: 20, + x: 120, + s: '1' + }, + { + v: 45, + u: 8, + id: '00dhw prioritise dhw during heating', + c: 'dhw/altopprio', + m: 30, + x: 120, + s: '1' + }, + { + v: 57, + u: 1, + id: '00dhw comfort switch off', + c: 'dhw/comfoff', + m: 15, + x: 65, + s: '1' + }, + { + v: 54, + u: 1, + id: '00dhw eco switch off', + c: 'dhw/ecooff', + m: 15, + x: 65, + s: '1' + }, + { + v: 50, + u: 1, + id: '00dhw eco+ switch off', + c: 'dhw/ecoplusoff', + m: 48, + x: 63, + s: '1' + }, + { + v: 'off', + u: 0, + id: '00dhw circulation pump available during dhw', + c: 'dhw/hpcircpump', + l: ['off', 'on'] + }, + { + v: 54, + u: 1, + id: '00dhw set temperature' + }, + { + v: 45, + u: 1, + id: '00dhw selected temperature', + c: 'dhw/seltemp', + m: 0, + x: 254, + s: '1' + }, + { + v: 42, + u: 1, + id: '00dhw selected lower temperature', + c: 'dhw/seltemplow', + m: 0, + x: 254, + s: '1' + }, + { + v: 65, + u: 1, + id: '00dhw single charge temperature', + c: 'dhw/seltempsingle', + m: 0, + x: 254, + s: '1' + }, + { + v: 'high comfort', + u: 0, + id: '00dhw comfort mode', + c: 'dhw/comfort1', + l: ['high comfort', 'eco'] + }, + { + v: 25, + u: 2, + id: '00dhw flow temperature offset', + c: 'dhw/flowtempoffset', + m: 0, + x: 100, + s: '1' + }, + { + v: 56, + u: 1, + id: '00dhw maximum temperature', + c: 'dhw/maxtemp', + m: 0, + x: 80, + s: '1' + }, + { + v: 'on', + u: 0, + id: '00dhw circulation pump available', + c: 'dhw/circpump', + l: ['off', 'on'] + }, + { + v: -2, + u: 2, + id: '00dhw hysteresis on temperature', + c: 'dhw/hyston', + m: -126, + x: 126, + s: '1' + }, + { + v: 0, + u: 2, + id: '00dhw hysteresis off temperature', + c: 'dhw/hystoff', + m: -126, + x: 126, + s: '1' + }, + { + v: 65, + u: 1, + id: '00dhw disinfection temperature', + c: 'dhw/disinfectiontemp', + m: 60, + x: 80, + s: '1' + }, + { + v: '3x3min', + u: 0, + id: '00dhw circulation pump mode', + c: 'dhw/circmode', + l: [ + 'off', + '1x3min', + '2x3min', + '3x3min', + '4x3min', + '5x3min', + '6x3min', + 'continuous' ] }, { - "v": "off", - "u": 0, - "id": "00force heating off", - "c": "heatingoff", - "l": [ - "off", - "on" - ] + v: 'off', + u: 0, + id: '00dhw circulation active', + c: 'dhw/circ', + l: ['off', 'on'] }, { - "v": "off", - "u": 0, - "id": "00heating active" + v: 58.70000076293945, + u: 1, + id: '00dhw current intern temperature' }, { - "v": "off", - "u": 0, - "id": "00tapwater active" + v: 58.5, + u: 1, + id: '00dhw current extern temperature' }, { - "v": 19, - "u": 1, - "id": "00selected flow temperature", - "c": "selflowtemp", - "m": 0, - "x": 90, - "s": "1" + v: 0, + u: 4, + id: '00dhw current tap water flow' }, { - "v": 0, - "u": 3, - "id": "00heating pump modulation" + v: 'on', + u: 0, + id: '00dhw activated', + c: 'dhw/activated', + l: ['off', 'on'] }, { - "v": 30.299999237060547, - "u": 1, - "id": "00outside temperature" + v: 'off', + u: 0, + id: '00dhw one time charging', + c: 'dhw/onetime', + l: ['off', 'on'] }, { - "v": 18.700000762939453, - "u": 1, - "id": "00current flow temperature" + v: 'off', + u: 0, + id: '00dhw disinfecting', + c: 'dhw/disinfecting', + l: ['off', 'on'] }, { - "v": 21.399999618530273, - "u": 1, - "id": "00return temperature" + v: 'off', + u: 0, + id: '00dhw charging' }, { - "v": 18.700000762939453, - "u": 1, - "id": "00low loss header" + v: 'off', + u: 0, + id: '00dhw recharging' }, { - "v": "on", - "u": 0, - "id": "00heating activated", - "c": "heatingactivated", - "l": [ - "off", - "on" - ] + v: 'off', + u: 0, + id: '00dhw temperature ok' }, { - "v": 85, - "u": 1, - "id": "00heating temperature", - "c": "heatingtemp", - "m": 0, - "x": 90, - "s": "1" + v: 'off', + u: 0, + id: '00dhw 3-way valve active' }, { - "v": "on", - "u": 0, - "id": "00heating pump" + v: 0, + u: 0, + id: '00dhw starts' }, { - "v": 44, - "u": 3, - "id": "00burner selected max power", - "c": "selburnpow", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": 45, - "u": 3, - "id": "00burner current power" - }, - { - "v": 0, - "u": 0, - "id": "00burner starts" - }, - { - "v": 0, - "u": 8, - "id": "00total burner operating time" - }, - { - "v": 0, - "u": 8, - "id": "00burner stage 2 operating time" - }, - { - "v": 0, - "u": 8, - "id": "00total heat operating time" - }, - { - "v": 0, - "u": 0, - "id": "00burner starts heating" - }, - { - "v": 764598, - "u": 8, - "id": "00total UBA operating time" - }, - { - "v": "A01(5453) 01.06.2023 09:23 - 01.06.2023 09:31", - "u": 0, - "id": "00last error code" - }, - { - "v": " 0H", - "u": 0, - "id": "00service code" - }, - { - "v": 203, - "u": 0, - "id": "00service code number" - }, - { - "v": "off", - "u": 0, - "id": "00emergency operation", - "c": "emergencyops", - "l": [ - "off", - "on" - ] - }, - { - "v": 0, - "u": 1, - "id": "00emergency temperature", - "c": "emergencytemp", - "m": 0, - "x": 70, - "s": "1" - }, - { - "v": 763575, - "u": 8, - "id": "00heatpump total uptime" - }, - { - "v": 309983, - "u": 8, - "id": "00total operating time heat" - }, - { - "v": 203673, - "u": 8, - "id": "00operating time compressor heating" - }, - { - "v": 29682, - "u": 8, - "id": "00operating time compressor cooling" - }, - { - "v": 76627, - "u": 8, - "id": "00dhw operating time compressor" - }, - { - "v": 0, - "u": 8, - "id": "00operating time compressor pool" - }, - { - "v": 2054, - "u": 0, - "id": "00total compressor control starts" - }, - { - "v": 1287, - "u": 0, - "id": "00heating control starts" - }, - { - "v": 160, - "u": 0, - "id": "00cooling control starts" - }, - { - "v": 607, - "u": 0, - "id": "00dhw control starts2" - }, - { - "v": 0, - "u": 0, - "id": "00pool control starts" - }, - { - "v": 5368, - "u": 5, - "id": "00total energy consumption" - }, - { - "v": 5336, - "u": 5, - "id": "00total energy consumption compressor" - }, - { - "v": 2977, - "u": 5, - "id": "00energy consumption compressor heating" - }, - { - "v": 2047, - "u": 5, - "id": "00dhw energy consumption compressor" - }, - { - "v": 295, - "u": 5, - "id": "00energy consumption compressor cooling" - }, - { - "v": 0, - "u": 5, - "id": "00energy consumption compressor pool" - }, - { - "v": 32, - "u": 5, - "id": "00total aux elec. heater energy consumption" - }, - { - "v": 0, - "u": 5, - "id": "00aux elec. heater energy consumption heating" - }, - { - "v": 32, - "u": 5, - "id": "00dhw aux elec. heater energy consumption" - }, - { - "v": 0, - "u": 5, - "id": "00aux elec. heater energy consumption pool" - }, - { - "v": 19052, - "u": 5, - "id": "00total energy supplied" - }, - { - "v": 11053, - "u": 5, - "id": "00total energy supplied heating" - }, - { - "v": 5978, - "u": 5, - "id": "00dhw total energy warm supplied" - }, - { - "v": 2019, - "u": 5, - "id": "00total energy supplied cooling" - }, - { - "v": 0, - "u": 5, - "id": "00total energy supplied pool" - }, - { - "v": 4.5, - "u": 11, - "id": "00compressor power output" - }, - { - "v": 100, - "u": 3, - "id": "00compressor max power", - "c": "hpmaxpower", - "m": 0, - "x": 100, - "s": "1" - }, - { - "v": "off", - "u": 0, - "id": "00hp compressor" - }, - { - "v": "cooling", - "u": 0, - "id": "00compressor activity" - }, - { - "v": 0, - "u": 3, - "id": "00brine pump speed" - }, - { - "v": "off", - "u": 0, - "id": "00switch valve" - }, - { - "v": 45, - "u": 3, - "id": "00compressor speed" - }, - { - "v": 33, - "u": 3, - "id": "00circulation pump speed" - }, - { - "v": 0, - "u": 1, - "id": "00brine in/evaporator" - }, - { - "v": 0, - "u": 1, - "id": "00brine out/condenser" - }, - { - "v": 21.399999618530273, - "u": 1, - "id": "00heat carrier return (TC0)" - }, - { - "v": 17.5, - "u": 1, - "id": "00heat carrier forward (TC1)" - }, - { - "v": 18, - "u": 1, - "id": "00condenser temperature (TC3)" - }, - { - "v": 51.599998474121094, - "u": 1, - "id": "00compressor temperature (TR1)" - }, - { - "v": 14.600000381469727, - "u": 1, - "id": "00refrigerant temperature liquid side (condenser output) (TR3)" - }, - { - "v": 37, - "u": 1, - "id": "00evaporator inlet temperature (TR4)" - }, - { - "v": 20.200000762939453, - "u": 1, - "id": "00compressor inlet temperature (TR5)" - }, - { - "v": 54.599998474121094, - "u": 1, - "id": "00compressor outlet temperature (TR6)" - }, - { - "v": 29.600000381469727, - "u": 1, - "id": "00air inlet temperature (TL2)" - }, - { - "v": 13.899999618530273, - "u": 1, - "id": "00low pressure side temperature (PL1)" - }, - { - "v": 37.79999923706055, - "u": 1, - "id": "00high pressure side temperature (PH1)" - }, - { - "v": 25.600000381469727, - "u": 1, - "id": "00drain pan temp (TA4)" - }, - { - "v": 58.5, - "u": 1, - "id": "00reservoir temp (TW1)" - }, - { - "v": 28, - "u": 1, - "id": "00pool set temperature", - "c": "poolsettemp", - "m": 0, - "x": 127, - "s": "0.5" - }, - { - "v": "cooling & defrost", - "u": 0, - "id": "004-way valve (VR4)" - }, - { - "v": "off", - "u": 0, - "id": "00input 1 state" - }, - { - "v": "000000000000000", - "u": 0, - "id": "00input 1 options", - "c": "hpin1opt", - "h": "[]" - }, - { - "v": "off", - "u": 0, - "id": "00input 2 state" - }, - { - "v": "000000000000000", - "u": 0, - "id": "00input 2 options", - "c": "hpin2opt", - "h": "[]" - }, - { - "v": "off", - "u": 0, - "id": "00input 3 state" - }, - { - "v": "000000000000000", - "u": 0, - "id": "00input 3 options", - "c": "hpin3opt", - "h": "[]" - }, - { - "v": "off", - "u": 0, - "id": "00input 4 state" - }, - { - "v": "000000000000", - "u": 0, - "id": "00input 4 options", - "c": "hpin4opt", - "h": "[]" - }, - { - "v": "6 kW", - "u": 0, - "id": "00heat limit compressor", - "c": "maxheatcomp", - "l": [ - "0 kW", - "2 kW", - "3 kW", - "4 kW", - "6 kW", - "9 kW" - ] - }, - { - "v": "9 kW", - "u": 0, - "id": "00heat limit heating", - "c": "maxheatheat", - "l": [ - "0 kW", - "2 kW", - "3 kW", - "4 kW", - "6 kW", - "9 kW" - ] - }, - { - "v": "9 kW", - "u": 0, - "id": "00dhw heat limit", - "c": "dhw/maxheat", - "l": [ - "0 kW", - "2 kW", - "3 kW", - "4 kW", - "6 kW", - "9 kW" - ] - }, - { - "v": "on", - "u": 0, - "id": "00manual defrost", - "c": "mandefrost", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00cooling only with PV", - "c": "pvcooling", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00aux heater only", - "c": "auxheateronly", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00disable aux heater", - "c": "auxheateroff", - "l": [ - "off", - "on" - ] - }, - { - "v": 0, - "u": 3, - "id": "00aux heater status" - }, - { - "v": 500, - "u": 21, - "id": "00aux heater on delay", - "c": "auxheaterdelay", - "m": 10, - "x": 1000, - "s": "10" - }, - { - "v": 0, - "u": 22, - "id": "00aux heater max limit", - "c": "auxmaxlimit", - "m": 0, - "x": 10, - "s": "0.1" - }, - { - "v": 0.10000000149011612, - "u": 22, - "id": "00aux heater limit start", - "c": "auxlimitstart", - "m": 0, - "x": 10, - "s": "0.1" - }, - { - "v": "eco", - "u": 0, - "id": "00aux heater mode", - "c": "auxheatrmode", - "l": [ - "eco", - "comfort" - ] - }, - { - "v": 0, - "u": 21, - "id": "00on/off hyst heat", - "c": "hphystheat", - "m": 0, - "x": 1500, - "s": "5" - }, - { - "v": 0, - "u": 21, - "id": "00on/off hyst cool", - "c": "hphystcool", - "m": 0, - "x": 1500, - "s": "5" - }, - { - "v": 1125, - "u": 21, - "id": "00on/off hyst pool", - "c": "hphystpool", - "m": 50, - "x": 1500, - "s": "5" - }, - { - "v": "auto", - "u": 0, - "id": "00silent mode", - "c": "silentmode", - "l": [ - "off", - "auto", - "on" - ] - }, - { - "v": 1320, - "u": 8, - "id": "00silent mode from", - "c": "silentfrom", - "m": 0, - "x": 3810, - "s": "15" - }, - { - "v": 360, - "u": 8, - "id": "00silent mode to", - "c": "silentto", - "m": 0, - "x": 3810, - "s": "15" - }, - { - "v": -10, - "u": 1, - "id": "00min outside temp for silent mode", - "c": "mintempsilent", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": -5, - "u": 1, - "id": "00outside temp parallel mode", - "c": "tempparmode", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": 0, - "u": 3, - "id": "00aux heater mixing valve" - }, - { - "v": 7, - "u": 22, - "id": "00temp diff TC3/TC0 heat", - "c": "tempdiffheat", - "m": 2, - "x": 10, - "s": "0.1" - }, - { - "v": 3, - "u": 22, - "id": "00temp diff TC3/TC0 cool", - "c": "tempdiffcool", - "m": 2, - "x": 10, - "s": "0.1" - }, - { - "v": "off", - "u": 0, - "id": "00valve/pump cooling", - "c": "vpcooling", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00heating cable", - "c": "heatcable", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00VC0 valve", - "c": "vc0valve", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00primary heatpump", - "c": "primepump", - "l": [ - "off", - "on" - ] - }, - { - "v": 0, - "u": 3, - "id": "00primary heatpump modulation", - "c": "primepumpmod", - "m": 0, - "x": 100, - "s": "1" - }, - { - "v": "off", - "u": 0, - "id": "003-way valve", - "c": "hp3way", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00el. heater step 1", - "c": "elheatstep1", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00el. heater step 2", - "c": "elheatstep2", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00el. heater step 3", - "c": "elheatstep3", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00condensate reservoir heating (EA0)" - }, - { - "v": "auto", - "u": 0, - "id": "00primary heatpump mode", - "c": "hppumpmode", - "l": [ - "auto", - "continuous" - ] - }, - { - "v": "", - "u": 0, - "id": "00shutdown", - "c": "shutdown", - "l": [ - "off", - "on" - ] - }, - { - "v": "on", - "u": 0, - "id": "00dhw alternating operation", - "c": "dhw/alternatingop", - "l": [ - "off", - "on" - ] - }, - { - "v": 35, - "u": 8, - "id": "00dhw prioritise heating during dhw", - "c": "dhw/altopprioheat", - "m": 20, - "x": 120, - "s": "1" - }, - { - "v": 45, - "u": 8, - "id": "00dhw prioritise dhw during heating", - "c": "dhw/altopprio", - "m": 30, - "x": 120, - "s": "1" - }, - { - "v": 57, - "u": 1, - "id": "00dhw comfort switch off", - "c": "dhw/comfoff", - "m": 15, - "x": 65, - "s": "1" - }, - { - "v": 54, - "u": 1, - "id": "00dhw eco switch off", - "c": "dhw/ecooff", - "m": 15, - "x": 65, - "s": "1" - }, - { - "v": 50, - "u": 1, - "id": "00dhw eco+ switch off", - "c": "dhw/ecoplusoff", - "m": 48, - "x": 63, - "s": "1" - }, - { - "v": "off", - "u": 0, - "id": "00dhw circulation pump available during dhw", - "c": "dhw/hpcircpump", - "l": [ - "off", - "on" - ] - }, - { - "v": 54, - "u": 1, - "id": "00dhw set temperature" - }, - { - "v": 45, - "u": 1, - "id": "00dhw selected temperature", - "c": "dhw/seltemp", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": 42, - "u": 1, - "id": "00dhw selected lower temperature", - "c": "dhw/seltemplow", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": 65, - "u": 1, - "id": "00dhw single charge temperature", - "c": "dhw/seltempsingle", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": "high comfort", - "u": 0, - "id": "00dhw comfort mode", - "c": "dhw/comfort1", - "l": [ - "high comfort", - "eco" - ] - }, - { - "v": 25, - "u": 2, - "id": "00dhw flow temperature offset", - "c": "dhw/flowtempoffset", - "m": 0, - "x": 100, - "s": "1" - }, - { - "v": 56, - "u": 1, - "id": "00dhw maximum temperature", - "c": "dhw/maxtemp", - "m": 0, - "x": 80, - "s": "1" - }, - { - "v": "on", - "u": 0, - "id": "00dhw circulation pump available", - "c": "dhw/circpump", - "l": [ - "off", - "on" - ] - }, - { - "v": -2, - "u": 2, - "id": "00dhw hysteresis on temperature", - "c": "dhw/hyston", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": 0, - "u": 2, - "id": "00dhw hysteresis off temperature", - "c": "dhw/hystoff", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": 65, - "u": 1, - "id": "00dhw disinfection temperature", - "c": "dhw/disinfectiontemp", - "m": 60, - "x": 80, - "s": "1" - }, - { - "v": "3x3min", - "u": 0, - "id": "00dhw circulation pump mode", - "c": "dhw/circmode", - "l": [ - "off", - "1x3min", - "2x3min", - "3x3min", - "4x3min", - "5x3min", - "6x3min", - "continuous" - ] - }, - { - "v": "off", - "u": 0, - "id": "00dhw circulation active", - "c": "dhw/circ", - "l": [ - "off", - "on" - ] - }, - { - "v": 58.70000076293945, - "u": 1, - "id": "00dhw current intern temperature" - }, - { - "v": 58.5, - "u": 1, - "id": "00dhw current extern temperature" - }, - { - "v": 0, - "u": 4, - "id": "00dhw current tap water flow" - }, - { - "v": "on", - "u": 0, - "id": "00dhw activated", - "c": "dhw/activated", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00dhw one time charging", - "c": "dhw/onetime", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00dhw disinfecting", - "c": "dhw/disinfecting", - "l": [ - "off", - "on" - ] - }, - { - "v": "off", - "u": 0, - "id": "00dhw charging" - }, - { - "v": "off", - "u": 0, - "id": "00dhw recharging" - }, - { - "v": "off", - "u": 0, - "id": "00dhw temperature ok" - }, - { - "v": "off", - "u": 0, - "id": "00dhw 3-way valve active" - }, - { - "v": 0, - "u": 0, - "id": "00dhw starts" - }, - { - "v": 0, - "u": 8, - "id": "00dhw active time" + v: 0, + u: 8, + id: '00dhw active time' } ] - }; const emsesp_devicedata_9 = { - "data": [ + data: [ { - "v": 24, - "u": 1, - "id": "00hc1 room temperature from remote" + v: 24, + u: 1, + id: '00hc1 room temperature from remote' }, { - "v": 14, - "u": 1, - "id": "00hc1 dew point temperature" + v: 14, + u: 1, + id: '00hc1 dew point temperature' }, { - "v": 46, - "u": 3, - "id": "00hc1 relative air humidity" + v: 46, + u: 3, + id: '00hc1 relative air humidity' }, { - "v": 0, - "u": 2, - "id": "00hc1 internal temperature offset", - "c": "hc1/intoffset", - "m": -12, - "x": 12, - "s": "0.1" + v: 0, + u: 2, + id: '00hc1 internal temperature offset', + c: 'hc1/intoffset', + m: -12, + x: 12, + s: '0.1' } ] }; const emsesp_devicedata_10 = { - "data": [ + data: [ { - "v": "26.06.2024 14:49", - "u": 0, - "id": "00date/time", - "c": "datetime", - "h": "NTP | dd.mm.yyyy-hh:mm:ss-day(0-6)-dst(0/1)" + v: '26.06.2024 14:49', + u: 0, + id: '00date/time', + c: 'datetime', + h: 'NTP | dd.mm.yyyy-hh:mm:ss-day(0-6)-dst(0/1)' }, { - "v": 0, - "u": 2, - "id": "00internal temperature offset", - "c": "intoffset", - "m": -12, - "x": 12, - "s": "0.1" + v: 0, + u: 2, + id: '00internal temperature offset', + c: 'intoffset', + m: -12, + x: 12, + s: '0.1' }, { - "v": "off", - "u": 0, - "id": "00floor drying" + v: 'off', + u: 0, + id: '00floor drying' }, { - "v": 30.299999237060547, - "u": 1, - "id": "00damped outdoor temperature" + v: 30.299999237060547, + u: 1, + id: '00damped outdoor temperature' }, { - "v": 0, - "u": 1, - "id": "00floor drying temperature" + v: 0, + u: 1, + id: '00floor drying temperature' }, { - "v": "heavy", - "u": 0, - "id": "00building type", - "c": "building", - "l": [ - "light", - "medium", - "heavy" + v: 'heavy', + u: 0, + id: '00building type', + c: 'building', + l: ['light', 'medium', 'heavy'] + }, + { + v: -12, + u: 1, + id: '00minimal external temperature', + c: 'minexttemp', + m: -126, + x: 126, + s: '1' + }, + { + v: 'off', + u: 0, + id: '00damping outdoor temperature', + c: 'damping', + l: ['off', 'on'] + }, + { + v: 3.299999952316284, + u: 0, + id: '00energy cost ratio', + c: 'energycostratio', + m: 0, + x: 20, + s: '0.1' + }, + { + v: 'off', + u: 0, + id: '00enable raise dhw', + c: 'pvenabledhw', + l: ['off', 'on'] + }, + { + v: 3, + u: 22, + id: '00raise heating with PV', + c: 'pvraiseheat', + m: 0, + x: 5, + s: '1' + }, + { + v: 0, + u: 22, + id: '00lower cooling with PV', + c: 'pvlowercool', + m: -5, + x: 0, + s: '1' + }, + { + v: 21, + u: 1, + id: '00hc1 selected room temperature', + c: 'hc1/seltemp', + m: 0, + x: 30, + s: '0.5' + }, + { + v: 24, + u: 1, + id: '00hc1 current room temperature' + }, + { + v: 'roomTemp', + u: 0, + id: '00hc1 mqtt discovery current room temperature' + }, + { + v: 'manual', + u: 0, + id: '00hc1 mode', + c: 'hc1/mode', + l: ['manual', 'auto'] + }, + { + v: 'comfort', + u: 0, + id: '00hc1 mode type' + }, + { + v: 15, + u: 1, + id: '00hc1 eco temperature', + c: 'hc1/ecotemp', + m: 0, + x: 127, + s: '0.5' + }, + { + v: 22.5, + u: 1, + id: '00hc1 manual temperature', + c: 'hc1/manualtemp', + m: 0, + x: 127, + s: '0.5' + }, + { + v: 19, + u: 1, + id: '00hc1 comfort temperature', + c: 'hc1/comforttemp', + m: 0, + x: 127, + s: '0.5' + }, + { + v: 11, + u: 1, + id: '00hc1 summer temperature', + c: 'hc1/summertemp', + m: 10, + x: 30, + s: '1' + }, + { + v: 35, + u: 1, + id: '00hc1 design temperature', + c: 'hc1/designtemp', + m: 0, + x: 254, + s: '1' + }, + { + v: 0, + u: 2, + id: '00hc1 offset temperature', + c: 'hc1/offsettemp', + m: -126, + x: 126, + s: '1' + }, + { + v: 22, + u: 1, + id: '00hc1 min flow temperature', + c: 'hc1/minflowtemp', + m: 0, + x: 254, + s: '1' + }, + { + v: 60, + u: 1, + id: '00hc1 max flow temperature', + c: 'hc1/maxflowtemp', + m: 0, + x: 254, + s: '1' + }, + { + v: 0, + u: 2, + id: '00hc1 room influence', + c: 'hc1/roominfluence', + m: 0, + x: 254, + s: '1' + }, + { + v: 4, + u: 0, + id: '00hc1 room influence factor', + c: 'hc1/roominflfactor', + m: 0, + x: 25, + s: '0.1' + }, + { + v: 0, + u: 2, + id: '00hc1 current room influence' + }, + { + v: 'outdoor', + u: 0, + id: '00hc1 nofrost mode', + c: 'hc1/nofrostmode', + l: ['room', 'outdoor', 'room outdoor'] + }, + { + v: 2, + u: 1, + id: '00hc1 nofrost temperature', + c: 'hc1/nofrosttemp', + m: -126, + x: 126, + s: '1' + }, + { + v: 19, + u: 1, + id: '00hc1 target flow temperature' + }, + { + v: 'floor', + u: 0, + id: '00hc1 heating type', + c: 'hc1/heatingtype', + l: ['off', 'radiator', 'convector', 'floor'] + }, + { + v: 'auto', + u: 0, + id: '00hc1 heatpump operating mode', + c: 'hc1/hpoperatingmode', + l: ['off', 'auto', 'heating', 'cooling'] + }, + { + v: 'cooling', + u: 0, + id: '00hc1 heatpump operating state' + }, + { + v: 'weather compensated', + u: 0, + id: '00hc1 control mode', + c: 'hc1/controlmode', + l: [ + 'weather compensated', + 'outside basepoint', + 'n/a', + 'room', + 'power', + 'constant' ] }, { - "v": -12, - "u": 1, - "id": "00minimal external temperature", - "c": "minexttemp", - "m": -126, - "x": 126, - "s": "1" + v: 'prog 1', + u: 0, + id: '00hc1 program', + c: 'hc1/program', + l: ['prog 1', 'prog 2'] }, { - "v": "off", - "u": 0, - "id": "00damping outdoor temperature", - "c": "damping", - "l": [ - "off", - "on" - ] + v: -1, + u: 1, + id: '00hc1 temporary set temperature automode', + c: 'hc1/tempautotemp', + m: -1, + x: 30, + s: '0.5' }, { - "v": 3.299999952316284, - "u": 0, - "id": "00energy cost ratio", - "c": "energycostratio", - "m": 0, - "x": 20, - "s": "0.1" + v: 21, + u: 1, + id: '00hc1 temporary set temperature from remote' }, { - "v": "off", - "u": 0, - "id": "00enable raise dhw", - "c": "pvenabledhw", - "l": [ - "off", - "on" - ] + v: 0, + u: 3, + id: '00hc1 fast heatup', + c: 'hc1/fastheatup', + m: 0, + x: 100, + s: '1' }, { - "v": 3, - "u": 22, - "id": "00raise heating with PV", - "c": "pvraiseheat", - "m": 0, - "x": 5, - "s": "1" + v: 'off', + u: 0, + id: '00hc1 switch-on optimization', + c: 'hc1/switchonoptimization', + l: ['off', 'on'] }, { - "v": 0, - "u": 22, - "id": "00lower cooling with PV", - "c": "pvlowercool", - "m": -5, - "x": 0, - "s": "1" + v: 'reduce', + u: 0, + id: '00hc1 reduce mode', + c: 'hc1/reducemode', + l: ['outdoor', 'room', 'reduce'] }, { - "v": 21, - "u": 1, - "id": "00hc1 selected room temperature", - "c": "hc1/seltemp", - "m": 0, - "x": 30, - "s": "0.5" + v: -31, + u: 1, + id: '00hc1 no reduce below temperature', + c: 'hc1/noreducetemp', + m: -126, + x: 126, + s: '1' }, { - "v": 24, - "u": 1, - "id": "00hc1 current room temperature" + v: 5, + u: 1, + id: '00hc1 off/reduce switch temperature', + c: 'hc1/reducetemp', + m: -126, + x: 126, + s: '1' }, { - "v": "roomTemp", - "u": 0, - "id": "00hc1 mqtt discovery current room temperature" + v: 'off', + u: 0, + id: '00hc1 dhw priority', + c: 'hc1/dhwprio', + l: ['off', 'on'] }, { - "v": "manual", - "u": 0, - "id": "00hc1 mode", - "c": "hc1/mode", - "l": [ - "manual", - "auto" - ] + v: 'on', + u: 0, + id: '00hc1 cooling' }, { - "v": "comfort", - "u": 0, - "id": "00hc1 mode type" + v: 'heating&cooling', + u: 0, + id: '00hc1 HP Mode', + c: 'hc1/hpmode', + l: ['heating', 'cooling', 'heating&cooling'] }, { - "v": 15, - "u": 1, - "id": "00hc1 eco temperature", - "c": "hc1/ecotemp", - "m": 0, - "x": 127, - "s": "0.5" + v: 5, + u: 22, + id: '00hc1 dew point offset', + c: 'hc1/dewoffset', + m: 2, + x: 10, + s: '1' }, { - "v": 22.5, - "u": 1, - "id": "00hc1 manual temperature", - "c": "hc1/manualtemp", - "m": 0, - "x": 127, - "s": "0.5" + v: 1, + u: 22, + id: '00hc1 room temp difference', + c: 'hc1/roomtempdiff', + m: 0, + x: 254, + s: '1' }, { - "v": 19, - "u": 1, - "id": "00hc1 comfort temperature", - "c": "hc1/comforttemp", - "m": 0, - "x": 127, - "s": "0.5" + v: 11, + u: 1, + id: '00hc1 HP min. flow temp.', + c: 'hc1/hpminflowtemp', + m: 0, + x: 254, + s: '1' }, { - "v": 11, - "u": 1, - "id": "00hc1 summer temperature", - "c": "hc1/summertemp", - "m": 10, - "x": 30, - "s": "1" + v: 'RC100H', + u: 0, + id: '00hc1 control device', + c: 'hc1/control', + l: ['RC310', 'RC200', 'RC100', 'RC100H', 'TC100'] }, { - "v": 35, - "u": 1, - "id": "00hc1 design temperature", - "c": "hc1/designtemp", - "m": 0, - "x": 254, - "s": "1" + v: 1, + u: 7, + id: '00hc1 heat-on delay', + c: 'hc1/heatondelay', + m: 1, + x: 48, + s: '1' }, { - "v": 0, - "u": 2, - "id": "00hc1 offset temperature", - "c": "hc1/offsettemp", - "m": -126, - "x": 126, - "s": "1" + v: 1, + u: 7, + id: '00hc1 heat-off delay', + c: 'hc1/heatoffdelay', + m: 1, + x: 48, + s: '1' }, { - "v": 22, - "u": 1, - "id": "00hc1 min flow temperature", - "c": "hc1/minflowtemp", - "m": 0, - "x": 254, - "s": "1" + v: 1, + u: 22, + id: '00hc1 instant start', + c: 'hc1/instantstart', + m: 1, + x: 10, + s: '1' }, { - "v": 60, - "u": 1, - "id": "00hc1 max flow temperature", - "c": "hc1/maxflowtemp", - "m": 0, - "x": 254, - "s": "1" + v: 'normal', + u: 0, + id: '00dhw mode', + c: 'dhw/mode', + l: ['off', 'normal', 'comfort', 'auto', 'own prog'] }, { - "v": 0, - "u": 2, - "id": "00hc1 room influence", - "c": "hc1/roominfluence", - "m": 0, - "x": 254, - "s": "1" + v: 'on', + u: 0, + id: '00dhw circulation pump mode', + c: 'dhw/circmode', + l: ['off', 'on', 'auto', 'own prog'] }, { - "v": 4, - "u": 0, - "id": "00hc1 room influence factor", - "c": "hc1/roominflfactor", - "m": 0, - "x": 25, - "s": "0.1" + v: 15, + u: 8, + id: '00dhw charge duration', + c: 'dhw/chargeduration', + m: 0, + x: 3810, + s: '15' }, { - "v": 0, - "u": 2, - "id": "00hc1 current room influence" + v: 'off', + u: 0, + id: '00dhw charge', + c: 'dhw/charge', + l: ['off', 'on'] }, { - "v": "outdoor", - "u": 0, - "id": "00hc1 nofrost mode", - "c": "hc1/nofrostmode", - "l": [ - "room", - "outdoor", - "room outdoor" - ] + v: 0, + u: 1, + id: '00dhw extra' }, { - "v": 2, - "u": 1, - "id": "00hc1 nofrost temperature", - "c": "hc1/nofrosttemp", - "m": -126, - "x": 126, - "s": "1" + v: 'off', + u: 0, + id: '00dhw disinfecting', + c: 'dhw/disinfecting', + l: ['off', 'on'] }, { - "v": 19, - "u": 1, - "id": "00hc1 target flow temperature" + v: 'tu', + u: 0, + id: '00dhw disinfection day', + c: 'dhw/disinfectday', + l: ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'all'] }, { - "v": "floor", - "u": 0, - "id": "00hc1 heating type", - "c": "hc1/heatingtype", - "l": [ - "off", - "radiator", - "convector", - "floor" - ] + v: 120, + u: 8, + id: '00dhw disinfection time', + c: 'dhw/disinfecttime', + m: 0, + x: 1431, + s: '15' }, { - "v": "auto", - "u": 0, - "id": "00hc1 heatpump operating mode", - "c": "hc1/hpoperatingmode", - "l": [ - "off", - "auto", - "heating", - "cooling" - ] + v: 'off', + u: 0, + id: '00dhw daily heating', + c: 'dhw/dailyheating', + l: ['off', 'on'] }, { - "v": "cooling", - "u": 0, - "id": "00hc1 heatpump operating state" - }, - { - "v": "weather compensated", - "u": 0, - "id": "00hc1 control mode", - "c": "hc1/controlmode", - "l": [ - "weather compensated", - "outside basepoint", - "n/a", - "room", - "power", - "constant" - ] - }, - { - "v": "prog 1", - "u": 0, - "id": "00hc1 program", - "c": "hc1/program", - "l": [ - "prog 1", - "prog 2" - ] - }, - { - "v": -1, - "u": 1, - "id": "00hc1 temporary set temperature automode", - "c": "hc1/tempautotemp", - "m": -1, - "x": 30, - "s": "0.5" - }, - { - "v": 21, - "u": 1, - "id": "00hc1 temporary set temperature from remote" - }, - { - "v": 0, - "u": 3, - "id": "00hc1 fast heatup", - "c": "hc1/fastheatup", - "m": 0, - "x": 100, - "s": "1" - }, - { - "v": "off", - "u": 0, - "id": "00hc1 switch-on optimization", - "c": "hc1/switchonoptimization", - "l": [ - "off", - "on" - ] - }, - { - "v": "reduce", - "u": 0, - "id": "00hc1 reduce mode", - "c": "hc1/reducemode", - "l": [ - "outdoor", - "room", - "reduce" - ] - }, - { - "v": -31, - "u": 1, - "id": "00hc1 no reduce below temperature", - "c": "hc1/noreducetemp", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": 5, - "u": 1, - "id": "00hc1 off/reduce switch temperature", - "c": "hc1/reducetemp", - "m": -126, - "x": 126, - "s": "1" - }, - { - "v": "off", - "u": 0, - "id": "00hc1 dhw priority", - "c": "hc1/dhwprio", - "l": [ - "off", - "on" - ] - }, - { - "v": "on", - "u": 0, - "id": "00hc1 cooling" - }, - { - "v": "heating&cooling", - "u": 0, - "id": "00hc1 HP Mode", - "c": "hc1/hpmode", - "l": [ - "heating", - "cooling", - "heating&cooling" - ] - }, - { - "v": 5, - "u": 22, - "id": "00hc1 dew point offset", - "c": "hc1/dewoffset", - "m": 2, - "x": 10, - "s": "1" - }, - { - "v": 1, - "u": 22, - "id": "00hc1 room temp difference", - "c": "hc1/roomtempdiff", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": 11, - "u": 1, - "id": "00hc1 HP min. flow temp.", - "c": "hc1/hpminflowtemp", - "m": 0, - "x": 254, - "s": "1" - }, - { - "v": "RC100H", - "u": 0, - "id": "00hc1 control device", - "c": "hc1/control", - "l": [ - "RC310", - "RC200", - "RC100", - "RC100H", - "TC100" - ] - }, - { - "v": 1, - "u": 7, - "id": "00hc1 heat-on delay", - "c": "hc1/heatondelay", - "m": 1, - "x": 48, - "s": "1" - }, - { - "v": 1, - "u": 7, - "id": "00hc1 heat-off delay", - "c": "hc1/heatoffdelay", - "m": 1, - "x": 48, - "s": "1" - }, - { - "v": 1, - "u": 22, - "id": "00hc1 instant start", - "c": "hc1/instantstart", - "m": 1, - "x": 10, - "s": "1" - }, - { - "v": "normal", - "u": 0, - "id": "00dhw mode", - "c": "dhw/mode", - "l": [ - "off", - "normal", - "comfort", - "auto", - "own prog" - ] - }, - { - "v": "on", - "u": 0, - "id": "00dhw circulation pump mode", - "c": "dhw/circmode", - "l": [ - "off", - "on", - "auto", - "own prog" - ] - }, - { - "v": 15, - "u": 8, - "id": "00dhw charge duration", - "c": "dhw/chargeduration", - "m": 0, - "x": 3810, - "s": "15" - }, - { - "v": "off", - "u": 0, - "id": "00dhw charge", - "c": "dhw/charge", - "l": [ - "off", - "on" - ] - }, - { - "v": 0, - "u": 1, - "id": "00dhw extra" - }, - { - "v": "off", - "u": 0, - "id": "00dhw disinfecting", - "c": "dhw/disinfecting", - "l": [ - "off", - "on" - ] - }, - { - "v": "tu", - "u": 0, - "id": "00dhw disinfection day", - "c": "dhw/disinfectday", - "l": [ - "mo", - "tu", - "we", - "th", - "fr", - "sa", - "su", - "all" - ] - }, - { - "v": 120, - "u": 8, - "id": "00dhw disinfection time", - "c": "dhw/disinfecttime", - "m": 0, - "x": 1431, - "s": "15" - }, - { - "v": "off", - "u": 0, - "id": "00dhw daily heating", - "c": "dhw/dailyheating", - "l": [ - "off", - "on" - ] - }, - { - "v": 120, - "u": 8, - "id": "00dhw daily heating time", - "c": "dhw/dailyheattime", - "m": 0, - "x": 1431, - "s": "15" + v: 120, + u: 8, + id: '00dhw daily heating time', + c: 'dhw/dailyheattime', + m: 0, + x: 1431, + s: '15' } ] -} +}; const emsesp_devicedata_99 = { data: [ @@ -3953,7 +3879,7 @@ let emsesp_schedule = { flags: 132, time: '', cmd: 'system/message', - value: '\"hello world\"', + value: '"hello world"', name: 'immediate' } ] @@ -3962,35 +3888,36 @@ let emsesp_schedule = { // MODULES let emsesp_modules = { // 'modules': [] - "modules": [ + modules: [ { id: 1, - "key": "ModuleTest1", - "name": "Module Test 1", - "author": "proddy", - "version": "1.0.0", - "enabled": true, - "status": 1, - "message": "Running", - "license": "1234567890" + key: 'ModuleTest1', + name: 'Module Test 1', + author: 'proddy', + version: '1.0.0', + enabled: true, + status: 1, + message: 'Running', + license: '1234567890' }, { id: 2, - "key": "ModuleTest2", - "name": "Module Test 2", - "author": "proddy", - "version": "1.0.0", - "enabled": true, - "status": 2, - "message": "Running", - "license": "ABCDEFGHIJKL" - + key: 'ModuleTest2', + name: 'Module Test 2', + author: 'proddy', + version: '1.0.0', + enabled: true, + status: 2, + message: 'Running', + license: 'ABCDEFGHIJKL' } ] -} +}; // CUSTOMIZATION -const emsesp_deviceentities_1 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_1 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; const emsesp_deviceentities_2 = [ { @@ -4033,7 +3960,9 @@ const emsesp_deviceentities_2 = [ } ]; -const emsesp_deviceentities_3 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_3 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; const emsesp_deviceentities_4 = [ { @@ -4058,9 +3987,13 @@ const emsesp_deviceentities_4 = [ w: true } ]; -const emsesp_deviceentities_5 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_5 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; -const emsesp_deviceentities_6 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_6 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; const emsesp_deviceentities_7 = [ { u: 0, n: '!reset', id: 'reset', m: 8, w: false }, @@ -4101,13 +4034,25 @@ const emsesp_deviceentities_7 = [ { v: 553437, n: 'total burner operating time', id: 'burnworkmin', m: 0, w: false }, { v: 451286, n: 'total heat operating time', id: 'heatworkmin', m: 0, w: false }, { v: 4672175, n: 'total UBA operating time', id: 'ubauptime', m: 0, w: false }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', id: 'lastcode', m: 0, w: false }, + { + v: '1C(210) 06.06.2020 12:07 (0 min)', + n: 'last error code', + id: 'lastcode', + m: 0, + w: false + }, { v: '0H', n: 'service code', id: 'servicecode', m: 0, w: false }, { v: 203, n: 'service code number', id: 'servicecodenumber', m: 0, w: false }, { v: 'H00', n: 'maintenance message', id: 'maintenancemessage', m: 0, w: false }, { v: 'manual', n: 'maintenance scheduled', id: 'maintenance', m: 0, w: false }, { v: 6000, n: 'time to next maintenance', id: 'maintenancetime', m: 0, w: false }, - { v: '01.01.2012', n: 'next maintenance date', id: 'maintenancedate', m: 0, w: false }, + { + v: '01.01.2012', + n: 'next maintenance date', + id: 'maintenancedate', + m: 0, + w: false + }, { v: true, n: 'dhw turn on/off', id: 'dhw/tapactivated', m: 0, w: false }, { v: 62, n: 'dhw set temperature', id: 'dhw/settemp', m: 0, w: false }, { v: 60, n: 'dhw selected temperature', id: 'dhw/seltemp', m: 0, w: true }, @@ -4116,19 +4061,49 @@ const emsesp_deviceentities_7 = [ { n: 'dhw single charge temperature', id: 'dhw/seltempsingle', m: 2 }, { v: 'flow', n: 'dhw type', id: 'dhw/type', m: 0, w: false }, { v: 'hot', n: 'dhw comfort', id: 'dhw/comfort', m: 0, w: false }, - { v: 40, n: 'dhw flow temperature offset', id: 'dhw/flowtempoffset', m: 0, w: false }, + { + v: 40, + n: 'dhw flow temperature offset', + id: 'dhw/flowtempoffset', + m: 0, + w: false + }, { v: 100, n: 'dhw max power', id: 'dhw/maxpower', m: 0, w: false }, - { v: false, n: 'dhw circulation pump available', id: 'dhw/circpump', m: 0, w: false }, + { + v: false, + n: 'dhw circulation pump available', + id: 'dhw/circpump', + m: 0, + w: false + }, { v: '3-way valve', n: 'dhw charging type', id: 'dhw/chargetype', m: 0, w: false }, { v: -5, n: 'dhw hysteresis on temperature', id: 'dhw/hyston', m: 0, w: false }, { v: 0, n: 'dhw hysteresis off temperature', id: 'dhw/hystoff', m: 0, w: false }, - { v: 70, n: 'dhw disinfection temperature', id: 'dhw/disinfectiontemp', m: 0, w: false }, + { + v: 70, + n: 'dhw disinfection temperature', + id: 'dhw/disinfectiontemp', + m: 0, + w: false + }, { v: 'off', n: 'dhw circulation pump mode', id: 'dhw/circmode', m: 0, w: false }, { v: false, n: 'dhw circulation active', id: 'dhw/circ', m: 0, w: false }, - { v: 46.4, n: 'dhw current intern temperature', id: 'dhw/curtemp', m: 0, w: false }, + { + v: 46.4, + n: 'dhw current intern temperature', + id: 'dhw/curtemp', + m: 0, + w: false + }, { n: 'dhw current extern temperature', id: 'dhw/curtemp2', m: 2 }, { v: 0, n: 'dhw current tap water flow', id: 'dhw/curflow', m: 0, w: false }, - { v: 46.3, n: 'dhw storage intern temperature', id: 'dhw/storagetemp1', m: 0, w: false }, + { + v: 46.3, + n: 'dhw storage intern temperature', + id: 'dhw/storagetemp1', + m: 0, + w: false + }, { n: 'dhw storage extern temperature', id: 'dhw/storagetemp2', m: 2 }, { v: true, n: 'dhw activated', id: 'dhw/activated', m: 0, w: false }, { v: false, n: 'dhw one time charging', id: 'dhw/onetime', m: 0, w: false }, @@ -4145,13 +4120,21 @@ const emsesp_deviceentities_7 = [ { v: 102151, n: 'dhw active time', id: 'dhw/workm', m: 0, w: false } ]; -const emsesp_deviceentities_8 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_8 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; -const emsesp_deviceentities_9 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_9 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; -const emsesp_deviceentities_10 = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_10 = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; -const emsesp_deviceentities_none = [{ v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false }]; +const emsesp_deviceentities_none = [ + { v: 'dummy value', n: 'dummy name', id: 'dummy', m: 0, w: false } +]; // END DATA @@ -4273,6 +4256,8 @@ function deviceData(id: number) { return new Response(encoder.encode(emsesp_devicedata_7), { headers }); } if (id == 8) { + // test changing the selected flow temp on a Bosch Compress 7000i AW Heat Pump (Boiler/HP) + emsesp_devicedata_8.data[4].v = Math.floor(Math.random() * 100); return new Response(encoder.encode(emsesp_devicedata_8), { headers }); } if (id == 9) { @@ -4327,9 +4312,9 @@ router .get(EMSESP_SETTINGS_ENDPOINT, () => settings) .post(EMSESP_SETTINGS_ENDPOINT, async (request: any) => { settings = await request.json(); - console.log('settings saved', settings); - status(200); // no restart needed - // status(205); // restart needed + console.log('application settings saved', settings); + return status(200); // no restart needed + // return status(205); // restart needed }) // Device Dashboard Data @@ -4338,25 +4323,33 @@ router let sorted_devices = [...emsesp_coredata.devices].sort((a, b) => a.t - b.t); // append emsesp_coredata to sorted_devices so Custom is always at the end of the list sorted_devices.push(emsesp_coredata_custom); + // sorted_devices = []; // uncomment if simulating no decvices... return { connected: true, devices: sorted_devices }; }) - .get(EMSESP_SENSOR_DATA_ENDPOINT, () => emsesp_sensordata) + .get(EMSESP_SENSOR_DATA_ENDPOINT, () => { + // random change the zolder temperature 0-100 + emsesp_sensordata.ts[2].t = Math.floor(Math.random() * 100); + return emsesp_sensordata; + }) .get(EMSESP_DEVICES_ENDPOINT, () => { // sort by type const sorted_devices = emsesp_devices.devices.sort((a, b) => a.t - b.t); return { devices: sorted_devices }; - }) .get(EMSESP_DEVICEDATA_ENDPOINT1, (request) => request.query.id ? deviceData(Number(request.query.id)) : status(404) ) - .get(EMSESP_DEVICEDATA_ENDPOINT2, ({ params }) => (params.id ? deviceData(Number(params.id)) : status(404))) + .get(EMSESP_DEVICEDATA_ENDPOINT2, ({ params }) => + params.id ? deviceData(Number(params.id)) : status(404) + ) .get(EMSESP_DEVICEENTITIES_ENDPOINT1, (request) => request.query.id ? deviceEntities(Number(request.query.id)) : status(404) ) - .get(EMSESP_DEVICEENTITIES_ENDPOINT2, ({ params }) => (params.id ? deviceEntities(Number(params.id)) : status(404))) + .get(EMSESP_DEVICEENTITIES_ENDPOINT2, ({ params }) => + params.id ? deviceEntities(Number(params.id)) : status(404) + ) - // Customization + // Customizations .post(EMSESP_CUSTOMIZATION_ENTITIES_ENDPOINT, async (request: any) => { const content = await request.json(); const id = content.id; @@ -4392,7 +4385,7 @@ router .post(EMSESP_WRITE_DEVICENAME_ENDPOINT, async (request: any) => { const content = await request.json(); const id = content.id; - console.log("Renaming device ID " + id + " to " + content.name); + console.log('Renaming device ID ' + id + ' to ' + content.name); return status(200); }) @@ -4411,7 +4404,9 @@ router let modules = content.modules; for (let i = 0; i < modules.length; i++) { const key = modules[i].key; - const objIndex = emsesp_modules.modules.findIndex((obj: any) => obj.key === key); + const objIndex = emsesp_modules.modules.findIndex( + (obj: any) => obj.key === key + ); if (objIndex !== -1) { emsesp_modules.modules[objIndex].enabled = modules[i].enabled; emsesp_modules.modules[objIndex].license = modules[i].license; diff --git a/mock-api/upload_server.ts b/mock-api/upload_server.ts deleted file mode 100644 index 8893f2912..000000000 --- a/mock-api/upload_server.ts +++ /dev/null @@ -1,55 +0,0 @@ -import express from 'express'; -import multer from 'multer'; - -const rest_server = express(); -const port = 3082; -const upload = multer({ dest: './uploads' }); - -const UPLOAD_FILE_ENDPOINT = '/rest/uploadFile'; - -// delay functions, 2 different types -const delay = (ms) => new Promise((res) => setTimeout(res, ms)); -function delay_blocking(milliseconds) { - var start = new Date().getTime(); - while (true) { - if (new Date().getTime() - start > milliseconds) { - break; - } - } -} - -function progress_middleware(req, _res, next) { - let progress = 0; - const file_size = req.headers['content-length']; - console.log('Uploading file. Size ' + file_size + ' bytes'); - - // set event listener - req.on('data', async (chunk) => { - progress += chunk.length; - const percentage = (progress / file_size) * 100; - console.log(`Progress: ${Math.round(percentage)}%`); - // await delay(1000); // slow it down - delay_blocking(1000); // slow it down - }); - next(); // invoke next middleware which is multer -} - -rest_server.post(UPLOAD_FILE_ENDPOINT, progress_middleware, upload.single('file'), (req, res) => { - if (req.file) { - const filename = req.file.originalname; - const ext = filename.substring(filename.lastIndexOf('.') + 1); - console.log(req.file); - - if (ext === 'bin' || ext === 'json') { - console.log('Received firmware or json file, extension: ' + ext); - return res.sendStatus(200); - } else if (ext === 'md5') { - return res.json({ md5: 'ef4304fc4d9025a58dcf25d71c882d2c' }); - } - } - console.log('Invalid file extension'); - return res.sendStatus(400); -}); - -// start server -rest_server.listen(port, () => console.log(`EMS-ESP File Upload mock server running on http://localhost:${port}/`)); diff --git a/mock-api/yarn.lock b/mock-api/yarn.lock index 19c1fc853..67874dbc2 100644 --- a/mock-api/yarn.lock +++ b/mock-api/yarn.lock @@ -5,6 +5,279 @@ __metadata: version: 8 cacheKey: 10c0 +"@babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": "npm:^7.24.7" + picocolors: "npm:^1.0.0" + checksum: 10c0/ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + languageName: node + linkType: hard + +"@babel/generator@npm:7.17.7": + version: 7.17.7 + resolution: "@babel/generator@npm:7.17.7" + dependencies: + "@babel/types": "npm:^7.17.0" + jsesc: "npm:^2.5.1" + source-map: "npm:^0.5.0" + checksum: 10c0/8088453c4418e0ee6528506fbd5847bbdfd56327a0025ca9496a259261e162c594ffd08be0d63e74c32feced795616772f38acc5f5e493a86a45fd439fd9feb0 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.0": + version: 7.25.0 + resolution: "@babel/generator@npm:7.25.0" + dependencies: + "@babel/types": "npm:^7.25.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/d0e2dfcdc8bdbb5dded34b705ceebf2e0bc1b06795a1530e64fb6a3ccf313c189db7f60c1616effae48114e1a25adc75855bc4496f3779a396b3377bae718ce7 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/36ece78882b5960e2d26abf13cf15ff5689bf7c325b10a2895a74a499e712de0d305f8d78bb382dd3c05cfba7e47ec98fe28aab5674243e0625cd38438dd0b2d + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.23.0": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" + dependencies: + "@babel/template": "npm:^7.24.7" + "@babel/types": "npm:^7.24.7" + checksum: 10c0/e5e41e6cf86bd0f8bf272cbb6e7c5ee0f3e9660414174435a46653efba4f2479ce03ce04abff2aa2ef9359cf057c79c06cb7b134a565ad9c0e8a50dcdc3b43c4 + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/19ee37563bbd1219f9d98991ad0e9abef77803ee5945fd85aa7aa62a67c69efca9a801696a1b58dda27f211e878b3327789e6fd2a6f6c725ccefe36774b5ce95 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" + dependencies: + "@babel/types": "npm:^7.24.7" + checksum: 10c0/0254577d7086bf09b01bbde98f731d4fcf4b7c3fa9634fdb87929801307c1f6202a1352e3faa5492450fa8da4420542d44de604daf540704ff349594a78184f6 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 10c0/6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 10c0/87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.24.7" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + languageName: node + linkType: hard + +"@babel/parser@npm:^7.20.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.25.0": + version: 7.25.3 + resolution: "@babel/parser@npm:7.25.3" + dependencies: + "@babel/types": "npm:^7.25.2" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/874b01349aedb805d6694f867a752fdc7469778fad76aca4548d2cc6ce96087c3ba5fb917a6f8d05d2d1a74aae309b5f50f1a4dba035f5a2c9fcfe6e106d2c4e + languageName: node + linkType: hard + +"@babel/template@npm:^7.24.7": + version: 7.25.0 + resolution: "@babel/template@npm:7.25.0" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/parser": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + languageName: node + linkType: hard + +"@babel/traverse@npm:7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" + dependencies: + "@babel/code-frame": "npm:^7.22.13" + "@babel/generator": "npm:^7.23.0" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.23.0" + "@babel/types": "npm:^7.23.0" + debug: "npm:^4.1.0" + globals: "npm:^11.1.0" + checksum: 10c0/d096c7c4bab9262a2f658298a3c630ae4a15a10755bb257ae91d5ab3e3b2877438934859c8d34018b7727379fe6b26c4fa2efc81cf4c462a7fe00caf79fa02ff + languageName: node + linkType: hard + +"@babel/types@npm:7.17.0": + version: 7.17.0 + resolution: "@babel/types@npm:7.17.0" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.16.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/ad09224272b40fedb00b262677d12b6838f5b5df5c47d67059ba1181bd4805439993393a8de32459dae137b536d60ebfcaf39ae84d8b3873f1e81cc75f5aeae8 + languageName: node + linkType: hard + +"@babel/types@npm:^7.17.0, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2": + version: 7.25.2 + resolution: "@babel/types@npm:7.25.2" + dependencies: + "@babel/helper-string-parser": "npm:^7.24.8" + "@babel/helper-validator-identifier": "npm:^7.24.7" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/e489435856be239f8cc1120c90a197e4c2865385121908e5edb7223cfdff3768cba18f489adfe0c26955d9e7bbb1fb10625bc2517505908ceb0af848989bd864 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: "npm:^3.3.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.11.0": + version: 4.11.0 + resolution: "@eslint-community/regexpp@npm:4.11.0" + checksum: 10c0/0f6328869b2741e2794da4ad80beac55cba7de2d3b44f796a60955b0586212ec75e6b0253291fd4aad2100ad471d1480d8895f2b54f1605439ba4c875e05e523 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.17.1": + version: 0.17.1 + resolution: "@eslint/config-array@npm:0.17.1" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/b986a0a96f2b42467578968ce3d4ae3b9284e587f8490f2dcdc44ff1b8d30580c62b221da6e58d07b09e156c3050e2dc38267f9370521d9cafc099c4e30154ef + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/5b7332ed781edcfc98caa8dedbbb843abfb9bda2e86538529c843473f580e40c69eb894410eddc6702f487e9ee8f8cfa8df83213d43a8fdb549f23ce06699167 + languageName: node + linkType: hard + +"@eslint/js@npm:9.9.0": + version: 9.9.0 + resolution: "@eslint/js@npm:9.9.0" + checksum: 10c0/6ec9f1f0d576132444d6a5c66a8a08b0be9444e3ebb563fa6a6bebcf5299df3da7e454dc04c0fa601bb811197f00764b3a04430d8458cdb8e3a4677993d23f30 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.0 + resolution: "@humanwhocodes/retry@npm:0.3.0" + checksum: 10c0/7111ec4e098b1a428459b4e3be5a5d2a13b02905f805a2468f4fa628d072f0de2da26a27d04f65ea2846f73ba51f4204661709f05bfccff645e3cedef8781bb6 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + "@msgpack/msgpack@npm:^2.8.0": version: 2.8.0 resolution: "@msgpack/msgpack@npm:2.8.0" @@ -12,523 +285,559 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb languageName: node linkType: hard -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" +"@nodelib/fs.stat@npm:2.0.5": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.33": - version: 4.19.0 - resolution: "@types/express-serve-static-core@npm:4.19.0" +"@trivago/prettier-plugin-sort-imports@npm:^4.3.0": + version: 4.3.0 + resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/38a13dfbb38d18526276e68dae1097eb0ebef296e76bff2a9bf6831c052c2f87797e910c87bd3f0dd1a1b4136241c9d7c841779a00b22576d12aa9b483a63349 + "@babel/generator": "npm:7.17.7" + "@babel/parser": "npm:^7.20.5" + "@babel/traverse": "npm:7.23.2" + "@babel/types": "npm:7.17.0" + javascript-natural-sort: "npm:0.7.1" + lodash: "npm:^4.17.21" + peerDependencies: + "@vue/compiler-sfc": 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + "@vue/compiler-sfc": + optional: true + checksum: 10c0/42270fb9c89e54a3f8b6ac8c43e6d0e03350e2857e902cdad4de22c78ef1864da600525595311bc7e94e51c16c7dd3882c2e048a162fdab59761ffa893756aa2 languageName: node linkType: hard -"@types/express@npm:*": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn@npm:^8.12.0": + version: 8.12.1 + resolution: "acorn@npm:8.12.1" + bin: + acorn: bin/acorn + checksum: 10c0/51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 languageName: node linkType: hard -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 languageName: node linkType: hard -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc - languageName: node - linkType: hard - -"@types/multer@npm:^1.4.11": - version: 1.4.11 - resolution: "@types/multer@npm:1.4.11" +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" dependencies: - "@types/express": "npm:*" - checksum: 10c0/ace8e9f5ac7d2d7f6e0c35b790504f582a2f82a84cc06a7b90315527599b95256595bc0bb5bba60220c20a558554f0c21b96b94848b885987ab69512a3a9865e + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b languageName: node linkType: hard -"@types/node@npm:*": - version: 20.12.10 - resolution: "@types/node@npm:20.12.10" +"ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/2cc3b6ea09894ed1a3cf39f6491ec539281580f4ff83216e7d26ce85c83237fe0543c0ca49e25b2515ccdb6c8814b488d17a64a05f536dcaea94f9d32a60c7d7 + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 languageName: node linkType: hard -"@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 10c0/49c5ff75ca3adb18a1939310042d273c9fc55920861bd8e5100c8a923b3cda90d759e1a95e18334092da1c8f7b820084687770c83a1ccef04fb2c6908117c823 +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e languageName: node linkType: hard -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d languageName: node linkType: hard -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 languageName: node linkType: hard -"@types/serve-static@npm:*": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" dependencies: - "@types/http-errors": "npm:*" - "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 languageName: node linkType: hard -"accepts@npm:~1.3.5, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 languageName: node linkType: hard -"append-field@npm:^1.0.0": - version: 1.0.0 - resolution: "append-field@npm:1.0.0" - checksum: 10c0/1b5abcc227e5179936a9e4f7e2af4769fa1f00eda85bbaed907f7964b0fd1f7d61f0f332b35337f391389ff13dd5310c2546ba670f8e5a743b23ec85185c73ef - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c languageName: node linkType: hard -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"busboy@npm:^1.0.0": - version: 1.6.0 - resolution: "busboy@npm:1.6.0" +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" dependencies: - streamsearch: "npm:^1.1.0" - checksum: 10c0/fa7e836a2b82699b6e074393428b91ae579d4f9e21f5ac468e1b459a244341d722d2d22d10920cdd849743dbece6dca11d72de939fb75a7448825cf2babfba1f + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 languageName: node linkType: hard -"bytes@npm:3.0.0": - version: 3.0.0 - resolution: "bytes@npm:3.0.0" - checksum: 10c0/91d42c38601c76460519ffef88371caacaea483a354c8e4b8808e7b027574436a5713337c003ea3de63ee4991c2a9a637884fdfe7f761760d746929d9e8fec60 +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 languageName: node linkType: hard -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - -"compressible@npm:~2.0.16": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: "npm:>= 1.43.0 < 2" - checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 - languageName: node - linkType: hard - -"compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" - dependencies: - accepts: "npm:~1.3.5" - bytes: "npm:3.0.0" - compressible: "npm:~2.0.16" - debug: "npm:2.6.9" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.1.2" - vary: "npm:~1.1.2" - checksum: 10c0/138db836202a406d8a14156a5564fb1700632a76b6e7d1546939472895a5304f2b23c80d7a22bf44c767e87a26e070dbc342ea63bb45ee9c863354fa5556bbbc - languageName: node - linkType: hard - -"concat-stream@npm:^1.5.2": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 - languageName: node - linkType: hard - -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: 10c0/f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.4": +"color-name@npm:~1.1.4": version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 languageName: node linkType: hard -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c +"debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2": + version: 4.3.6 + resolution: "debug@npm:4.3.6" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 languageName: node linkType: hard -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c languageName: node linkType: hard -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 +"dezalgo@npm:^1.0.4": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 languageName: node linkType: hard -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard -"es-define-property@npm:^1.0.0": +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + +"eslint-scope@npm:^8.0.2": + version: 8.0.2 + resolution: "eslint-scope@npm:8.0.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/477f820647c8755229da913025b4567347fd1f0bf7cbdf3a256efff26a7e2e130433df052bd9e3d014025423dc00489bea47eb341002b15553673379c1a7dc36 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.0.0": + version: 4.0.0 + resolution: "eslint-visitor-keys@npm:4.0.0" + checksum: 10c0/76619f42cf162705a1515a6868e6fc7567e185c7063a05621a8ac4c3b850d022661262c21d9f1fc1d144ecf0d5d64d70a3f43c15c3fc969a61ace0fb25698cf5 + languageName: node + linkType: hard + +"eslint@npm:^9.9.0": + version: 9.9.0 + resolution: "eslint@npm:9.9.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.11.0" + "@eslint/config-array": "npm:^0.17.1" + "@eslint/eslintrc": "npm:^3.1.0" + "@eslint/js": "npm:9.9.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.3.0" + "@nodelib/fs.walk": "npm:^1.2.8" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.0.2" + eslint-visitor-keys: "npm:^4.0.0" + espree: "npm:^10.1.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/3a22f68c99d75dcbafe6e2fef18d2b5bbcc960c2437f48a414ccf9ca214254733a18e6b79d07bbd374a2369a648413e421aabd07b11be3de5a44d5a4b9997877 + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.1.0": + version: 10.1.0 + resolution: "espree@npm:10.1.0" + dependencies: + acorn: "npm:^8.12.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.0.0" + checksum: 10c0/52e6feaa77a31a6038f0c0e3fce93010a4625701925b0715cd54a2ae190b3275053a0717db698697b32653788ac04845e489d6773b508d6c2e8752f3c57470a0 + languageName: node + linkType: hard + +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"formidable@npm:^3.5.1": + version: 3.5.1 + resolution: "formidable@npm:3.5.1" + dependencies: + dezalgo: "npm:^1.0.4" + hexoid: "npm:^1.0.0" + once: "npm:^1.4.0" + checksum: 10c0/c02fa1a027876dd9fc5abde16e9c537bec41bc652b362d0b3fd26daaae0615b9a472129c29b328a130d11f543f676acd1b13e6f28f3adc1b088cdaea9fb9e054 + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"hexoid@npm:^1.0.0": version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" + resolution: "hexoid@npm:1.0.0" + checksum: 10c0/9c45e8ba676b9eb88455631ebceec4c829a8374a583410dc735472ab9808bf11339fcd074633c3fa30e420901b894d8a92ffd5e2e21eddd41149546e05a91f69 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 languageName: node linkType: hard -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 languageName: node linkType: hard -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 languageName: node linkType: hard -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 - languageName: node - linkType: hard - -"express@npm:^4.19.2": - version: 4.19.2 - resolution: "express@npm:4.19.2" +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10c0/64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7 +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 languageName: node linkType: hard -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": +"isexe@npm:^2.0.0": version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d languageName: node linkType: hard @@ -539,67 +848,109 @@ __metadata: languageName: node linkType: hard -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 +"javascript-natural-sort@npm:0.7.1": + version: 0.7.1 + resolution: "javascript-natural-sort@npm:0.7.1" + checksum: 10c0/340f8ffc5d30fb516e06dc540e8fa9e0b93c865cf49d791fed3eac3bdc5fc71f0066fc81d44ec1433edc87caecaf9f13eec4a1fce8c5beafc709a71eaedae6fe languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e languageName: node linkType: hard -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.4": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 languageName: node linkType: hard @@ -608,326 +959,270 @@ __metadata: resolution: "mock-api@workspace:." dependencies: "@msgpack/msgpack": "npm:^2.8.0" - "@types/multer": "npm:^1.4.11" - compression: "npm:^1.7.4" - express: "npm:^4.19.2" + "@trivago/prettier-plugin-sort-imports": "npm:^4.3.0" + eslint: "npm:^9.9.0" + eslint-config-prettier: "npm:^9.1.0" + formidable: "npm:^3.5.1" itty-router: "npm:^5.0.17" - multer: "npm:^1.4.5-lts.1" + prettier: "npm:^3.3.3" languageName: unknown linkType: soft -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"multer@npm:^1.4.5-lts.1": - version: 1.4.5-lts.1 - resolution: "multer@npm:1.4.5-lts.1" - dependencies: - append-field: "npm:^1.0.0" - busboy: "npm:^1.0.0" - concat-stream: "npm:^1.5.2" - mkdirp: "npm:^0.5.4" - object-assign: "npm:^4.1.1" - type-is: "npm:^1.6.4" - xtend: "npm:^4.0.0" - checksum: 10c0/4c6c91e93e510c99e791b6520e3e2f4a227a57f4f509427ff7f3a6f4cc0b4b09ad77c475f629c12f7ae01dba11645b2bd6568877cab775de8bf853b0a67259b4 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 10c0/fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f - languageName: node - linkType: hard - -"parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f - languageName: node - linkType: hard - -"range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"readable-stream@npm:^2.2.2": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3": +"ms@npm:2.1.2": version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10c0/0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 10c0/fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 languageName: node linkType: hard -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a languageName: node linkType: hard -"setprototypeof@npm:1.2.0": +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10c0/c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier@npm:^3.3.3": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" + resolution: "run-parallel@npm:1.2.0" dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 languageName: node linkType: hard -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"streamsearch@npm:^1.1.0": - version: 1.1.0 - resolution: "streamsearch@npm:1.1.0" - checksum: 10c0/fbd9aecc2621364384d157f7e59426f4bfd385e8b424b5aaa79c83a6f5a1c8fd2e4e3289e95de1eb3511cb96bb333d6281a9919fafce760e4edb35b2cd2facab - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e languageName: node linkType: hard -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 languageName: node linkType: hard -"type-is@npm:^1.6.4, type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" +"source-map@npm:^0.5.0": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 languageName: node linkType: hard -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 languageName: node linkType: hard -"util-deprecate@npm:~1.0.1": +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrappy@npm:1": version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 languageName: node linkType: hard -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 - languageName: node - linkType: hard - -"vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f - languageName: node - linkType: hard - -"xtend@npm:^4.0.0": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard diff --git a/pio_local.ini_example b/pio_local.ini_example index d99543c7d..2283a7d4e 100644 --- a/pio_local.ini_example +++ b/pio_local.ini_example @@ -19,6 +19,7 @@ ; default_envs = esp32_4M ; default_envs = esp32_16M default_envs = lolin_s3 +; default_envs = lolin_c3_mini ; default_envs = native ; default_envs = debug ; default_envs = custom @@ -26,11 +27,11 @@ default_envs = lolin_s3 [env] ; upload settings ; for USB -upload_protocol = esptool -upload_port = /dev/ttyUSB* +; upload_protocol = esptool +; upload_port = /dev/ttyUSB* ; for OTA add scripts/upload.py to extra_scripts -; upload_protocol = custom -custom_emsesp_ip = 10.10.10.173 +upload_protocol = custom +custom_emsesp_ip = 10.10.10.175 ; custom_emsesp_ip = ems-esp.local custom_username = admin custom_password = admin @@ -42,59 +43,25 @@ custom_password = admin [env:native] extra_scripts = ; pre:scripts/refresh_module_library_native.py -; post:scripts/run_native.py - -[env:esp32_4M] -extra_scripts = -; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time - scripts/rename_fw.py -; scripts/upload.py + post:scripts/run_native.py [env:lolin_s3] extra_scripts = -; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time scripts/rename_fw.py -; scripts/upload.py + scripts/upload.py [env:esp32_16M] extra_scripts = -; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time scripts/rename_fw.py ; scripts/upload.py -[env:custom] -; use for basic ESP boards with 4MB flash -; make sure -D TASMOTA_SDK is also enabled -platform = https://github.com/tasmota/platform-espressif32/releases/download/2024.01.00/platform-espressif32.zip -; use for S3 boards: -; platform = espressif32 -framework = arduino -board = esp32dev -board_build.filesystem = littlefs -board_build.f_cpu = 240000000L -board_upload.flash_size = 4MB -board_build.partitions = esp32_partition_4M.csv -board_upload.use_1200bps_touch = false -board_upload.wait_for_upload_port = true -upload_port = /dev/ttyUSB0 -extra_scripts = - pre:scripts/build_interface.py - scripts/rename_fw.py -build_unflags = ${common.unbuild_flags} -build_flags = - ${common.core_build_flags} - ${factory_settings.build_flags} - ${common.my_build_flags} - -D ONEWIRE_CRC16=0 - -D NO_GLOBAL_ARDUINOOTA - -D ARDUINOJSON_ENABLE_STD_STRING=1 - -D TASMOTA_SDK - ; -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_WARN - -D EMSESP_TEST - -D EMSESP_DEBUG - -D CONFIG_ETH_ENABLED - -D CONFIG_ASYNC_TCP_STACK_SIZE=8192 - '-DEMSESP_DEFAULT_BOARD_PROFILE="Test"' +[env:lolin_c3_mini] +extra_scripts = +; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + scripts/rename_fw.py + scripts/upload.py ; pio run -e debug ; or from Visual Studio Code do PIO -> Project Tasks -> debug -> General -> Upload and Monitor diff --git a/platformio.ini b/platformio.ini index a40812d37..fcd80b0e3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -215,6 +215,8 @@ build_unflags = ${common.unbuild_flags} ; ; It will generate an executbale which when run will show the EMS-ESP Console where you can run tests using the `test` command. ; +; See https://docs.platformio.org/en/latest/core/installation/shell-commands.html#piocore-install-shell-commands +; ; to build and run directly on linux: pio run -e native -t exec ; ; to build and run on Windows, it needs winsock for the console input so: @@ -245,7 +247,6 @@ build_src_flags = -I./lib/espMqttClient/src/Transport build_src_filter = +<*> - -<.git/> +<../lib_standalone> +<../lib/uuid-common> +<../lib/uuid-console> diff --git a/scripts/run_native.py b/scripts/run_native.py index dc786953d..fc81a0a03 100644 --- a/scripts/run_native.py +++ b/scripts/run_native.py @@ -1,11 +1,60 @@ +import shutil +import re import os - Import("env") -def run_native(): - print("Running native...") - os.system("pio run -e native") +OUTPUT_DIR = "build{}".format(os.path.sep) -if not (env.IsCleanTarget()): - run_native() +def move_file(source, target, env): + + # get the build info + bag = {} + exprs = [(re.compile(r'^#define EMSESP_APP_VERSION\s+"(\S+)"'), 'app_version')] + with open('./src/version.h', 'r') as f: + for l in f.readlines(): + for expr, var in exprs: + m = expr.match(l) + if m and len(m.groups()) > 0: + bag[var] = m.group(1) + + app_version = bag.get('app_version') + platform = "native" + + # this breaks the CI so removed + # flash_size = env["PIOENV"].split('_')[1] + + # print(env.Dump()) + # my_flags = env.ParseFlags(env['BUILD_FLAGS']) + # defines = {k: v for (k, v) in my_flags.get("CPPDEFINES")} + # print(my_flags) + # print(my_flags.get("CPPDEFINES") + + # alternatively take platform from the pio target + # platform = str(target[0]).split(os.path.sep)[2] + + print("app version: " + app_version) + print("platform: " + platform) + + # TODO do I need .exe for windows? + variant = "native" + + # check if output directories exist and create if necessary + if not os.path.isdir(OUTPUT_DIR): + os.mkdir(OUTPUT_DIR) + + # create string with location and file names based on variant + bin_file = "{}firmware{}{}".format(OUTPUT_DIR, os.path.sep, variant) + + # check if new target files exist and remove if necessary + for f in [bin_file]: + if os.path.isfile(f): + os.remove(f) + + print("Renaming file to "+bin_file) + + shutil.copy(str(target[0]), bin_file) + print("Executing file") + os.system(bin_file) + +env.AddPostAction("$BUILD_DIR/${PROGNAME}", [move_file]) diff --git a/src/command.cpp b/src/command.cpp index 5f5d3a064..2cce5161f 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -418,7 +418,7 @@ uint8_t Command::call(const uint8_t device_type, const char * command, const cha LOG_WARNING(error); } else { if (single_command) { - // log as DEBUG (TRACE) regarless if compiled with EMSESP_DEBUG + // log as DEBUG (TRACE) regardless if compiled with EMSESP_DEBUG logger_.debug(("%sCalled command %s"), ro.c_str(), info_s); } else { if (id > 0) { diff --git a/src/console.cpp b/src/console.cpp index 3a3642820..98c163876 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -691,11 +691,16 @@ std::string EMSESPShell::context_text() { // when in su (admin) show # as the prompt suffix std::string EMSESPShell::prompt_suffix() { +#ifndef EMSESP_UNITY if (has_flags(CommandFlags::ADMIN)) { return std::string{'#'}; } else { return std::string{'$'}; } +#else + // don't bother with prompt suffix if we're testing Unity output + return ""; +#endif } void EMSESPShell::end_of_transmission() { diff --git a/src/emsesp.cpp b/src/emsesp.cpp index b3e77fbeb..ada971520 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1553,8 +1553,6 @@ void EMSESP::start() { #if defined(EMSESP_STANDALONE) shell_->add_flags(CommandFlags::ADMIN); // always start in su/admin mode when running tests #endif -#else -#warning "Shell is disabled when running Unity tests." #endif // start the file system diff --git a/src/system.cpp b/src/system.cpp index 11ca28e8f..00825a685 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1397,8 +1397,13 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output JsonObject node; // System - node = output["system"].to(); - node["version"] = EMSESP_APP_VERSION; + node = output["system"].to(); +// prevent false negataive in Unity tests everytime the version changes +#if defined(EMSESP_UNITY) + node["version"] = "dev"; +#else + node["version"] = EMSESP_APP_VERSION; +#endif node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); node["uptimeSec"] = uuid::get_uptime_sec(); #ifndef EMSESP_STANDALONE diff --git a/src/test/test.cpp b/src/test/test.cpp index d3ac94cd8..b6cfc4e28 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -1109,6 +1109,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const Serial.println(); Serial.printf("%s**** Testing bad urls ****\n%s", COLOR_RED, COLOR_RESET); + request.method(HTTP_GET); + request.url("/api/boiler2"); EMSESP::webAPIService.webAPIService(&request); diff --git a/src/version.h b/src/version.h index ba296a87f..ef0dce791 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.7.0-dev.30" +#define EMSESP_APP_VERSION "3.7.0-dev.31" diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index d14c1cfaa..296f3f4e1 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -134,7 +134,7 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject input) { const char * api_data = output["api_data"]; if (api_data) { request->send(200, "text/plain; charset=utf-8", api_data); -#if defined(EMSESP_TEST) +#if defined(EMSESP_UNITY) // store the result so we can test with Unity later storeResponse(output); #endif @@ -161,7 +161,7 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject input) { request->send(response); api_count_++; -#if defined(EMSESP_TEST) +#if defined(EMSESP_UNITY) // store the result so we can test with Unity later storeResponse(output); #endif @@ -229,7 +229,7 @@ void WebAPIService::getEntities(AsyncWebServerRequest * request) { request->send(response); } -#if defined(EMSESP_TEST) +#if defined(EMSESP_UNITY) // store the result so we can test with Unity later static JsonDocument storeResponseDoc_; diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 86239f466..da96e6611 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -210,7 +210,7 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request) { #endif #if defined(EMSESP_DEBUG) size_t length = response->setLength(); - EMSESP::logger().debug("Customization buffer used: %d", length); + EMSESP::logger().debug("Customizations buffer used: %d", length); #else response->setLength(); #endif diff --git a/test/test_api/test_api.cpp b/test/test_api/test_api.cpp index a18701d0d..f62ac0c6d 100644 --- a/test/test_api/test_api.cpp +++ b/test/test_api/test_api.cpp @@ -27,15 +27,42 @@ using namespace emsesp; +// forward declarations +void run_tests(); +const char * call_url(const char * url); + AsyncWebServer * webServer; ESP8266React * esp8266React; WebAPIService * webAPIService; EMSESP application; FS dummyFS; -// forward declarations -void run_tests(); -const char * call_url(const char * url); +std::shared_ptr shell; +char output_buffer[4096]; + +class TestStream : public Stream { + public: + int available() override { + return 1; + } + int read() override { + return '\n'; + }; + int peek() override { + return '\n'; + }; + size_t write(uint8_t data __attribute__((unused))) override { + return 1; + } + size_t write(const uint8_t * buffer __attribute__((unused)), size_t size) override { + strcat(output_buffer, (const char *)buffer); // store output in our temp buffer, strings only + return size; + } + void flush() override { + output_buffer[0] = '\0'; // empty the temp buffer + } +}; +static TestStream stream; // load the tests // this is generated from this file when compiled with -DEMSESP_UNITY_CREATE @@ -248,23 +275,49 @@ void run_manual_tests() { RUN_TEST(manual_test4); } -// Main entry point -int main() { - webServer = new AsyncWebServer(80); - esp8266React = new ESP8266React(webServer, &dummyFS); - webAPIService = new WebAPIService(webServer, esp8266React->getSecurityManager()); +const char * run_console_command(const char * command) { + output_buffer[0] = '\0'; // empty the temp buffer + shell->invoke_command(command); + // remove everything before \r\n + char * p = strstr(output_buffer, "\r\n"); + if (p) { + p += 2; // skip the \r\n + } + // remove the \r\n at the end + p[strlen(p) - 2] = '\0'; - application.start(); // calls begin() + // Serial.println("Output:"); + // Serial.print(p); + // Serial.println(); - EMSESP::webCustomEntityService.test(); // custom entities - EMSESP::webCustomizationService.test(); // set customizations - this will overwrite any settings in the FS - EMSESP::temperaturesensor_.test(); // add temperature sensors - EMSESP::webSchedulerService.test(); // run scheduler tests, and conditions + return p; +} - add_devices(); // add devices +void console_test1() { + auto expected_response = "Log level: DEBUG"; + TEST_ASSERT_EQUAL_STRING(expected_response, run_console_command("log")); +} -#if defined(EMSESP_UNITY_CREATE) +void console_test2() { + auto expected_response = ""; + TEST_ASSERT_EQUAL_STRING(expected_response, run_console_command("call thermostat mode auto")); +} +void console_test3() { + // test bad command + auto expected_response = "Bad syntax. Check arguments."; + TEST_ASSERT_EQUAL_STRING(expected_response, run_console_command("call thermostat mode bad")); +} + +// simulate console commands +void run_console_tests() { + RUN_TEST(console_test1); + RUN_TEST(console_test2); + RUN_TEST(console_test3); +} + +// auto-generate the tests +void create_tests() { // These tests should all pass.... capture("/api/boiler"); @@ -326,7 +379,6 @@ int main() { capture("/api/system/settings2"); capture("/api/system/settings2/locale2"); - // scheduler capture("/api/scheduler/test_scheduler2"); capture("/api/scheduler/test_scheduler/val"); @@ -349,13 +401,41 @@ int main() { // ************************************************************************************************** // Finish capture(); // always end with this, this will create the run_test() function +} + +// Main entry point +int main() { + webServer = new AsyncWebServer(80); + esp8266React = new ESP8266React(webServer, &dummyFS); + webAPIService = new WebAPIService(webServer, esp8266React->getSecurityManager()); + + // Serial console for commands + Serial.begin(115200); + shell = std::make_shared(application, stream, true); + shell->log_level(uuid::log::Level::DEBUG); + shell->add_flags(CommandFlags::ADMIN); + + application.start(); // calls begin() + + EMSESP::webCustomEntityService.test(); // custom entities + EMSESP::webCustomizationService.test(); // set customizations - this will overwrite any settings in the FS + EMSESP::temperaturesensor_.test(); // add temperature sensors + EMSESP::webSchedulerService.test(); // run scheduler tests, and conditions + + add_devices(); // add devices + +#if defined(EMSESP_UNITY_CREATE) + create_tests(); #endif - // always run the tests + // + // Run the tests + // UNITY_BEGIN(); - run_tests(); // execute the generated tests - run_manual_tests(); // execute some other manual tests from this file + run_tests(); // execute the generated tests + run_manual_tests(); // execute some other manual tests from this file + run_console_tests(); // execute some console tests return UNITY_END(); } diff --git a/test/test_api/test_api.h b/test/test_api/test_api.h index 347c89ccf..21ec835b3 100644 --- a/test/test_api/test_api.h +++ b/test/test_api/test_api.h @@ -156,7 +156,7 @@ void test_18() { void test_19() { auto expected_response = - "[{\"system\":{\"version\":\"3.7.0-dev.29\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / " + "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / " "Unknown\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false," "\"disableSleep\":false,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0," "\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTConnects\":1,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"cleanSession\":false," @@ -179,7 +179,7 @@ void test_19() { void test_20() { auto expected_response = - "[{\"system\":{\"version\":\"3.7.0-dev.29\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / " + "[{\"system\":{\"version\":\"dev\",\"uptime\":\"000+00:00:00.000\",\"uptimeSec\":0,\"resetReason\":\"Unknown / " "Unknown\"},\"network\":{\"network\":\"WiFi\",\"hostname\":\"ems-esp\",\"RSSI\":-23,\"TxPowerSetting\":0,\"staticIP\":false,\"lowBandwidth\":false," "\"disableSleep\":false,\"enableMDNS\":true,\"enableCORS\":false},\"ntp\":{},\"mqtt\":{\"MQTTStatus\":\"disconnected\",\"MQTTPublishes\":0," "\"MQTTQueued\":0,\"MQTTPublishFails\":0,\"MQTTConnects\":1,\"enabled\":true,\"clientID\":\"ems-esp\",\"keepAlive\":60,\"cleanSession\":false,"