diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 0ab2ddcff..daed82a2c 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -20,7 +20,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y gcc g++ cmake golang uuid-dev + sudo apt-get install -y gcc g++ cmake golang uuid-dev libssl-dev lcov - name: Run pre-build script run: | @@ -30,3 +30,37 @@ jobs: - name: Run unit tests run: ./build_linux64/Output/amc_unittest + + coverage: + runs-on: ubuntu-latest + needs: build-and-test + if: ${{ success() }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc g++ cmake golang uuid-dev libssl-dev lcov + + - name: Run pre-build script (hashes and baseline) + run: | + chmod +x ./build_clean_linux64.sh + ./build_clean_linux64.sh + shell: bash + + - name: Run coverage (unit tests) + run: | + chmod +x ./coverage_linux.sh + ./coverage_linux.sh + shell: bash + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: | + build_coverage/coverage_html + build_coverage/coverage.info diff --git a/.gitignore b/.gitignore index c59489872..eaebb0f00 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ build_win64 build_linux64 build_rpi build_client +build_coverage +build_clientdist_tools ACT/LibMC_component ACT/LibMCDriverEnv_component ACT/LibMCDriver_component @@ -25,6 +27,14 @@ Client/.DS_Store Client/node_modules Client/dist Client/dist.xml +Client/vue2/.DS_Store +Client/vue2/node_modules +Client/vue2/dist +Client/vue2/dist.xml +Client/vue3/.DS_Store +Client/vue3/node_modules +Client/vue3/dist +Client/vue3/dist.xml # local env files Client/.env.local @@ -44,7 +54,30 @@ Client/*.njsproj Client/*.sln Client/*.sw? +ClientV3/.DS_Store +ClientV3/node_modules +ClientV3/dist +ClientV3/dist.xml + +# local env files +ClientV3/.env.local +ClientV3/.env.*.local + +# Log files +ClientV3/npm-debug.log* +ClientV3/yarn-debug.log* +ClientV3/yarn-error.log* + +# Editor directories and files +ClientV3/.idea +ClientV3/.vscode +ClientV3/*.suo +ClientV3/*.ntvs* +ClientV3/*.njsproj +ClientV3/*.sln +ClientV3/*.sw? + Framework/HeadersCore/Go Drivers/ScanLab/Dependencies Drivers/ScanLab/BinaryData -Drivers/Marlin/BinaryData \ No newline at end of file +Drivers/Marlin/BinaryData diff --git a/ACT/LibMC.xml b/ACT/LibMC.xml index 4096d0a73..3a8ee1ddb 100644 --- a/ACT/LibMC.xml +++ b/ACT/LibMC.xml @@ -705,7 +705,46 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -727,6 +766,7 @@ + @@ -764,6 +804,14 @@ + + + + + + + + @@ -838,6 +886,11 @@ + + + + + diff --git a/ACT/LibMCData.xml b/ACT/LibMCData.xml index 2e1ae4706..922fbba60 100644 --- a/ACT/LibMCData.xml +++ b/ACT/LibMCData.xml @@ -445,16 +445,18 @@ + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -727,11 +770,155 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -762,6 +949,7 @@ + @@ -783,8 +971,7 @@ - - + @@ -1455,6 +1642,10 @@ + + + + @@ -1519,6 +1710,24 @@ + + + + + + + + + + + + + + + + + + @@ -1672,6 +1881,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1766,6 +1996,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1789,6 +2072,10 @@ + + + + @@ -1824,6 +2112,7 @@ + @@ -1929,7 +2218,7 @@ - + @@ -2043,10 +2332,27 @@ - + + + + + + + + + + + + + + + + + + diff --git a/ACT/LibMCEnv.xml b/ACT/LibMCEnv.xml index 143e3f965..8a34b06b2 100644 --- a/ACT/LibMCEnv.xml +++ b/ACT/LibMCEnv.xml @@ -290,11 +290,21 @@ + + + + + + + + + + + + + - - - @@ -325,6 +335,15 @@ + + + @@ -436,8 +455,17 @@ - - + + + @@ -506,6 +534,14 @@ + + + + + + + + @@ -793,9 +829,25 @@ + + + + + + + + + + + + + + + + @@ -1954,6 +2006,18 @@ + + + + + + + + + + + + @@ -2265,6 +2329,13 @@ + + + + + + + @@ -2576,6 +2647,12 @@ + + + + + + @@ -2587,6 +2664,14 @@ + + + + + + + + @@ -2625,6 +2710,18 @@ + + + + + + + + + + + + @@ -3860,6 +3957,13 @@ + + + + + + + @@ -4042,6 +4146,20 @@ + + + + + + + + + + + + + + @@ -4054,7 +4172,21 @@ - + + + + + + + + + + + + + + + @@ -4456,6 +4588,10 @@ + + + + @@ -4475,6 +4611,13 @@ + + + + + + + @@ -4565,7 +4708,18 @@ - + + + + + + + + + + + + @@ -4601,9 +4755,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4819,10 +5109,6 @@ - - @@ -4831,22 +5117,18 @@ - - + + + + @@ -4858,7 +5140,7 @@ - + @@ -4866,7 +5148,7 @@ - + @@ -4880,6 +5162,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4913,13 +5318,21 @@ - + - + + + + + + + + + @@ -4962,10 +5375,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5006,6 +5444,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5023,28 +5511,44 @@ - - - - - - + + + + - + - - - - + + + + + + + + + - + + + + + + + + - + + + + + + + - + @@ -5081,7 +5585,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5107,21 +5641,6 @@ - - - - - - - - - - - - - - - @@ -5183,7 +5702,71 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5212,6 +5795,20 @@ + + + + + + + + + + + + + + @@ -5510,6 +6107,11 @@ + + + + + @@ -5571,6 +6173,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5633,6 +6262,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5647,6 +6335,20 @@ + + + + + + + + + + + + + + @@ -5712,6 +6414,10 @@ + + + + @@ -5883,6 +6589,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ACT/act.linux b/ACT/act.linux old mode 100644 new mode 100755 diff --git a/ACT/generate.sh b/ACT/generate.sh new file mode 100755 index 000000000..4137bf15f --- /dev/null +++ b/ACT/generate.sh @@ -0,0 +1,8 @@ + +./act.linux LibMCEnv.xml -bindings ../Framework/HeadersDev -interfaces ../Framework/InterfacesCore -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples +./act.linux LibMCPlugin.xml -bindings ../Framework/HeadersCore -interfaces ../Framework/InterfacesDev -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples +./act.linux LibMCUI.xml -bindings ../Framework/HeadersCore -interfaces ../Framework/InterfacesDev -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples +./act.linux LibMCDriver.xml -bindings ../Framework/HeadersCore -interfaces ../Framework/InterfacesDev -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples +./act.linux LibMCData.xml -bindings ../Framework/HeadersCore -interfaces ../Framework/InterfacesCore -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples +./act.linux LibMC.xml -bindings ../Framework/HeadersCore -interfaces ../Framework/InterfacesCore -suppresssubcomponents -suppresslicense -suppressstub -suppressexamples + diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..c8ab94d1d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,40 @@ +# Repository Guidelines + +## Project Structure & Module Organization +- `Implementation/` holds the core C++ server, API handlers, and unit-test sources. +- `Framework/` contains SDK headers and plugin interfaces; `SDK/` includes SDK build artifacts (including WASM). +- `Drivers/` hosts hardware/transport driver modules; `Examples/` provides sample systems and plugins. +- `Client/` contains the web UI sources; `Artifacts/` holds packaged client/API docs and build scripts. +- `Tests/` contains driver/system tests wired into CMake; `Documentation/` covers API and website docs. +- Build outputs are generated under `build_/Output` (for example `build_linux64/Output`). + +## Build, Test, and Development Commands +- `./build_clean_linux64.sh` builds Linux x64 binaries and dev packages into `build_linux64/Output`. +- `./build_clean_rpi.sh` builds for Raspberry Pi (ARM) using `build_rpi/Output`. +- `./build_clean_win64.bat` builds Windows artifacts into `build_win64/Output`. +- A complete clean build is only necessary for major structural changes or the initial clean build; otherwise run `cmake --build .` from the build directory. +- After a build, run the server from the output folder, e.g. `./build_linux64/Output/amc_server`. + +## Coding Style & Naming Conventions +- Follow existing C++ style: tabs for indentation, braces on new lines, and `CamelCase` types with `snake_case` or `m_`-prefixed members. +- Keep header/implementation pairs aligned (for example `amc_api_handler_build.hpp` + `.cpp`). +- Prefer minimal, local changes and keep platform-specific logic behind existing `#ifdef` patterns. + +## Testing Guidelines +- Unit tests live in `Implementation/UnitTest` and build into `amc_unittest`. +- Driver/system tests are grouped under `Tests/Test`. +- Run unit tests from the build directory (for example `cd build_linux64 && ./Output/amc_unittest`) to ensure runtime libraries are found. +- After building, run executables from `build_/Output` (for example `./build_linux64/Output/amc_unittest`). +- Add tests alongside the module you changed and mirror existing test naming. + +## Commit & Pull Request Guidelines +- Commit messages are short, sentence-case summaries; some include issue numbers like `(... #49)`. +- Use the git-flow model: open PRs against `develop`. +- Before coding, discuss changes in an issue and reference it in the PR description. +- Include clear change summaries and note any build/test commands run. +- Sign and submit the appropriate contributor agreement PDF in the repo root. +- Follow the project Code of Conduct in `CODE_OF_CONDUCT.md`. + +## Security & Configuration Tips +- Build scripts read environment variables such as `AMCF_PACKAGE_REPOSITORY` for package uploads; avoid committing secrets. +- Generated packages are placed in `build_/DevPackage` and `build_/Artifacts`. diff --git a/Artifacts/apidocsdist/_githash_apidocs.txt b/Artifacts/apidocsdist/_githash_apidocs.txt index 1618585f5..346c67b19 100644 --- a/Artifacts/apidocsdist/_githash_apidocs.txt +++ b/Artifacts/apidocsdist/_githash_apidocs.txt @@ -1 +1 @@ -8b6e7bc3f7f77aebb8fdbe773d616c251cb97b33 +32b88a93afbf43ad562b933d5fd3a194f711a565 diff --git a/Artifacts/apidocsdist/apidocspackage.zip b/Artifacts/apidocsdist/apidocspackage.zip index b523882ff..f17d889db 100644 Binary files a/Artifacts/apidocsdist/apidocspackage.zip and b/Artifacts/apidocsdist/apidocspackage.zip differ diff --git a/Artifacts/build_apidocs_clean.bat b/Artifacts/build_apidocs_clean.bat index 8ed03efeb..6b07811f0 100644 --- a/Artifacts/build_apidocs_clean.bat +++ b/Artifacts/build_apidocs_clean.bat @@ -18,7 +18,13 @@ cd .. git log -n 1 --format="%%H" -- "OpenAPI" >"build_apidocs\_githash_apidocs.txt" git log -n 1 --format="%%H" -- "OpenAPI" >"Artifacts\apidocsdist\_githash_apidocs.txt" -go run BuildScripts\createClientDist.go build_apidocs Artifacts\apidocsdist\apidocspackage.zip +set TOOLBUILDDIR=build_clientdist_tools +if not exist "%TOOLBUILDDIR%" (mkdir "%TOOLBUILDDIR%") +git rev-parse --verify --short HEAD >"%TOOLBUILDDIR%\githash.txt" +git log -n 1 --format="%%H" -- "OpenAPI" >"%TOOLBUILDDIR%\clientdirhash.txt" +cmake -S . -B "%TOOLBUILDDIR%" +cmake --build "%TOOLBUILDDIR%" --target create_client_dist --config Release +"%TOOLBUILDDIR%\DevPackage\Framework\create_client_dist.exe" build_apidocs Artifacts\apidocsdist\apidocspackage.zip if "%1" neq "NOPAUSE" ( pause diff --git a/Artifacts/build_apidocs_clean.sh b/Artifacts/build_apidocs_clean.sh new file mode 100644 index 000000000..bb0c7f3d9 --- /dev/null +++ b/Artifacts/build_apidocs_clean.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e + +basepath=$(cd "$(dirname "$0")" && pwd) +echo "$basepath" +cd "$basepath" + +mkdir -p ../build_apidocs + +cp ../OpenAPI/swagger*.* ../build_apidocs 2>/dev/null || true +cp ../OpenAPI/index.css ../build_apidocs 2>/dev/null || true +cp ../OpenAPI/index.html ../build_apidocs 2>/dev/null || true +cp ../OpenAPI/favicon.png ../build_apidocs 2>/dev/null || true +cp ../OpenAPI/oauth2-redirect.html ../build_apidocs 2>/dev/null || true +cp ../OpenAPI/AMCF_OpenAPI.json ../build_apidocs 2>/dev/null || true + +cd .. + +git log -n 1 --format="%H" -- "OpenAPI" > "build_apidocs/_githash_apidocs.txt" +git log -n 1 --format="%H" -- "OpenAPI" > "Artifacts/apidocsdist/_githash_apidocs.txt" + +TOOLBUILDDIR="build_clientdist_tools" +mkdir -p "$TOOLBUILDDIR" +git rev-parse --verify --short HEAD > "$TOOLBUILDDIR/githash.txt" +git log -n 1 --format="%H" -- "OpenAPI" > "$TOOLBUILDDIR/clientdirhash.txt" +cmake -S . -B "$TOOLBUILDDIR" +cmake --build "$TOOLBUILDDIR" --target create_client_dist --config Release +"$TOOLBUILDDIR/DevPackage/Framework/create_client_dist" build_apidocs Artifacts/apidocsdist/apidocspackage.zip + +echo +echo "Created packages in Artifacts/apidocsdist/:" +ls -l Artifacts/apidocsdist +echo diff --git a/Artifacts/build_client_clean.bat b/Artifacts/build_client_clean.bat index e80d8ef70..0513ab8da 100644 --- a/Artifacts/build_client_clean.bat +++ b/Artifacts/build_client_clean.bat @@ -4,6 +4,16 @@ set basepath=%~dp0 echo %basepath% cd %basepath% +if exist "..\build_client" ( + echo Error: build_client directory already exists. Please remove it before running this script. + exit 1 +) + +mkdir ..\build_client\core +mkdir ..\build_client\core\common +mkdir ..\build_client\core\modules +mkdir ..\build_client\core\theme +mkdir ..\build_client\core\theme\themes mkdir ..\build_client\Client mkdir ..\build_client\Client\public mkdir ..\build_client\Client\src @@ -12,42 +22,86 @@ mkdir ..\build_client\Client\src\modules mkdir ..\build_client\Client\src\dialogs mkdir ..\build_client\Client\dist -copy ..\Client\public\*.* ..\build_client\Client\public -copy ..\Client\src\*.* ..\build_client\Client\src -copy ..\Client\src\common\*.* ..\build_client\Client\src\common -copy ..\Client\src\modules\*.* ..\build_client\Client\src\modules -copy ..\Client\src\dialogs\*.* ..\build_client\Client\src\dialogs -copy ..\Client\*.js ..\build_client\Client -copy ..\Client\*.json ..\build_client\Client +REM Shared core JS (framework-agnostic) +copy ..\Client\core\common\*.* ..\build_client\core\common +copy ..\Client\core\modules\*.* ..\build_client\core\modules +copy ..\Client\core\theme\*.* ..\build_client\core\theme +copy ..\Client\core\theme\themes\*.* ..\build_client\core\theme\themes + +REM Core common files for source packaging +copy ..\Client\core\common\*.* ..\build_client\Client\src\common + +REM Vue 2 specific files +copy ..\Client\vue2\public\*.* ..\build_client\Client\public +copy ..\Client\vue2\src\*.* ..\build_client\Client\src +copy ..\Client\vue2\src\modules\*.* ..\build_client\Client\src\modules +copy ..\Client\vue2\src\dialogs\*.* ..\build_client\Client\src\dialogs +copy ..\Client\vue2\vue.config.js ..\build_client\Client +copy ..\Client\vue2\babel.config.js ..\build_client\Client +copy ..\Client\vue2\package.json ..\build_client\Client +copy ..\Client\vue2\package-lock.json ..\build_client\Client cd .. -git log -n 1 --format="%%H" -- "Client" >"build_client\Client\dist\_githash_client.txt" -git log -n 1 --format="%%H" -- "Client" >"Artifacts\clientdist\_githash_client.txt" -SET /p CLIENTDIRHASH=<"build_client\Client\dist\_githash_client.txt" +git log -n 1 --format="%%H" -- "Client/core" "Client/vue2" >"build_client\Client\dist\_githash_client_vue2.txt" +git log -n 1 --format="%%H" -- "Client/core" "Client/vue2" >"Artifacts\clientdist\_githash_client_vue2.txt" +SET /p CLIENTDIRHASH=<"build_client\Client\dist\_githash_client_vue2.txt" - -echo export function getClientGitHash ()> build_client\Client\src\AMCGitHash.js -echo {>> build_client\Client\src\AMCGitHash.js -echo return "%CLIENTDIRHASH%";>> build_client\Client\src\AMCGitHash.js -echo }>> build_client\Client\src\AMCGitHash.js +echo export function getClientGitHash ()> build_client\core\common\AMCGitHash.js +echo {>> build_client\core\common\AMCGitHash.js +echo return "%CLIENTDIRHASH%";>> build_client\core\common\AMCGitHash.js +echo }>> build_client\core\common\AMCGitHash.js cd build_client\Client +set TOOLBUILDDIR=..\..\build_client_dist +if not exist "%TOOLBUILDDIR%\CMakeCache.txt" ( + echo Configuring client build tools... + if not exist "%TOOLBUILDDIR%" (mkdir "%TOOLBUILDDIR%") + cmake -S ..\..\BuildScripts\ClientDist -B "%TOOLBUILDDIR%" -A x64 + if errorlevel 1 goto :error +) +echo Building client build tools... +cmake --build "%TOOLBUILDDIR%" --config Release +if %ERRORLEVEL% NEQ 0 goto :error + call npm install -call npm run build +if errorlevel 1 goto :error -cd ..\..\ +REM Work around node-ipc crashing when os.networkInterfaces fails in sandboxed environments. +if exist "node_modules\\@achrinza\\node-ipc\\entities\\Defaults.js" ( + node -e "const fs=require('fs');const path='node_modules/@achrinza/node-ipc/entities/Defaults.js';let data=fs.readFileSync(path,'utf8');const original=data;const needle='const networkInterfaces = os.networkInterfaces();';const broken='let networkInterfaces = null;\\n try {\\n networkInterfaces = os.networkInterfaces();\\n } catch (error) {\\n networkInterfaces = null;\\n }';const replacement='let networkInterfaces = null;\n try {\n networkInterfaces = os.networkInterfaces();\n } catch (error) {\n networkInterfaces = null;\n }';if(data.includes(needle)){data=data.replace(needle,replacement);}else if(data.includes(broken)){data=data.replace(broken,replacement);}if(data!==original){fs.writeFileSync(path,data,'utf8');}" +) +call npm run build +if errorlevel 1 goto :error +cd ..\..\ cd build_client\Client -go run ..\..\BuildScripts\createClientDist.go dist ..\..\Artifacts\clientdist\clientpackage.zip +if exist "%TOOLBUILDDIR%\Release\create_client_dist.exe" ( + set CLIENTDIST_EXE=%TOOLBUILDDIR%\Release\create_client_dist.exe + set CLIENTSRC_EXE=%TOOLBUILDDIR%\Release\create_client_source.exe +) else ( + set CLIENTDIST_EXE=%TOOLBUILDDIR%\create_client_dist.exe + set CLIENTSRC_EXE=%TOOLBUILDDIR%\create_client_source.exe +) + +"%CLIENTDIST_EXE%" dist ..\..\Artifacts\clientdist\clientpackage_vue2.zip -go run ..\..\BuildScripts\createClientSource.go . ..\..\Artifacts\clientdist\clientsourcepackage.zip +"%CLIENTSRC_EXE%" . ..\..\Artifacts\clientdist\clientsourcepackage_vue2.zip if "%1" neq "NOPAUSE" ( pause ) exit 0 + +:error +echo. +echo Build failed! +echo. +if "%1" neq "NOPAUSE" ( + pause +) +exit 1 diff --git a/Artifacts/build_client_clean.sh b/Artifacts/build_client_clean.sh new file mode 100755 index 000000000..029383a2e --- /dev/null +++ b/Artifacts/build_client_clean.sh @@ -0,0 +1,116 @@ +#!/bin/bash + +basepath=$(cd "$(dirname "$0")" && pwd) +echo "$basepath" +cd "$basepath" + +if [ -d "../build_client" ]; then + echo "Error: build_client directory already exists. Please remove it before running this script." + exit 1 +fi + +mkdir -p ../build_client/core/common +mkdir -p ../build_client/core/modules +mkdir -p ../build_client/Client/public +mkdir -p ../build_client/Client/src/common +mkdir -p ../build_client/Client/src/modules +mkdir -p ../build_client/Client/src/dialogs +mkdir -p ../build_client/Client/dist + +# Shared core JS (framework-agnostic) +cp ../Client/core/common/* ../build_client/core/common/ 2>/dev/null || true +cp ../Client/core/modules/* ../build_client/core/modules/ 2>/dev/null || true + +# Vue 2 specific files +cp ../Client/vue2/public/* ../build_client/Client/public/ 2>/dev/null || true +cp ../Client/vue2/src/*.* ../build_client/Client/src/ 2>/dev/null || true +cp ../Client/vue2/src/modules/* ../build_client/Client/src/modules/ 2>/dev/null || true +cp ../Client/vue2/src/dialogs/* ../build_client/Client/src/dialogs/ 2>/dev/null || true +cp ../Client/vue2/vue.config.js ../build_client/Client/ 2>/dev/null || true +cp ../Client/vue2/babel.config.js ../build_client/Client/ 2>/dev/null || true +cp ../Client/vue2/package.json ../build_client/Client/ 2>/dev/null || true + +cd .. +git log -n 1 --format="%H" -- "Client" > "build_client/Client/dist/_githash_client_vue2.txt" +git log -n 1 --format="%H" -- "Client" > "Artifacts/clientdist/_githash_client_vue2.txt" +CLIENTDIRHASH=$(cat "build_client/Client/dist/_githash_client_vue2.txt") + +cat > build_client/core/common/AMCGitHash.js <"build_client_svelte\Client\_githash_client_svelte.txt" +git log -n 1 --format="%%H" -- "Client/core" "Client/svelte" >"Artifacts\clientdist\_githash_client_svelte.txt" +SET /p CLIENTDIRHASH=<"build_client_svelte\Client\_githash_client_svelte.txt" + +echo export function getClientGitHash ()> build_client_svelte\core\common\AMCGitHash.js +echo {>> build_client_svelte\core\common\AMCGitHash.js +echo return "%CLIENTDIRHASH%";>> build_client_svelte\core\common\AMCGitHash.js +echo }>> build_client_svelte\core\common\AMCGitHash.js + +cd build_client_svelte\Client + +call npm install +if %ERRORLEVEL% NEQ 0 goto :error + +call npm run build +if %ERRORLEVEL% NEQ 0 goto :error + +cd ..\.. + +REM Build create_client_dist in its own lightweight build directory +set CLIENTDIST_BUILDDIR=build_client_dist +if not exist "%CLIENTDIST_BUILDDIR%\CMakeCache.txt" ( + echo Configuring create_client_dist tool... + if not exist "%CLIENTDIST_BUILDDIR%" (mkdir "%CLIENTDIST_BUILDDIR%") + cmake -S BuildScripts\ClientDist -B "%CLIENTDIST_BUILDDIR%" + if %ERRORLEVEL% NEQ 0 goto :error +) +echo Building create_client_dist tool... +cmake --build "%CLIENTDIST_BUILDDIR%" --config Release +if %ERRORLEVEL% NEQ 0 goto :error + +if exist "%CLIENTDIST_BUILDDIR%\Release\create_client_dist.exe" ( + set CLIENTDIST_EXE=%CLIENTDIST_BUILDDIR%\Release\create_client_dist.exe +) else ( + set CLIENTDIST_EXE=%CLIENTDIST_BUILDDIR%\create_client_dist.exe +) + +REM Package the build output into a client ZIP +"%CLIENTDIST_EXE%" build_client_svelte\Client\dist Artifacts\clientdist\clientpackage_svelte.zip +if %ERRORLEVEL% NEQ 0 goto :error + +echo. +echo Build complete! +echo. + +if "%1" neq "NOPAUSE" ( + pause +) + +exit 0 + +:error +echo. +echo Build failed! +echo. +if "%1" neq "NOPAUSE" ( + pause +) +exit 1 diff --git a/Artifacts/build_client_svelte_clean.sh b/Artifacts/build_client_svelte_clean.sh new file mode 100644 index 000000000..85b25bc12 --- /dev/null +++ b/Artifacts/build_client_svelte_clean.sh @@ -0,0 +1,61 @@ +#!/bin/bash +set -e + +basepath=$(cd "$(dirname "$0")" && pwd) +echo "$basepath" +cd "$basepath" + +if [ -d "../build_client_svelte" ]; then + echo "Error: build_client_svelte directory already exists. Please remove it before running this script." + exit 1 +fi + +mkdir -p ../build_client_svelte +mkdir -p clientdist + +# Copy the entire Svelte project (source only, no node_modules or dist) +rsync -a --exclude='node_modules' --exclude='dist' --exclude='.svelte-kit' ../Client/svelte/ ../build_client_svelte/Client/ + +# Shared core JS (common, modules, theme) +cp -r ../Client/core ../build_client_svelte/core + +cd .. +git log -n 1 --format="%H" -- "Client/core" "Client/svelte" > "build_client_svelte/Client/_githash_client_svelte.txt" +git log -n 1 --format="%H" -- "Client/core" "Client/svelte" > "Artifacts/clientdist/_githash_client_svelte.txt" +CLIENTDIRHASH=$(cat "build_client_svelte/Client/_githash_client_svelte.txt") + +cat > build_client_svelte/core/common/AMCGitHash.js < +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PugiXML/pugixml.hpp" +#include "common_utils.hpp" +#include "common_importstream_native.hpp" +#include "common_exportstream_native.hpp" +#include "common_portablezipwriter.hpp" + +static void writeUsage() +{ + std::cout << "Please start with buildResources " << std::endl; +} + +static std::string toLowerString(const std::string& sValue) +{ + std::string sResult = sValue; + std::transform(sResult.begin(), sResult.end(), sResult.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); + return sResult; +} + +static std::string getContentTypeFromExtension(const std::string& sExtension) +{ + if (sExtension.empty()) + return "application/binary"; + + std::string sExtLower = toLowerString(sExtension); + static const std::map sExtensionMap = { + { ".ico", "image/x-icon" }, + { ".woff", "font/woff" }, + { ".woff2", "font/woff2" }, + { ".ttf", "font/ttf" }, + { ".png", "image/png" }, + { ".jpg", "image/jpeg" }, + { ".jpeg", "image/jpeg" }, + { ".gif", "image/gif" }, + { ".bmp", "image/bmp" }, + { ".svg", "image/svg+xml" }, + { ".html", "text/html" }, + { ".htm", "text/html" }, + { ".css", "text/css" }, + { ".js", "application/javascript" }, + { ".json", "application/json" }, + { ".xml", "text/xml" }, + { ".txt", "text/plain" }, + { ".md", "text/markdown" } + }; + + auto iIter = sExtensionMap.find(sExtLower); + if (iIter != sExtensionMap.end()) + return iIter->second; + + return "application/binary"; +} + +struct SResourceEntry +{ + std::string m_sResourceName; + std::string m_sFileName; + uint64_t m_nSize; + std::string m_sContentType; + std::string m_sSourcePath; + std::string m_sSHA256; +}; + +class CStringXMLWriter : public pugi::xml_writer +{ +private: + std::string m_sBuffer; +public: + void write(const void* data, size_t size) override + { + if (size == 0) + return; + const char* pChar = reinterpret_cast(data); + m_sBuffer.append(pChar, pChar + size); + } + + const std::string& getBuffer() const + { + return m_sBuffer; + } +}; + +static void addFileToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sSourcePath, const std::string& sZipPath) +{ + AMCCommon::CImportStream_Native importStream(sSourcePath); + auto pEntryStream = zipWriter.createEntry(sZipPath, 0); + + const uint64_t nBufferSize = 1024 * 64; + std::vector buffer; + buffer.resize(nBufferSize); + + uint64_t nTotalSize = importStream.retrieveSize(); + uint64_t nRemaining = nTotalSize; + + while (nRemaining > 0) { + uint64_t nChunk = std::min(nRemaining, nBufferSize); + uint64_t nReadBytes = importStream.readBuffer(buffer.data(), nChunk, true); + if (nReadBytes != nChunk) + throw std::runtime_error("could not read full data from " + sSourcePath); + + pEntryStream->writeBuffer(buffer.data(), nReadBytes); + nRemaining -= nReadBytes; + } + + zipWriter.closeEntry(); +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc < 3) { + writeUsage(); + return 1; + } + + std::string sInputDir = AMCCommon::CUtils::includeTrailingPathDelimiter(argv[1]); + std::string sOutputFileName = argv[2]; + + if (!std::filesystem::exists(sInputDir) || !std::filesystem::is_directory(sInputDir)) + throw std::runtime_error("input directory does not exist: " + sInputDir); + + std::map writtenResources; + std::vector entries; + + for (auto const& entry : std::filesystem::recursive_directory_iterator(sInputDir)) { + if (!entry.is_regular_file()) + continue; + + std::string sFileName = entry.path().filename().u8string(); + if (sFileName == "package.xml") + continue; + + std::string sExtension = entry.path().extension().u8string(); + std::string sStem = entry.path().stem().u8string(); + std::string sResourceName = toLowerString(sStem); + + if (sResourceName.empty()) + throw std::runtime_error("invalid resource name for: " + sFileName); + + if (writtenResources.find(sResourceName) != writtenResources.end()) + throw std::runtime_error("duplicate resource name: " + sResourceName); + writtenResources.insert(std::make_pair(sResourceName, sResourceName)); + + SResourceEntry resourceEntry; + resourceEntry.m_sResourceName = sResourceName; + resourceEntry.m_sFileName = sFileName; + resourceEntry.m_sContentType = getContentTypeFromExtension(sExtension); + resourceEntry.m_nSize = entry.file_size(); + resourceEntry.m_sSourcePath = entry.path().u8string(); + resourceEntry.m_sSHA256 = AMCCommon::CUtils::calculateSHA256FromFile(resourceEntry.m_sSourcePath); + + std::cout << "Adding " << resourceEntry.m_sSourcePath << " as " << resourceEntry.m_sResourceName << " (" << resourceEntry.m_nSize << " bytes, sha256=" << resourceEntry.m_sSHA256 << ")" << std::endl; + + entries.push_back(resourceEntry); + } + + pugi::xml_document packageDoc; + auto rootNode = packageDoc.append_child("package"); + rootNode.append_attribute("xmlns").set_value("http://schemas.autodesk.com/amc/resourcepackage/2020/07"); + + for (auto& resourceEntry : entries) { + auto entryNode = rootNode.append_child("entry"); + entryNode.append_attribute("name").set_value(resourceEntry.m_sResourceName.c_str()); + entryNode.append_attribute("filename").set_value(resourceEntry.m_sFileName.c_str()); + entryNode.append_attribute("size").set_value(std::to_string(resourceEntry.m_nSize).c_str()); + entryNode.append_attribute("contenttype").set_value(resourceEntry.m_sContentType.c_str()); + entryNode.append_attribute("sha256").set_value(resourceEntry.m_sSHA256.c_str()); + } + + CStringXMLWriter xmlWriter; + packageDoc.save(xmlWriter, " ", pugi::format_raw | pugi::format_no_declaration, pugi::encoding_utf8); + std::string packageXMLString = xmlWriter.getBuffer(); + + AMCCommon::PExportStream pExportStream = std::make_shared(sOutputFileName); + AMCCommon::CPortableZIPWriter zipWriter(pExportStream, true); + + for (auto& resourceEntry : entries) { + addFileToZip(zipWriter, resourceEntry.m_sSourcePath, resourceEntry.m_sFileName); + } + + { + auto pEntryStream = zipWriter.createEntry("package.xml", 0); + pEntryStream->writeBuffer(packageXMLString.c_str(), packageXMLString.length()); + zipWriter.closeEntry(); + } + + zipWriter.writeDirectory(); + return 0; + } + catch (std::exception& E) + { + std::cout << "Fatal error: " << E.what() << std::endl; + return -1; + } + catch (...) + { + std::cout << "Unhandled fatal exception!" << std::endl; + return -1; + } +} diff --git a/BuildScripts/buildResources.go b/BuildScripts/buildResources.go deleted file mode 100644 index 6dcbb492f..000000000 --- a/BuildScripts/buildResources.go +++ /dev/null @@ -1,177 +0,0 @@ - -package main - -import ( - "log" - "os" - "fmt" - "errors" - "io/ioutil" - "strings" - "path/filepath" - "encoding/xml" - "archive/zip" - "mime" -) - - -type PackageXMLEntry struct { - XMLName xml.Name `xml:"entry"` - Name string `xml:"name,attr"` - FileName string `xml:"filename,attr"` - Size uint32 `xml:"size,attr"` - ContentType string `xml:"contenttype,attr"` -} - - -type PackageXMLRoot struct { - XMLName xml.Name `xml:"package"` - XMLNs string `xml:"xmlns,attr"` - Entries []PackageXMLEntry `xml:"entry"` -} - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// Main function -////////////////////////////////////////////////////////////////////////////////////////////////////// - -func main() { - - var Root PackageXMLRoot; - Root.XMLNs = "http://schemas.autodesk.com/amc/resourcepackage/2020/07"; - - - argsWithProg := os.Args; - if (len (argsWithProg) < 3) { - log.Fatal ("Please start with buildResources "); - } - - - InputDir := filepath.Clean (argsWithProg[1]) + "/"; - OutputFileName := argsWithProg[2]; - - PackageXMLName := "package.xml"; - - newZipFile, err := os.Create(OutputFileName) - if err != nil { - log.Fatal(err) - } - defer newZipFile.Close() - - zipWriter := zip.NewWriter(newZipFile) - defer zipWriter.Close() - - - writtenResources := make (map[string]string); - - - err = filepath.Walk(InputDir, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if (!info.IsDir()) { - - slashpath := strings.ReplaceAll (path, "\\", "/"); - - _, file := filepath.Split(slashpath); - - - fileext := filepath.Ext(file); - - lenwithoutext := len (file) - len (fileext); - resourcename := strings.ToLower (file[0:lenwithoutext]); - - if (resourcename == "") { - return errors.New ("Invalid resource name for: " + file); - } - - - if (writtenResources[resourcename] != "") { - return errors.New ("Duplicate resource name: " + resourcename); - } - writtenResources[resourcename] = resourcename; - - contenttype := mime.TypeByExtension(fileext); - if (contenttype == "") { - - if (fileext==".ico") { contenttype="image/x-icon"; } - if (fileext==".woff") { contenttype="font/woff"; } - if (fileext==".woff2") { contenttype="font/woff2"; } - if (fileext==".ttf") { contenttype="font/ttf"; } - - } - - if (contenttype == "") { - contenttype = "application/binary"; - } - - - if (file != PackageXMLName) { - - var entry PackageXMLEntry; - entry.Name = resourcename; - entry.FileName = file; - entry.Size = uint32 (info.Size()); - entry.ContentType = contenttype; - - Root.Entries = append (Root.Entries, entry); - - fmt.Printf("Adding %s as %s (%d bytes)\n", path, resourcename, info.Size()) - - input, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - - var header zip.FileHeader; - header.Name = file; - header.Method = zip.Deflate; - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - return err - } - - _, err = filewriter.Write(input) - if err != nil { - return err - } - - } - - - } - - return nil - }) - - - if err != nil { - log.Fatal(err) - } - - bytes, err := xml.Marshal (&Root); - if err != nil { - log.Fatal(err) - } - - var header zip.FileHeader; - header.Name = PackageXMLName; - header.Method = zip.Deflate; - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - log.Fatal(err) - } - - _, err = filewriter.Write(bytes) - if err != nil { - log.Fatal(err) - } - - - - -} \ No newline at end of file diff --git a/BuildScripts/build_packageManager.bat b/BuildScripts/build_packageManager.bat deleted file mode 100644 index a8374cae1..000000000 --- a/BuildScripts/build_packageManager.bat +++ /dev/null @@ -1,21 +0,0 @@ -@echo off - -set GO111MODULE=off - -echo "Building DownloadPackage..." -set GOARCH=amd64 -set GOOS=windows -go build -o ../build_win64/DevPackage/packageManager.exe -ldflags="-s -w" ../BuildScripts/packageManager.go - -set GOARCH=arm -set GOOS=linux -set GOARM=5 -go build -o ../build_win64/DevPackage/packageManager.arm -ldflags="-s -w" ../BuildScripts/packageManager.go - -set GOARCH=amd64 -set GOOS=linux -go build -o ../build_win64/DevPackage/packageManager.linux64 -ldflags="-s -w" ../BuildScripts/packageManager.go - -echo "done." - -pause \ No newline at end of file diff --git a/BuildScripts/createClientDist.cpp b/BuildScripts/createClientDist.cpp new file mode 100644 index 000000000..002e3a95c --- /dev/null +++ b/BuildScripts/createClientDist.cpp @@ -0,0 +1,231 @@ +/*++ + +Copyright (C) 2024 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PugiXML/pugixml.hpp" +#include "common_importstream_native.hpp" +#include "common_exportstream_native.hpp" +#include "common_portablezipwriter.hpp" + +static void writeUsage() +{ + std::cout << "Please start with createClientDist " << std::endl; +} + +static std::string toLowerString(const std::string& sValue) +{ + std::string sResult = sValue; + std::transform(sResult.begin(), sResult.end(), sResult.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); + return sResult; +} + +static std::string getContentTypeFromExtension(const std::string& sExtension) +{ + if (sExtension.empty()) + return ""; + + std::string sExtLower = toLowerString(sExtension); + static const std::map sExtensionMap = { + { ".ico", "image/x-icon" }, + { ".woff", "font/woff" }, + { ".woff2", "font/woff2" }, + { ".ttf", "font/ttf" }, + { ".png", "image/png" }, + { ".jpg", "image/jpeg" }, + { ".jpeg", "image/jpeg" }, + { ".gif", "image/gif" }, + { ".bmp", "image/bmp" }, + { ".svg", "image/svg+xml" }, + { ".html", "text/html" }, + { ".htm", "text/html" }, + { ".css", "text/css" }, + { ".js", "application/javascript" }, + { ".json", "application/json" }, + { ".xml", "text/xml" }, + { ".txt", "text/plain" }, + { ".md", "text/markdown" } + }; + + auto iIter = sExtensionMap.find(sExtLower); + if (iIter != sExtensionMap.end()) + return iIter->second; + + return ""; +} + +struct SDistEntry +{ + std::string m_sURL; + std::string m_sFileName; + uint64_t m_nSize; + std::string m_sContentType; + std::string m_sSourcePath; +}; + +class CStringXMLWriter : public pugi::xml_writer +{ +private: + std::string m_sBuffer; +public: + void write(const void* data, size_t size) override + { + if (size == 0) + return; + const char* pChar = reinterpret_cast(data); + m_sBuffer.append(pChar, pChar + size); + } + + const std::string& getBuffer() const + { + return m_sBuffer; + } +}; + +static void addFileToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sSourcePath, const std::string& sZipPath) +{ + AMCCommon::CImportStream_Native importStream(sSourcePath); + auto pEntryStream = zipWriter.createEntry(sZipPath, 0); + + const uint64_t nBufferSize = 1024 * 64; + std::vector buffer; + buffer.resize(nBufferSize); + + uint64_t nTotalSize = importStream.retrieveSize(); + uint64_t nRemaining = nTotalSize; + + while (nRemaining > 0) { + uint64_t nChunk = std::min(nRemaining, nBufferSize); + uint64_t nReadBytes = importStream.readBuffer(buffer.data(), nChunk, true); + if (nReadBytes != nChunk) + throw std::runtime_error("could not read full data from " + sSourcePath); + + pEntryStream->writeBuffer(buffer.data(), nReadBytes); + nRemaining -= nReadBytes; + } + + zipWriter.closeEntry(); +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc < 3) { + writeUsage(); + return 1; + } + + std::filesystem::path inputPath = std::filesystem::path(argv[1]); + std::string sOutputFileName = argv[2]; + + if (!std::filesystem::exists(inputPath) || !std::filesystem::is_directory(inputPath)) + throw std::runtime_error("input directory does not exist: " + inputPath.u8string()); + + std::vector entries; + + for (auto const& entry : std::filesystem::recursive_directory_iterator(inputPath)) { + if (!entry.is_regular_file()) + continue; + + std::string sFileName = entry.path().filename().u8string(); + std::string sExtension = entry.path().extension().u8string(); + if (toLowerString(sExtension) == ".map") + continue; + + std::string sRelativePath = std::filesystem::relative(entry.path(), inputPath).generic_u8string(); + std::string sURL = sRelativePath; + if (sURL == "index.html") + sURL = ""; + + SDistEntry distEntry; + distEntry.m_sURL = sURL; + distEntry.m_sFileName = sFileName; + distEntry.m_nSize = entry.file_size(); + distEntry.m_sContentType = getContentTypeFromExtension(sExtension); + distEntry.m_sSourcePath = entry.path().u8string(); + + std::cout << "Adding " << distEntry.m_sSourcePath << " (" << distEntry.m_nSize << " bytes) as " << distEntry.m_sURL << std::endl; + + entries.push_back(distEntry); + } + + pugi::xml_document packageDoc; + auto rootNode = packageDoc.append_child("package"); + rootNode.append_attribute("xmlns").set_value("http://schemas.autodesk.com/amc/resourcepackage/2020/07"); + + for (auto& distEntry : entries) { + auto entryNode = rootNode.append_child("entry"); + entryNode.append_attribute("name").set_value(distEntry.m_sURL.c_str()); + entryNode.append_attribute("filename").set_value(distEntry.m_sFileName.c_str()); + entryNode.append_attribute("size").set_value(std::to_string(distEntry.m_nSize).c_str()); + entryNode.append_attribute("contenttype").set_value(distEntry.m_sContentType.c_str()); + } + + CStringXMLWriter xmlWriter; + packageDoc.save(xmlWriter, " ", pugi::format_raw | pugi::format_no_declaration, pugi::encoding_utf8); + std::string packageXMLString = xmlWriter.getBuffer(); + + AMCCommon::PExportStream pExportStream = std::make_shared(sOutputFileName); + AMCCommon::CPortableZIPWriter zipWriter(pExportStream, true); + + for (auto& distEntry : entries) { + addFileToZip(zipWriter, distEntry.m_sSourcePath, distEntry.m_sFileName); + } + + { + auto pEntryStream = zipWriter.createEntry("package.xml", 0); + pEntryStream->writeBuffer(packageXMLString.c_str(), packageXMLString.length()); + zipWriter.closeEntry(); + } + + zipWriter.writeDirectory(); + return 0; + } + catch (std::exception& E) + { + std::cout << "Fatal error: " << E.what() << std::endl; + return -1; + } + catch (...) + { + std::cout << "Unhandled fatal exception!" << std::endl; + return -1; + } +} diff --git a/BuildScripts/createClientDist.go b/BuildScripts/createClientDist.go deleted file mode 100644 index 70d8bbd62..000000000 --- a/BuildScripts/createClientDist.go +++ /dev/null @@ -1,157 +0,0 @@ - -package main - -import ( - "log" - "os" - "fmt" - "io/ioutil" - "strings" - "path/filepath" - "encoding/xml" - "archive/zip" - "mime" -) - - -type DistXMLEntry struct { - XMLName xml.Name `xml:"entry"` - Name string `xml:"name,attr"` - FileName string `xml:"filename,attr"` - Size uint32 `xml:"size,attr"` - ContentType string `xml:"contenttype,attr"` -} - - -type DistXMLRoot struct { - XMLName xml.Name `xml:"package"` - XMLNs string `xml:"xmlns,attr"` - Entries []DistXMLEntry `xml:"entry"` -} - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// Main function -////////////////////////////////////////////////////////////////////////////////////////////////////// - - -func main() { - - argsWithProg := os.Args; - if (len (argsWithProg) < 3) { - log.Fatal ("Please start with createClientDist "); - } - - var Root DistXMLRoot; - Root.XMLNs = "http://schemas.autodesk.com/amc/resourcepackage/2020/07"; - - inputPath := argsWithProg[1]; - outputFileName := argsWithProg[2]; - - DistXMLName := "package.xml"; - - newZipFile, err := os.Create(outputFileName) - if err != nil { - log.Fatal(err) - } - defer newZipFile.Close() - - zipWriter := zip.NewWriter(newZipFile) - defer zipWriter.Close() - - - err = filepath.Walk(inputPath, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if (!info.IsDir()) { - - slashpath := strings.ReplaceAll (path, "\\", "/"); - - removeLen := len (inputPath) + 1; - url := slashpath[removeLen:]; - - if (url == "index.html") { - url = ""; - } - - _, file := filepath.Split(slashpath); - - - fileext := filepath.Ext(file); - contenttype := mime.TypeByExtension(fileext); - if (contenttype == "") { - - if (fileext==".ico") { contenttype="image/x-icon"; } - if (fileext==".woff") { contenttype="font/woff"; } - if (fileext==".woff2") { contenttype="font/woff2"; } - if (fileext==".ttf") { contenttype="font/ttf"; } - - } - - - if (fileext!=".map") { - - var entry DistXMLEntry; - entry.Name = url; - entry.FileName = file; - entry.Size = uint32 (info.Size()); - entry.ContentType = contenttype; - - Root.Entries = append (Root.Entries, entry); - - fmt.Printf("Adding %s (%d bytes) as %s\n", path, info.Size(), url) - - input, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - - var header zip.FileHeader; - header.Name = file; - header.Method = zip.Deflate; - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - return err - } - - _, err = filewriter.Write(input) - if err != nil { - return err - } - - } - - } - - return nil - }) - - - if err != nil { - log.Fatal(err) - } - - bytes, err := xml.Marshal (&Root); - if err != nil { - log.Fatal(err) - } - - var header zip.FileHeader; - header.Name = DistXMLName; - header.Method = zip.Deflate; - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - log.Fatal(err) - } - - _, err = filewriter.Write(bytes) - if err != nil { - log.Fatal(err) - } - -} \ No newline at end of file diff --git a/BuildScripts/createClientSource.cpp b/BuildScripts/createClientSource.cpp new file mode 100644 index 000000000..7481f8b51 --- /dev/null +++ b/BuildScripts/createClientSource.cpp @@ -0,0 +1,134 @@ +/*++ + +Copyright (C) 2024 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include "common_importstream_native.hpp" +#include "common_exportstream_native.hpp" +#include "common_portablezipwriter.hpp" + +static void writeUsage() +{ + std::cout << "Please start with createClientSource " << std::endl; +} + +static void addFileToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sSourcePath, const std::string& sZipPath) +{ + AMCCommon::CImportStream_Native importStream(sSourcePath); + auto pEntryStream = zipWriter.createEntry(sZipPath, 0); + + const uint64_t nBufferSize = 1024 * 64; + std::vector buffer; + buffer.resize(nBufferSize); + + uint64_t nTotalSize = importStream.retrieveSize(); + uint64_t nRemaining = nTotalSize; + + while (nRemaining > 0) { + uint64_t nChunk = std::min(nRemaining, nBufferSize); + uint64_t nReadBytes = importStream.readBuffer(buffer.data(), nChunk, true); + if (nReadBytes != nChunk) + throw std::runtime_error("could not read full data from " + sSourcePath); + + pEntryStream->writeBuffer(buffer.data(), nReadBytes); + nRemaining -= nReadBytes; + } + + zipWriter.closeEntry(); +} + +static void addSourceFolder(AMCCommon::CPortableZIPWriter& zipWriter, const std::filesystem::path& inputPath, const std::string& sPrefix) +{ + std::filesystem::path folderPath = inputPath / "src" / sPrefix; + if (!std::filesystem::exists(folderPath) || !std::filesystem::is_directory(folderPath)) + throw std::runtime_error("source folder does not exist: " + folderPath.u8string()); + + for (auto const& entry : std::filesystem::recursive_directory_iterator(folderPath)) { + if (!entry.is_regular_file()) + continue; + + std::string sFileName = entry.path().filename().u8string(); + if (sFileName.empty()) + continue; + + std::string sZipPath = sPrefix + "/" + sFileName; + std::string sSourcePath = entry.path().u8string(); + + std::cout << "adding " << sZipPath << "..." << std::endl; + addFileToZip(zipWriter, sSourcePath, sZipPath); + } +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc < 3) { + writeUsage(); + return 1; + } + + std::filesystem::path inputPath = std::filesystem::path(argv[1]); + std::string sOutputFileName = argv[2]; + + if (!std::filesystem::exists(inputPath) || !std::filesystem::is_directory(inputPath)) + throw std::runtime_error("input directory does not exist: " + inputPath.u8string()); + + AMCCommon::PExportStream pExportStream = std::make_shared(sOutputFileName); + AMCCommon::CPortableZIPWriter zipWriter(pExportStream, true); + + addSourceFolder(zipWriter, inputPath, "common"); + addSourceFolder(zipWriter, inputPath, "modules"); + addSourceFolder(zipWriter, inputPath, "dialogs"); + + addFileToZip(zipWriter, (inputPath / "package.json").u8string(), "packages/package.json"); + addFileToZip(zipWriter, (inputPath / "package-lock.json").u8string(), "packages/package-lock.json"); + + zipWriter.writeDirectory(); + return 0; + } + catch (std::exception& E) + { + std::cout << "Fatal error: " << E.what() << std::endl; + return -1; + } + catch (...) + { + std::cout << "Unhandled fatal exception!" << std::endl; + return -1; + } +} diff --git a/BuildScripts/createClientSource.go b/BuildScripts/createClientSource.go deleted file mode 100644 index 1cd5fb30a..000000000 --- a/BuildScripts/createClientSource.go +++ /dev/null @@ -1,136 +0,0 @@ - -package main - -import ( - "log" - "os" - "fmt" - "io/ioutil" - "strings" - "path/filepath" - "encoding/xml" - "archive/zip" -) - - -type DistXMLEntry struct { - XMLName xml.Name `xml:"entry"` - Name string `xml:"name,attr"` - FileName string `xml:"filename,attr"` - Size uint32 `xml:"size,attr"` - ContentType string `xml:"contenttype,attr"` -} - - -type DistXMLRoot struct { - XMLName xml.Name `xml:"package"` - XMLNs string `xml:"xmlns,attr"` - Entries []DistXMLEntry `xml:"entry"` -} - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// Main function -////////////////////////////////////////////////////////////////////////////////////////////////////// - -func addFileToZIP (path string, zipfilename string, zipWriter * zip.Writer) error { - - var header zip.FileHeader; - header.Name = zipfilename; - header.Method = zip.Deflate; - - input, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - return err - } - - _, err = filewriter.Write(input) - return err - -} - - -func main() { - - argsWithProg := os.Args; - if (len (argsWithProg) < 3) { - log.Fatal ("Please start with createClientSource "); - } - - var Root DistXMLRoot; - Root.XMLNs = "http://schemas.autodesk.com/amc/resourcepackage/2020/07"; - - inputPath := argsWithProg[1]; - outputFileName := argsWithProg[2]; - - newZipFile, err := os.Create(outputFileName) - if err != nil { - log.Fatal(err) - } - defer newZipFile.Close() - - zipWriter := zip.NewWriter(newZipFile) - defer zipWriter.Close() - - var prefix string; - - walkFunc := func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if (!info.IsDir()) { - - slashpath := strings.ReplaceAll (path, "\\", "/"); - - _, file := filepath.Split(slashpath); - - fmt.Println ("adding " + prefix + "/" + file + "..."); - - addFileToZIP (path, prefix + "/" + file, zipWriter); - - } - - return nil - }; - - - prefix = "common"; - - err = filepath.Walk(inputPath + "/src/" + prefix, walkFunc) - - if err != nil { - log.Fatal(err) - } - - prefix = "modules"; - - err = filepath.Walk(inputPath + "/src/" + prefix, walkFunc) - - if err != nil { - log.Fatal(err) - } - - prefix = "dialogs"; - - err = filepath.Walk(inputPath + "/src/" + prefix, walkFunc) - - if err != nil { - log.Fatal(err) - } - - err = addFileToZIP (inputPath + "/package.json", "packages/package.json", zipWriter); - if err != nil { - log.Fatal(err) - } - - err = addFileToZIP (inputPath + "/package-lock.json", "packages/package-lock.json", zipWriter); - if err != nil { - log.Fatal(err) - } - -} \ No newline at end of file diff --git a/BuildScripts/createDeploymentZIP.cpp b/BuildScripts/createDeploymentZIP.cpp new file mode 100644 index 000000000..1cedea136 --- /dev/null +++ b/BuildScripts/createDeploymentZIP.cpp @@ -0,0 +1,425 @@ +/*++ + +Copyright (C) 2024 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PugiXML/pugixml.hpp" +#include "common_utils.hpp" +#include "common_importstream_native.hpp" +#include "common_exportstream_native.hpp" +#include "common_portablezipwriter.hpp" + +static void writeUsage() +{ + std::cout << "Usage: create_deployment_zip --package --output " << std::endl; + std::cout << "Options are:" << std::endl; + std::cout << " --package : Path to Package XML to use. (mandatory)" << std::endl; + std::cout << " --output : Deployment ZIP file to write. (mandatory)" << std::endl; +} + +static std::string getDirectoryFromPath(const std::string& sPathName) +{ + auto posSlash = sPathName.find_last_of("/\\"); + if (posSlash == std::string::npos) + return ""; + return sPathName.substr(0, posSlash); +} + +static std::string getFileNameFromPath(const std::string& sPathName) +{ + auto posSlash = sPathName.find_last_of("/\\"); + if (posSlash == std::string::npos) + return sPathName; + return sPathName.substr(posSlash + 1); +} + +struct SZipEntry +{ + std::string m_sZipPath; + std::string m_sSourcePath; + bool m_bHasSource; + uint32_t m_nExternalAttributes; +}; + +static uint32_t makeExternalAttributesForFile(uint32_t nUnixPermissions) +{ + uint32_t nMode = 0x8000 | (nUnixPermissions & 0x0FFF); + return (nMode << 16); +} + +static uint32_t makeExternalAttributesForDirectory(uint32_t nUnixPermissions) +{ + uint32_t nMode = 0x4000 | (nUnixPermissions & 0x0FFF); + return (nMode << 16); +} + +static bool isValidZipPath(const std::string& sZipPath) +{ + if (sZipPath.empty()) + return false; + if ((sZipPath[0] == '/') || (sZipPath[0] == '\\')) + return false; + if (sZipPath.find("\\") != std::string::npos) + return false; + + size_t startPos = 0; + while (startPos <= sZipPath.size()) { + size_t endPos = sZipPath.find('/', startPos); + if (endPos == std::string::npos) + endPos = sZipPath.size(); + + size_t segmentLength = endPos - startPos; + if (segmentLength == 0) { + if (endPos == sZipPath.size()) + return true; + return false; + } + + std::string segment = sZipPath.substr(startPos, segmentLength); + if (!AMCCommon::CUtils::stringIsValidFileName(segment)) + return false; + if ((segment == ".") || (segment == "..")) + return false; + + startPos = endPos + 1; + } + + return true; +} + +static void addEntry(std::vector& entries, std::set& entryNames, const std::string& sZipPath, const std::string& sSourcePath, const std::string& sDisplayName, uint32_t nExternalAttributes) +{ + if (sZipPath.empty()) + throw std::runtime_error("missing " + sDisplayName + " name"); + + if (!isValidZipPath(sZipPath)) + throw std::runtime_error("invalid " + sDisplayName + " name: " + sZipPath); + + if (!AMCCommon::CUtils::fileOrPathExistsOnDisk(sSourcePath)) + throw std::runtime_error("missing " + sDisplayName + " file: " + sSourcePath); + + if (entryNames.find(sZipPath) != entryNames.end()) + return; + + SZipEntry entry; + entry.m_sZipPath = sZipPath; + entry.m_sSourcePath = sSourcePath; + entry.m_bHasSource = true; + entry.m_nExternalAttributes = nExternalAttributes; + entries.push_back(entry); + entryNames.insert(sZipPath); +} + +static void addEmptyEntry(std::vector& entries, std::set& entryNames, const std::string& sZipPath, uint32_t nExternalAttributes) +{ + if (sZipPath.empty()) + throw std::runtime_error("missing entry name"); + + if (!isValidZipPath(sZipPath)) + throw std::runtime_error("invalid entry name: " + sZipPath); + + if (entryNames.find(sZipPath) != entryNames.end()) + return; + + SZipEntry entry; + entry.m_sZipPath = sZipPath; + entry.m_sSourcePath = ""; + entry.m_bHasSource = false; + entry.m_nExternalAttributes = nExternalAttributes; + entries.push_back(entry); + entryNames.insert(sZipPath); +} + +static void addEntryFromPackage(std::vector& entries, std::set& entryNames, const std::string& sBaseDir, const std::string& sFileName, const std::string& sDisplayName, uint32_t nExternalAttributes) +{ + if (sFileName.empty()) + return; + + std::string sSourcePath = sBaseDir + sFileName; + addEntry(entries, entryNames, sFileName, sSourcePath, sDisplayName, nExternalAttributes); +} + +static void addRequiredEntryFromPackage(std::vector& entries, std::set& entryNames, const std::string& sBaseDir, const std::string& sFileName, const std::string& sDisplayName) +{ + if (sFileName.empty()) + throw std::runtime_error("missing " + sDisplayName + " name"); + + std::string sSourcePath = sBaseDir + sFileName; + addEntry(entries, entryNames, sFileName, sSourcePath, sDisplayName, 0); +} + +static void addOptionalEntryFromPackage(std::vector& entries, std::set& entryNames, const std::string& sBaseDir, const std::string& sFileName) +{ + if (sFileName.empty()) + return; + + std::string sSourcePath = sBaseDir + sFileName; + if (!AMCCommon::CUtils::fileOrPathExistsOnDisk(sSourcePath)) + return; + + addEntry(entries, entryNames, sFileName, sSourcePath, sFileName, 0); +} + +static void addFileToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sSourcePath, const std::string& sZipPath, uint32_t nExternalAttributes) +{ + AMCCommon::CImportStream_Native importStream(sSourcePath); + auto pEntryStream = zipWriter.createEntryWithExternalAttributes(sZipPath, 0, nExternalAttributes); + + const uint64_t nBufferSize = 1024 * 64; + std::vector buffer; + buffer.resize(nBufferSize); + + uint64_t nTotalSize = importStream.retrieveSize(); + uint64_t nRemaining = nTotalSize; + + while (nRemaining > 0) { + uint64_t nChunk = std::min(nRemaining, nBufferSize); + uint64_t nReadBytes = importStream.readBuffer(buffer.data(), nChunk, true); + if (nReadBytes != nChunk) + throw std::runtime_error("could not read full data from " + sSourcePath); + + pEntryStream->writeBuffer(buffer.data(), nReadBytes); + nRemaining -= nReadBytes; + } + + zipWriter.closeEntry(); +} + +static void addEmptyEntryToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sZipPath, uint32_t nExternalAttributes) +{ + zipWriter.createEntryWithExternalAttributes(sZipPath, 0, nExternalAttributes); + zipWriter.closeEntry(); +} + + +#ifdef _MSC_VER +int wmain(int argc, wchar_t* argv[]) +#else +int main(int argc, char* argv[]) +#endif +{ + + try + { + std::cout << "---------------------------------------------------------------------" << std::endl; + std::cout << "Autodesk Machine Control Framework - Deployment ZIP builder" << std::endl; + std::cout << "---------------------------------------------------------------------" << std::endl; + + // Parse arguments + std::vector argumentList; +#ifdef _MSC_VER + // Convert wide strings to UTF8 on Windows + for (int argIdx = 1; argIdx < argc; argIdx++) { + std::wstring wArg(argv[argIdx]); + argumentList.push_back(AMCCommon::CUtils::UTF16toUTF8(wArg)); + } +#else + for (int argIdx = 1; argIdx < argc; argIdx++) + argumentList.push_back(std::string(argv[argIdx])); +#endif + + std::string sPackageFileName = ""; + std::string sOutputFileName = ""; + + for (size_t argIdx = 0; argIdx < argumentList.size(); argIdx++) { + + bool bHandled = false; + + std::string sArgument = argumentList[argIdx]; + if (sArgument == "--package") { + argIdx++; + if (argIdx >= argumentList.size()) + throw std::runtime_error("missing package file name in argument"); + + sPackageFileName = argumentList[argIdx]; + bHandled = true; + } + + if (sArgument == "--output") { + argIdx++; + if (argIdx >= argumentList.size()) + throw std::runtime_error("missing output file name in argument"); + + sOutputFileName = argumentList[argIdx]; + bHandled = true; + } + + if (!bHandled) { + std::cout << "Warning! Unknown argument passed: " << sArgument << std::endl; + } + + } + + if (sPackageFileName.empty() || sOutputFileName.empty()) { + writeUsage(); + throw std::runtime_error("missing mandatory arguments"); + } + + std::cout << "Importing " << sPackageFileName << "..." << std::endl; + std::string sPackageAsString; + { + AMCCommon::CImportStream_Native packageStream(sPackageFileName); + sPackageAsString = packageStream.readAsString(); + if (sPackageAsString.empty()) + throw std::runtime_error("package xml file is empty!"); + } + + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_string(sPackageAsString.c_str()); + if (!result) + throw std::runtime_error("could not parse package xml!"); + + auto packageNode = doc.child("amcpackage"); + if (packageNode.empty()) + throw std::runtime_error("missing package node"); + + auto xmlnsAttrib = packageNode.attribute("xmlns"); + if (xmlnsAttrib.empty()) + throw std::runtime_error("missing xml schema"); + if (std::string(xmlnsAttrib.as_string()) != "http://schemas.autodesk.com/amcpackage/2020/06") + throw std::runtime_error("invalid xml schema"); + + auto buildNode = packageNode.child("build"); + if (buildNode.empty()) + throw std::runtime_error("missing build node"); + + std::string sPackageDir = getDirectoryFromPath(sPackageFileName); + if (!sPackageDir.empty()) + sPackageDir = AMCCommon::CUtils::includeTrailingPathDelimiter(sPackageDir); + + std::vector entries; + std::set entryNames; + + std::string sPackageFileOnly = getFileNameFromPath(sPackageFileName); + addEntry(entries, entryNames, sPackageFileOnly, sPackageFileName, "package xml", 0); + + bool bAddedServerBinary = false; +#ifndef _WIN32 + addEntry(entries, entryNames, "amc_server", sPackageDir + "amc_server", "server binary", makeExternalAttributesForFile(0755)); + bAddedServerBinary = true; +#else + if (AMCCommon::CUtils::fileOrPathExistsOnDisk(sPackageDir + "amc_server")) { + addEntry(entries, entryNames, "amc_server", sPackageDir + "amc_server", "server binary", makeExternalAttributesForFile(0755)); + bAddedServerBinary = true; + } +#endif + + if (!bAddedServerBinary) { + addOptionalEntryFromPackage(entries, entryNames, sPackageDir, "amc_server.exe"); + addOptionalEntryFromPackage(entries, entryNames, sPackageDir, "amc_win32.exe"); + bAddedServerBinary = AMCCommon::CUtils::fileOrPathExistsOnDisk(sPackageDir + "amc_server.exe") || + AMCCommon::CUtils::fileOrPathExistsOnDisk(sPackageDir + "amc_win32.exe"); + } + + if (!bAddedServerBinary) + throw std::runtime_error("missing server binary file"); + + addRequiredEntryFromPackage(entries, entryNames, sPackageDir, "amc_server.xml", "server configuration"); + addEmptyEntry(entries, entryNames, "data/", makeExternalAttributesForDirectory(0755)); + addEmptyEntry(entries, entryNames, "temp/", makeExternalAttributesForDirectory(0755)); + + std::string sConfigurationName = buildNode.attribute("configuration").as_string(); + addRequiredEntryFromPackage(entries, entryNames, sPackageDir, sConfigurationName, "configuration"); + + std::string sCoreClient = buildNode.attribute("coreclient").as_string(); + addRequiredEntryFromPackage(entries, entryNames, sPackageDir, sCoreClient, "core client"); + + auto coreClientsNode = buildNode.child("coreclients"); + if (!coreClientsNode.empty()) { + for (auto coreClientNode : coreClientsNode.children("coreclient")) { + std::string sClientName = coreClientNode.attribute("name").as_string(); + std::string sClientFile = coreClientNode.attribute("file").as_string(); + if (sClientName.empty()) + throw std::runtime_error("missing core client name"); + if (sClientFile.empty()) + throw std::runtime_error("missing core client file for: " + sClientName); + addRequiredEntryFromPackage(entries, entryNames, sPackageDir, sClientFile, "core client " + sClientName); + } + } + + std::string sAPIDocs = buildNode.attribute("apidocs").as_string(); + addEntryFromPackage(entries, entryNames, sPackageDir, sAPIDocs, "api docs", 0); + + auto libraries = buildNode.children("library"); + for (auto libraryNode : libraries) { + std::string libraryName = libraryNode.attribute("name").as_string(); + if (libraryName.empty()) + throw std::runtime_error("missing library name"); + + std::string libraryImport = libraryNode.attribute("import").as_string(); + addRequiredEntryFromPackage(entries, entryNames, sPackageDir, libraryImport, "library import"); + + std::string libraryResources = libraryNode.attribute("resources").as_string(); + addEntryFromPackage(entries, entryNames, sPackageDir, libraryResources, "library resources", 0); + } + + std::cout << "Writing deployment ZIP to " << sOutputFileName << "..." << std::endl; + + AMCCommon::PExportStream pExportStream = std::make_shared(sOutputFileName); + AMCCommon::CPortableZIPWriter zipWriter(pExportStream, true); + + for (auto& entry : entries) { + std::cout << " - adding " << entry.m_sZipPath << std::endl; + if (entry.m_bHasSource) { + addFileToZip(zipWriter, entry.m_sSourcePath, entry.m_sZipPath, entry.m_nExternalAttributes); + } + else { + addEmptyEntryToZip(zipWriter, entry.m_sZipPath, entry.m_nExternalAttributes); + } + } + + zipWriter.writeDirectory(); + + std::cout << "done.." << std::endl; + + } + catch (std::exception& E) + { + std::cout << "Fatal error: " << E.what() << std::endl; + return -1; + } + catch (...) + { + std::cout << "Unhandled fatal exception!" << std::endl; + return -1; + } + + return 0; + + +} diff --git a/BuildScripts/createDevPackage.cpp b/BuildScripts/createDevPackage.cpp new file mode 100644 index 000000000..695223cc4 --- /dev/null +++ b/BuildScripts/createDevPackage.cpp @@ -0,0 +1,196 @@ +/*++ + +Copyright (C) 2024 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_utils.hpp" +#include "common_importstream_native.hpp" +#include "common_exportstream_native.hpp" +#include "common_portablezipwriter.hpp" + +static void writeUsage() +{ + std::cout << "Please start with createDevPackage " << std::endl; +} + +static std::string ensureTrailingPath(const std::string& sPathName) +{ + return AMCCommon::CUtils::includeTrailingPathDelimiter(sPathName); +} + +static uint32_t makeExternalAttributesForFile(uint32_t nUnixPermissions) +{ + uint32_t nMode = 0x8000 | (nUnixPermissions & 0x0FFF); + return (nMode << 16); +} + +static uint32_t getExternalAttributesForFile(const std::filesystem::path& filePath) +{ +#ifdef _WIN32 + (void)filePath; + return 0; +#else + auto perms = std::filesystem::status(filePath).permissions(); + uint32_t nPerms = 0; + if ((perms & std::filesystem::perms::owner_read) != std::filesystem::perms::none) nPerms |= 0400; + if ((perms & std::filesystem::perms::owner_write) != std::filesystem::perms::none) nPerms |= 0200; + if ((perms & std::filesystem::perms::owner_exec) != std::filesystem::perms::none) nPerms |= 0100; + if ((perms & std::filesystem::perms::group_read) != std::filesystem::perms::none) nPerms |= 0040; + if ((perms & std::filesystem::perms::group_write) != std::filesystem::perms::none) nPerms |= 0020; + if ((perms & std::filesystem::perms::group_exec) != std::filesystem::perms::none) nPerms |= 0010; + if ((perms & std::filesystem::perms::others_read) != std::filesystem::perms::none) nPerms |= 0004; + if ((perms & std::filesystem::perms::others_write) != std::filesystem::perms::none) nPerms |= 0002; + if ((perms & std::filesystem::perms::others_exec) != std::filesystem::perms::none) nPerms |= 0001; + return makeExternalAttributesForFile(nPerms); +#endif +} + +static void addFileToZip(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sSourcePath, const std::string& sZipPath, uint32_t nExternalAttributes) +{ + std::cout << "Adding " << sSourcePath << std::endl; + + AMCCommon::CImportStream_Native importStream(sSourcePath); + auto pEntryStream = zipWriter.createEntryWithExternalAttributes(sZipPath, 0, nExternalAttributes); + + const uint64_t nBufferSize = 1024 * 64; + std::vector buffer; + buffer.resize(nBufferSize); + + uint64_t nTotalSize = importStream.retrieveSize(); + uint64_t nRemaining = nTotalSize; + + while (nRemaining > 0) { + uint64_t nChunk = std::min(nRemaining, nBufferSize); + uint64_t nReadBytes = importStream.readBuffer(buffer.data(), nChunk, true); + if (nReadBytes != nChunk) + throw std::runtime_error("could not read full data from " + sSourcePath); + + pEntryStream->writeBuffer(buffer.data(), nReadBytes); + nRemaining -= nReadBytes; + } + + zipWriter.closeEntry(); +} + +static void addDirectory(AMCCommon::CPortableZIPWriter& zipWriter, const std::string& sBasePath, const std::string& sRelativePath) +{ + std::string sDiskPath = sBasePath + sRelativePath; + + if (!std::filesystem::exists(sDiskPath) || !std::filesystem::is_directory(sDiskPath)) + throw std::runtime_error("directory does not exist: " + sDiskPath); + + for (auto const& entry : std::filesystem::recursive_directory_iterator(sDiskPath)) { + if (!entry.is_regular_file()) + continue; + + std::string sFileName = entry.path().filename().u8string(); + if (sFileName.empty()) + continue; + + std::string sZipPath = sRelativePath + sFileName; + std::string sSourcePath = entry.path().u8string(); + + uint32_t nExternalAttributes = getExternalAttributesForFile(entry.path()); + addFileToZip(zipWriter, sSourcePath, sZipPath, nExternalAttributes); + } +} + + +int main(int argc, char* argv[]) +{ + + try + { + if (argc < 5) { + writeUsage(); + return 1; + } + + std::string sDevPackageDir = ensureTrailingPath(argv[1]); + std::string sOutputPath = ensureTrailingPath(argv[2]); + std::string sGitHash = argv[3]; + std::string sSystemPrefix = argv[4]; + + std::string sZipName = "amcf_" + sSystemPrefix + "_" + sGitHash + ".zip"; + std::string sZipFileName = sOutputPath + sZipName; + + AMCCommon::PExportStream pExportStream = std::make_shared(sZipFileName); + AMCCommon::CPortableZIPWriter zipWriter(pExportStream, true); + + addDirectory(zipWriter, sDevPackageDir, "Dist/"); + addDirectory(zipWriter, sDevPackageDir, "HeadersDev/CppDynamic/"); + addDirectory(zipWriter, sDevPackageDir, "HeadersDriver/CppDynamic/"); + addDirectory(zipWriter, sDevPackageDir, "InterfacesDev/"); + addDirectory(zipWriter, sDevPackageDir, "PluginCpp/"); + addDirectory(zipWriter, sDevPackageDir, "ClientSource/"); + + if (sSystemPrefix == "win64") { + addFileToZip(zipWriter, sDevPackageDir + "buildresources.exe", "buildresources.exe", 0); + addFileToZip(zipWriter, sDevPackageDir + "create_package_xml.exe", "create_package_xml.exe", 0); + addFileToZip(zipWriter, sDevPackageDir + "create_deployment_zip.exe", "create_deployment_zip.exe", 0); + } + else if (sSystemPrefix == "linux64") { + addFileToZip(zipWriter, sDevPackageDir + "buildresources.linux64", "buildresources.linux64", getExternalAttributesForFile(sDevPackageDir + "buildresources.linux64")); + addFileToZip(zipWriter, sDevPackageDir + "create_package_xml", "create_package_xml", getExternalAttributesForFile(sDevPackageDir + "create_package_xml")); + addFileToZip(zipWriter, sDevPackageDir + "create_deployment_zip", "create_deployment_zip", getExternalAttributesForFile(sDevPackageDir + "create_deployment_zip")); + } + else if (sSystemPrefix == "rpi") { + addFileToZip(zipWriter, sDevPackageDir + "buildresources.rpi", "buildresources.rpi", getExternalAttributesForFile(sDevPackageDir + "buildresources.rpi")); + addFileToZip(zipWriter, sDevPackageDir + "create_package_xml", "create_package_xml", getExternalAttributesForFile(sDevPackageDir + "create_package_xml")); + addFileToZip(zipWriter, sDevPackageDir + "create_deployment_zip", "create_deployment_zip", getExternalAttributesForFile(sDevPackageDir + "create_deployment_zip")); + } + else { + throw std::runtime_error("Invalid system prefix: " + sSystemPrefix); + } + + zipWriter.writeDirectory(); + return 0; + } + catch (std::exception& E) + { + std::cout << "Fatal error: " << E.what() << std::endl; + return -1; + } + catch (...) + { + std::cout << "Unhandled fatal exception!" << std::endl; + return -1; + } + + return 0; +} diff --git a/BuildScripts/createDevPackage.go b/BuildScripts/createDevPackage.go deleted file mode 100644 index fd0adc1da..000000000 --- a/BuildScripts/createDevPackage.go +++ /dev/null @@ -1,169 +0,0 @@ - -package main - -import ( - "log" - "os" - "fmt" - "io/ioutil" - "strings" - "path/filepath" - "archive/zip" -) - -////////////////////////////////////////////////////////////////////////////////////////////////////// -// Main function -////////////////////////////////////////////////////////////////////////////////////////////////////// - -func addFile (zipWriter * zip.Writer, diskPath string, zipPath string) (error) { - - fmt.Printf("Adding %s\n", diskPath) - - input, err := ioutil.ReadFile(diskPath) - if err != nil { - return err - } - - - var header zip.FileHeader; - header.Name = zipPath; - header.Method = zip.Deflate; - - filewriter, err := zipWriter.CreateHeader(&header) - if err != nil { - return err - } - - _, err = filewriter.Write(input) - if err != nil { - return err - } - - return nil; - -} - - -func addDirectory (zipWriter * zip.Writer, basePath string, relativePath string) (error) { - - err := filepath.Walk(basePath + relativePath, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if (!info.IsDir()) { - - slashpath := strings.ReplaceAll (path, "\\", "/"); - - _, file := filepath.Split(slashpath); - - err = addFile (zipWriter, path, relativePath + file); - - } - - - return nil - }) - - - return err; -} - - -func main() { - - argsWithProg := os.Args; - if (len (argsWithProg) < 5) { - log.Fatal ("Please start with createDist "); - } - - - DevPackageDir := filepath.Clean (argsWithProg[1]) + "/"; - OutputPath := filepath.Clean (argsWithProg[2]) + "/"; - hexSum := argsWithProg[3]; - systemprefix := argsWithProg[4]; - - zipName := "amcf_" + systemprefix + "_" + hexSum + ".zip" - - newZipFile, err := os.Create(OutputPath + zipName) - if err != nil { - log.Fatal(err) - } - defer newZipFile.Close() - - zipWriter := zip.NewWriter(newZipFile) - defer zipWriter.Close() - - - err = addDirectory (zipWriter, DevPackageDir, "Dist/"); - if err != nil { - log.Fatal(err) - } - - err = addDirectory (zipWriter, DevPackageDir, "HeadersDev/CppDynamic/"); - if err != nil { - log.Fatal(err) - } - - err = addDirectory (zipWriter, DevPackageDir, "HeadersDriver/CppDynamic/"); - if err != nil { - log.Fatal(err) - } - - err = addDirectory (zipWriter, DevPackageDir, "InterfacesDev/"); - if err != nil { - log.Fatal(err) - } - - err = addDirectory (zipWriter, DevPackageDir, "PluginCpp/"); - if err != nil { - log.Fatal(err) - } - - err = addDirectory (zipWriter, DevPackageDir, "ClientSource/"); - if err != nil { - log.Fatal(err) - } - - if (systemprefix == "win64") { - - err = addFile (zipWriter, DevPackageDir + "buildresources.exe", "buildresources.exe"); - if err != nil { - log.Fatal(err) - } - - err = addFile (zipWriter, DevPackageDir + "create_package_xml.exe", "create_package_xml.exe"); - if err != nil { - log.Fatal(err) - } - - } else if (systemprefix == "linux64") { - - err = addFile (zipWriter, DevPackageDir + "buildresources.linux64", "buildresources.linux64"); - if err != nil { - log.Fatal(err) - } - - err = addFile (zipWriter, DevPackageDir + "create_package_xml", "create_package_xml"); - if err != nil { - log.Fatal(err) - } - - } else if (systemprefix == "rpi") { - - err = addFile (zipWriter, DevPackageDir + "buildresources.rpi", "buildresources.rpi"); - if err != nil { - log.Fatal(err) - } - - err = addFile (zipWriter, DevPackageDir + "create_package_xml", "create_package_xml"); - if err != nil { - log.Fatal(err) - } - - } else { - log.Fatal("Invalid system prefix: " + systemprefix); - } - -} \ No newline at end of file diff --git a/BuildScripts/createPackageXML.cpp b/BuildScripts/createPackageXML.cpp index 32989621e..9f85550da 100644 --- a/BuildScripts/createPackageXML.cpp +++ b/BuildScripts/createPackageXML.cpp @@ -51,6 +51,7 @@ void writeUsage() std::cout << " --output: Output package xml file to write. (default: GITHASH_package.xml)" << std::endl; std::cout << " --serveroutput: Server Output xml file to write. (default: amc_server.xml)" << std::endl; std::cout << " --tempdir: Temporary directory to write into server path. (default: no custom temp dir)" << std::endl; + std::cout << " --client: Client variant to select (vue2 or svelte). (default: vue2)" << std::endl; } @@ -85,6 +86,7 @@ int main(int argc, char* argv[]) std::string sOutputFileName = ""; std::string sCustomTempDir = ""; std::string sServerOutputFileName = "amc_server.xml"; + std::string sClientVariant = ""; for (size_t argIdx = 0; argIdx < argumentList.size(); argIdx++) { bool bHandled = false; @@ -134,6 +136,15 @@ int main(int argc, char* argv[]) sServerOutputFileName = argumentList[argIdx]; bHandled = true; } + + if (sArgument == "--client") { + argIdx++; + if (argIdx >= argumentList.size()) + throw std::runtime_error("missing client variant in argument"); + + sClientVariant = argumentList[argIdx]; + bHandled = true; + } if (!bHandled) { std::cout << "Warning! Unknown argument passed: " << sArgument << std::endl; @@ -153,6 +164,9 @@ int main(int argc, char* argv[]) if (sOutputFileName.empty()) { sOutputFileName = sDevPackagePrefix + "_package.xml"; } + + if (!sClientVariant.empty() && !AMCCommon::CUtils::stringIsValidAlphanumericNameString(sClientVariant)) + throw std::runtime_error("invalid client variant: " + sClientVariant); std::cout << "Importing " << sConfigFileName << "..." << std::endl; std::string sConfigAsString; @@ -171,6 +185,18 @@ int main(int argc, char* argv[]) std::set drivers; auto mainNode = doc.child("machinedefinition"); + if (mainNode.empty()) + mainNode = doc.child("testdefinition"); + if (mainNode.empty()) + throw std::runtime_error("missing machine definition node!"); + + std::string sConfigClientVariant; + auto clientAttrib = mainNode.attribute("client"); + if (!clientAttrib.empty()) { + sConfigClientVariant = clientAttrib.as_string(); + if (!sConfigClientVariant.empty() && !AMCCommon::CUtils::stringIsValidAlphanumericNameString(sConfigClientVariant)) + throw std::runtime_error("invalid client variant in configuration: " + sConfigClientVariant); + } auto driversNodes = mainNode.children("driver"); for (pugi::xml_node driversNode : driversNodes) { @@ -252,7 +278,18 @@ int main(int argc, char* argv[]) #endif std::string sPackageName = "Build " + sDevPackagePrefix; std::string sConfigName = sDevPackagePrefix + "_config.xml"; - std::string sClientName = sDevPackagePrefix + "_core.client"; + std::string sClientNameVue2 = sDevPackagePrefix + "_core_vue2.client"; + std::string sClientNameSvelte = sDevPackagePrefix + "_core_svelte.client"; + std::string sDefaultClient = sClientVariant; + if (sDefaultClient.empty()) + sDefaultClient = sConfigClientVariant; + if (sDefaultClient.empty()) + sDefaultClient = "vue2"; + if ((sDefaultClient != "vue2") && (sDefaultClient != "svelte")) + throw std::runtime_error("unsupported client variant: " + sDefaultClient); + std::string sClientName = sClientNameVue2; + if (sDefaultClient == "svelte") + sClientName = sClientNameSvelte; std::string sAPIDocsName = sDevPackagePrefix + "_core.apidocs"; std::string sCoreName = sDevPackagePrefix + "_core_libmc." + sExtension; std::string sCoreResourcesName = sDevPackagePrefix + "_core.data"; @@ -264,6 +301,10 @@ int main(int argc, char* argv[]) packageXMLStream << "\n"; packageXMLStream << "\n"; packageXMLStream << " \n"; + packageXMLStream << " \n"; + packageXMLStream << " \n"; + packageXMLStream << " \n"; + packageXMLStream << " \n"; packageXMLStream << " \n"; packageXMLStream << " \n"; @@ -337,4 +378,4 @@ int main(int argc, char* argv[]) return 0; -} \ No newline at end of file +} diff --git a/BuildScripts/packageManager.cpp b/BuildScripts/packageManager.cpp new file mode 100644 index 000000000..5d22f92bd --- /dev/null +++ b/BuildScripts/packageManager.cpp @@ -0,0 +1,245 @@ +// packageManager.cpp +// C++17 translation using cpp-httplib + PicoSHA2 (header-only) for SHA-256. +// Also includes rapidjson and pugixml headers to respect the "only dependencies" constraint. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CPPHTTPLIB_OPENSSL_SUPPORT + +#include "common_utils.hpp" +#include "common_exportstream_native.hpp" +#include "common_importstream_native.hpp" + +#include "Libraries/cpp-httplib/httplib.h" +#include "Libraries/PugiXML/pugixml.hpp" +#include "Libraries/RapidJSON/document.h" +#include "Libraries/PicoSHA2/picosha2.h" // SHA-256 (header-only) + + +struct ParsedURL { + std::string scheme; // "http" or "https" + std::string host; + int port = -1; + std::string path; // starts with '/' +}; + +// Very small URL parser for forms like: http(s)://host[:port][/path...] +static bool parse_url(const std::string& url, ParsedURL& out) { + auto pos_scheme = url.find("://"); + if (pos_scheme == std::string::npos) return false; + out.scheme = url.substr(0, pos_scheme); + auto rest = url.substr(pos_scheme + 3); + + auto pos_slash = rest.find('/'); + std::string hostport = (pos_slash == std::string::npos) ? rest : rest.substr(0, pos_slash); + out.path = (pos_slash == std::string::npos) ? "/" : rest.substr(pos_slash); + + auto pos_colon = hostport.find(':'); + if (pos_colon == std::string::npos) { + out.host = hostport; + out.port = -1; + } else { + out.host = hostport.substr(0, pos_colon); + out.port = std::stoi(hostport.substr(pos_colon + 1)); + } + + if (out.scheme != "http" && out.scheme != "https") + return false; + if (out.path.empty()) out.path = "/"; + return !out.host.empty(); +} + +static std::string join_url_path(const std::string& base_path, const std::string& segment) { + if (base_path.empty() || base_path.back() != '/') { + if (!segment.empty() && segment.front() == '/') return base_path + segment; + return base_path + "/" + segment; + } else { + if (!segment.empty() && segment.front() == '/') return base_path + segment.substr(1); + return base_path + segment; + } +} + +template void download_with_client(ClientT& client, const std::string& path, const std::string& out_path) { + + client.set_follow_location (true); + + AMCCommon::CExportStream_Native ofs_stream (out_path); + + size_t nReceivedSize = 0; + + auto res = client.Get(path.c_str(), [&ofs_stream, &nReceivedSize](const char* data, size_t len) { + + size_t nOldReceivedMB = nReceivedSize / (1024 * 1024); + + ofs_stream.writeBuffer(data, len); + + nReceivedSize += len; + + size_t nNewReceivedMB = nReceivedSize / (1024 * 1024); + + if (nNewReceivedMB != nOldReceivedMB) { + std::cout << "Received " << nNewReceivedMB << " MB...\n"; + } + + + return true; + }); + + if (!res) { + throw std::runtime_error ("HTTP request failed (network/connection error)."); + } + + if (res->status != 200) { + throw std::runtime_error("HTTP error status: " + std::to_string(res->status)); + } + +} + + +// Download to file using cpp-httplib. +void download_to_file(const std::string& full_url, const std::string& out_path) +{ + ParsedURL u; + if (!parse_url(full_url, u)) + { + throw std::runtime_error("Invalid URL: " + full_url); + } + + std::vector receivedBuffer; + + if (u.scheme == "http") { + httplib::Client client(u.host.c_str(), (u.port > 0 ? u.port : 80)); + + download_with_client(client, u.path, out_path); + + } else { + + httplib::SSLClient sslclient(u.host.c_str(), (u.port > 0 ? u.port : 443)); + + sslclient.enable_server_certificate_verification(true); + download_with_client(sslclient, u.path, out_path); + + } + + +} + + +// ---------------------- Main ---------------------- +int main(int argc, char* argv[]) { + + try { + + if (argc < 2) { + std::cerr << "Please start with: packageManager ....\n"; + std::cerr << "for example: packageManager download \n"; + return 1; + } + + std::string command = argv[1]; + + if (command == "download") { + if (argc < 6) { + std::cerr << "Please start with: packageManager download \n"; + return 1; + } + + const std::string localFileName = argv[2]; + const std::string downloadURLBase = argv[3]; + const std::string gitHash = argv[4]; + const std::string shaCheckSum = argv[5]; + + std::cout << "---------------------------------------------------------------------------------\n"; + std::cout << "-- AMCF Package Manager --\n"; + std::cout << "---------------------------------------------------------------------------------\n"; + std::cout << "Repository URL: " << downloadURLBase << "\n"; + std::cout << "Local Filename: " << localFileName << "\n"; + std::cout << "GIT Hash: " << gitHash << "\n"; + std::cout << "SHA 256 Checksum: " << shaCheckSum << "\n"; + std::cout << "---------------------------------------------------------------------------------\n"; + + std::cout << "Verifying " << localFileName << "...\n"; + + std::string calculatedChecksum; + + if (!AMCCommon::CUtils::fileOrPathExistsOnDisk (localFileName)) { + std::cout << "Local package does not exist...\n"; + } + else { + try { + std::vector fileBytes; + AMCCommon::CImportStream_Native ifs_stream(localFileName); + ifs_stream.readIntoMemory(fileBytes); + + calculatedChecksum = picosha2::hash256_hex_string(fileBytes); + std::cout << "Calculated Checksum: " << calculatedChecksum << "\n"; + if (calculatedChecksum != shaCheckSum) { + std::cout << "Checksum mismatch!\n"; + } + } + catch (const std::exception& ex) { + std::cerr << "Error reading file: " << ex.what() << "\n"; + return 1; + } + } + + if (calculatedChecksum != shaCheckSum) { + std::cout << "Creating " << localFileName << "...\n"; + + const std::string fileSegment = "amcf_" + gitHash + ".zip"; + + ParsedURL baseParsed; + if (!parse_url(downloadURLBase, baseParsed)) { + std::cerr << "Invalid repository URL: " << downloadURLBase << "\n"; + return 1; + } + std::string finalPath = join_url_path(baseParsed.path, fileSegment); + std::string finalURL = baseParsed.scheme + "://" + baseParsed.host; + if (baseParsed.port > 0) finalURL += ":" + std::to_string(baseParsed.port); + finalURL += finalPath; + + std::cout << "Downloading package from " << finalURL << "\n"; + std::string err; + download_to_file(finalURL, localFileName); + + try { + std::vector fileBytes; + AMCCommon::CImportStream_Native ifs_stream(localFileName); + ifs_stream.readIntoMemory(fileBytes); + + auto finalChecksum = picosha2::hash256_hex_string(fileBytes); + std::cout << "Final Checksum: " << finalChecksum << "\n"; + if (finalChecksum != shaCheckSum) { + std::cerr << "Checksum mismatch!\n"; + return 1; + } + } + catch (const std::exception& ex) { + std::cerr << "Error reading downloaded file: " << ex.what() << "\n"; + return 1; + } + } + + std::cout << "done..\n"; + return 0; + + } + else { + std::cerr << "Unknown command. Valid commands are download.\n"; + return 1; + } + } + catch (const std::exception& ex) { + std::cerr << "Fatal error: " << ex.what() << "\n"; + return 1; + } + +} diff --git a/BuildScripts/packageManager.go b/BuildScripts/packageManager.go deleted file mode 100644 index e45c43841..000000000 --- a/BuildScripts/packageManager.go +++ /dev/null @@ -1,123 +0,0 @@ -package main - -import ( - "log" - "net/http" - "io/ioutil" - "encoding/hex" - "io" - "crypto/sha256" - "os" -) - - -func main() { - - argsWithProg := os.Args; - - - if (len (argsWithProg) < 2) { - log.Fatal ("Please start with packageManager ...."); - } - - commandToUse := argsWithProg[1]; - - if (commandToUse == "download") { - - - if (len (argsWithProg) < 6) { - log.Fatal ("Please start with packageManager download "); - } - - downloadURLBase := argsWithProg[3]; - localFileName := argsWithProg[2]; - gitHash := argsWithProg[4]; - shaCheckSum := argsWithProg[5]; - - log.Println ("---------------------------------------------------------------------------------"); - log.Println ("-- AMCF Package Manager --"); - log.Println ("---------------------------------------------------------------------------------"); - log.Println ("Repository URL:" + downloadURLBase); - log.Println ("Local Filename:" + localFileName); - log.Println ("GIT Hash:" + gitHash); - log.Println ("SHA 256 Checksum:" + shaCheckSum); - log.Println ("---------------------------------------------------------------------------------"); - - log.Println ("Verifying " + localFileName + "..."); - - calculatedCheckSum := ""; - _, err := os.Stat(localFileName); - if err != nil { - if !os.IsNotExist(err) { - log.Fatal(err); - } - - log.Println ("Local package does not exist..."); - - } else { - - hasher := sha256.New() - fileContent, err := ioutil.ReadFile(localFileName) - hasher.Write(fileContent) - - if err != nil { - log.Fatal(err) - } - calculatedCheckSum = hex.EncodeToString(hasher.Sum(nil)); - log.Println ("Calculated Checksum: " + calculatedCheckSum); - - if (calculatedCheckSum != shaCheckSum) { - log.Println ("Checksum mismatch!"); - } - - } - - - if (calculatedCheckSum != shaCheckSum) { - - log.Println ("Creating " + localFileName + "..."); - targetFile, err := os.Create(localFileName) - if err != nil { - log.Fatal(err) - } - defer targetFile.Close() - - downloadURL := downloadURLBase + "/amcf_" + gitHash + ".zip"; - log.Println ("Downloading package from " + downloadURL); - - response, err := http.Get(downloadURL); - defer response.Body.Close() - - _, err = io.Copy(targetFile, response.Body) - if err != nil { - log.Fatal(err) - } - - hasher := sha256.New() - fileContent, err := ioutil.ReadFile(localFileName) - hasher.Write(fileContent) - - if err != nil { - log.Fatal(err) - } - finalCheckSum := hex.EncodeToString(hasher.Sum(nil)); - log.Println ("Final Checksum: " + finalCheckSum); - - - if (finalCheckSum != shaCheckSum) { - log.Fatal ("Checksum mismatch!"); - } - - } - - - log.Println ("done.."); - - - } else { - - log.Fatal ("Unknown command. Valid commands are download and extract."); - } - - -} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 6780bc676..25b83e821 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,8 +35,9 @@ project(LibMC) option(INCLUDE_DRIVERS "Include the drivers in the build" ON) option(INCLUDE_TESTS "Include the test system in the build" OFF) +option(ENABLE_COVERAGE "Enable coverage instrumentation (GCC/Clang)" OFF) -set(CMAKE_AMCF_PLUGINNAME Examples/LPBFSystem) +set(CMAKE_AMCF_PLUGINNAME Examples/WidgetTest) set(CMAKE_AMCF_PROJECTDIR ${PROJECT_BINARY_DIR}) @@ -48,6 +49,26 @@ message(STATUS "Including Tests in build") add_subdirectory(Tests) endif() +if(ENABLE_COVERAGE) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + message(STATUS "Coverage enabled") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g --coverage") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g --coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage") + if(UNIX AND NOT APPLE) + add_custom_target(coverage + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/DevTools/coverage_linux.sh --unittest + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Running unit test coverage (Linux)" + VERBATIM + ) + endif() + else() + message(WARNING "Coverage enabled but compiler is not supported for --coverage") + endif() +endif() + set (CMAKE_CXX_STANDARD 17) # The location of autogenerated interfaces @@ -78,14 +99,17 @@ endif() # Setting platform dependent executables if (${TARGETPLATFORM} MATCHES "win64") set(BUILDRESOURCES_EXECUTABLE ${PROJECT_BINARY_DIR}/DevPackage/Framework/buildresources.exe) + set(BUILDRESOURCES_OUTPUT_NAME "buildresources") set(DLLEXTENSION "dll") set(LIB3MF_ARTIFACT "lib3mf_win64.dll") elseif (${TARGETPLATFORM} MATCHES "linux64") set(BUILDRESOURCES_EXECUTABLE ${PROJECT_BINARY_DIR}/DevPackage/Framework/buildresources.linux64) + set(BUILDRESOURCES_OUTPUT_NAME "buildresources.linux64") set(DLLEXTENSION "so") set(LIB3MF_ARTIFACT "lib3mf_linux64.so") elseif (${TARGETPLATFORM} MATCHES "rpi") set(BUILDRESOURCES_EXECUTABLE ${PROJECT_BINARY_DIR}/DevPackage/Framework/buildresources.rpi) + set(BUILDRESOURCES_OUTPUT_NAME "buildresources.rpi") set(DLLEXTENSION "so") set(LIB3MF_ARTIFACT "lib3mf_rpi.so") else () @@ -111,8 +135,11 @@ message(STATUS "Client hash: \"${CLIENTDIRHASH}\"") add_custom_target(finished_drivers ALL) add_dependencies(finished_drivers amc_server) add_dependencies(finished_drivers copy_distribution_libraries) +add_dependencies(finished_drivers build_resources) add_dependencies(finished_drivers create_core_resources) add_dependencies(finished_drivers create_package_xml) +add_dependencies(finished_drivers create_deployment_zip) +add_dependencies(finished_drivers create_dev_package) add_dependencies(finished_drivers build_configuration_xml) add_dependencies(finished_drivers libmc) @@ -532,6 +559,8 @@ add_custom_command( ${CMAKE_CURRENT_PLUGINS_DIR}/Resources/ ${PROJECT_BINARY_DIR}/Output/${GLOBALGITHASH}_core.data) +add_dependencies(create_core_resources build_resources) + #[[++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -716,6 +745,7 @@ file(GLOB UNITTEST_SRC ${LIBMC_SRC_DEP_PUGIXML} ${LIBMC_SRC_DEP_CROSSGUID} ${LIBMC_SRC_DEP_LODEPNG} + ${LIBMCDATA_SRC} ) add_executable(amc_unittest ${UNITTEST_SRC}) @@ -737,12 +767,16 @@ target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Impl target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/UI) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/LibMC) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/LibMCEnv) +target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/LibMCData) +target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/DataModel) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PugiXML) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PicoSHA2) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/libzip) +target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/SQLite) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) target_include_directories(amc_unittest PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) target_compile_options(amc_unittest PRIVATE "-D__GITHASH=${GLOBALGITHASH}") +target_compile_options(amc_unittest PRIVATE "-D__LIBMCDATA_EXPORTS") if(WIN32) @@ -750,10 +784,12 @@ if(WIN32) target_link_libraries(amc_unittest Winmm.lib) target_link_libraries(amc_unittest Shlwapi.lib) target_link_libraries(amc_unittest ws2_32.lib) + target_link_libraries(amc_unittest ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/SQLite/sqlite3.lib) else() target_link_libraries(amc_unittest winmm.lib) target_link_libraries(amc_unittest shlwapi.lib) target_link_libraries(amc_unittest ws2_32.lib) + target_link_libraries(amc_unittest SQLite3) target_link_options(amc_unittest PRIVATE -static-libgcc -static-libstdc++ --static ) endif (MSVC) else() @@ -772,6 +808,9 @@ endif(WIN32) if(UNIX) target_link_libraries(amc_unittest ${LIBUUID_PATH}) + if (NOT APPLE) + target_link_libraries(amc_unittest SQLite3) + endif() endif() @@ -901,3 +940,352 @@ if(UNIX) endif() + + +#[[++ + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ create_deployment_zip Target +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +file(GLOB CREATE_DEPLOYMENT_ZIP_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/createDeploymentZIP.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_zip.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriterentry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp + ${LIBMC_SRC_DEP_ZLIB} +) + +add_executable(create_deployment_zip ${CREATE_DEPLOYMENT_ZIP_SRC} ${LIBMC_SRC_DEP_PUGIXML}) + +target_include_directories(create_deployment_zip PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(create_deployment_zip PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(create_deployment_zip PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(create_deployment_zip + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "create_deployment_zip" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +if(WIN32) + target_link_libraries(create_deployment_zip shlwapi.lib) + target_link_libraries(create_deployment_zip ws2_32.lib) +endif(WIN32) + +if(UNIX) + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(create_deployment_zip ${LIBUUID_PATH}) +endif() + + + +#[[++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ create_dev_package Target ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +file(GLOB CREATE_DEV_PACKAGE_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/createDevPackage.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_zip.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriterentry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp + ${LIBMC_SRC_DEP_ZLIB} +) + +add_executable(create_dev_package ${CREATE_DEV_PACKAGE_SRC}) + +target_include_directories(create_dev_package PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(create_dev_package PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(create_dev_package PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(create_dev_package + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "create_dev_package" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +if(WIN32) + target_link_libraries(create_dev_package shlwapi.lib) + target_link_libraries(create_dev_package ws2_32.lib) +endif(WIN32) + +if(UNIX) + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(create_dev_package ${LIBUUID_PATH}) +endif() + + + +#[[++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ build_resources Target ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +file(GLOB BUILD_RESOURCES_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/buildResources.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_zip.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriterentry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp + ${LIBMC_SRC_DEP_PUGIXML} + ${LIBMC_SRC_DEP_ZLIB} +) + +add_executable(build_resources ${BUILD_RESOURCES_SRC}) + +target_include_directories(build_resources PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(build_resources PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(build_resources PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PugiXML) +target_include_directories(build_resources PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(build_resources + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "${BUILDRESOURCES_OUTPUT_NAME}" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +if(WIN32) + target_link_libraries(build_resources shlwapi.lib) + target_link_libraries(build_resources ws2_32.lib) +endif(WIN32) + +if(UNIX) + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(build_resources ${LIBUUID_PATH}) +endif() + + + +#[[++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ create_client_dist Target ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +file(GLOB CREATE_CLIENT_DIST_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/createClientDist.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_zip.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriterentry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp + ${LIBMC_SRC_DEP_PUGIXML} + ${LIBMC_SRC_DEP_ZLIB} +) + +add_executable(create_client_dist ${CREATE_CLIENT_DIST_SRC}) +target_sources(create_client_dist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp) + +target_include_directories(create_client_dist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(create_client_dist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(create_client_dist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PugiXML) +target_include_directories(create_client_dist PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(create_client_dist + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "create_client_dist" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +if(WIN32) + target_link_libraries(create_client_dist shlwapi.lib) + target_link_libraries(create_client_dist ws2_32.lib) +endif(WIN32) + +if(UNIX) + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(create_client_dist ${LIBUUID_PATH}) +endif() + + + +#[[++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ create_client_source Target ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +file(GLOB CREATE_CLIENT_SOURCE_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/createClientSource.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_zip.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriter.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_portablezipwriterentry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp + ${LIBMC_SRC_DEP_ZLIB} +) + +add_executable(create_client_source ${CREATE_CLIENT_SOURCE_SRC}) +target_sources(create_client_source PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp) + +target_include_directories(create_client_source PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(create_client_source PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(create_client_source PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(create_client_source + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "create_client_source" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +if(WIN32) + target_link_libraries(create_client_source shlwapi.lib) + target_link_libraries(create_client_source ws2_32.lib) +endif(WIN32) + +if(UNIX) + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(create_client_source ${LIBUUID_PATH}) +endif() + + + +#[[++ + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++ packageManager Target ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +]] + + +if(UNIX AND NOT APPLE) + # If you ever want to force static later, set this to TRUE before find_package. + # set(OPENSSL_USE_STATIC_LIBS TRUE) + find_package(OpenSSL REQUIRED) # provides OpenSSL::SSL and OpenSSL::Crypto +endif() + +file(GLOB PACKAGE_MANAGER_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/BuildScripts/packageManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_utils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_importstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common/common_exportstream_native.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/crossguid/guid.cpp +) + +add_executable(package_manager ${PACKAGE_MANAGER_SRC} ${LIBMC_SRC_DEP_PUGIXML}) + +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Implementation/Common) +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PugiXML) +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries) +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/PicoSHA2) +if(MSVC) +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/libressl) +endif() +target_include_directories(package_manager PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/) + +set_target_properties(package_manager + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/DevPackage/Framework" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/DevPackage/Framework" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/DevPackage/Framework" + + OUTPUT_NAME "package_manager" + + VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/Output" +) + + +target_compile_options(package_manager PRIVATE "-D__GITHASH=${GLOBALGITHASH}") +target_compile_options(package_manager PRIVATE "-DUNICODE") +target_compile_options(package_manager PRIVATE "-D_UNICODE") + + +if(MSVC) + target_link_libraries(package_manager shlwapi.lib) + target_link_libraries(package_manager ws2_32.lib) + target_link_libraries(package_manager bcrypt.lib) + + target_link_libraries(package_manager ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/libressl/win64/tls-24.lib) + target_link_libraries(package_manager ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/libressl/win64/crypto-49.lib) + target_link_libraries(package_manager ${CMAKE_CURRENT_SOURCE_DIR}/Libraries/libressl/win64/ssl-52.lib) +endif() + +if(UNIX AND NOT APPLE) + + find_package(Threads REQUIRED) + + if(NOT LIBUUID_PATH) + message(FATAL_ERROR "libuuid not found") + endif() + target_link_libraries(package_manager ${LIBUUID_PATH} OpenSSL::SSL OpenSSL::Crypto Threads::Threads) +endif() diff --git a/Client/core/common/AMCApplication.js b/Client/core/common/AMCApplication.js new file mode 100644 index 000000000..618b1dac8 --- /dev/null +++ b/Client/core/common/AMCApplication.js @@ -0,0 +1,2408 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + +import axios from "axios"; + +async function sha256hex(message) { + const data = new TextEncoder().encode(message); + const hashBuffer = await crypto.subtle.digest('SHA-256', data); + return Array.from(new Uint8Array(hashBuffer)) + .map(b => b.toString(16).padStart(2, '0')) + .join(''); +} + +import * as Assert from "./AMCAsserts.js"; +import * as Common from "./AMCCommon.js" +import * as GitHash from "./AMCGitHash.js" + +import AMCApplicationModule_Content from "../modules/AMCModule_Content.js" +import AMCApplicationModule_GLScene from "../modules/AMCModule_GLScene.js" +import AMCApplicationModule_Graphic from "../modules/AMCModule_Graphic.js" +import AMCApplicationModule_Grid from "../modules/AMCModule_Grid.js" +import AMCApplicationModule_Tabs from "../modules/AMCModule_Tabs.js" +import AMCApplicationModule_Logs from "../modules/AMCModule_Logs.js" +import AMCApplicationModule_LayerView from "../modules/AMCModule_LayerView.js" +import AMCApplicationModule_Custom from "../modules/AMCModule_Custom.js" +import AMCApplicationModule_ParameterList from "../modules/AMCModule_ParameterList.js" +import AMCApplicationModule_StatusList from "../modules/AMCModule_StatusList.js" +import AMCApplicationModule_TogglePanel from "../modules/AMCModule_TogglePanel.js" +import AMCApplicationModule_Form from "../modules/AMCModule_Form.js" +import AMCApplicationModule_Chart from "../modules/AMCModule_Chart.js" +import AMCApplicationModule_JournalHistory from "../modules/AMCModule_JournalHistory.js" +import AMCApplicationModule_Image from "../modules/AMCModule_Image.js" +import AMCApplicationModule_StateMachineGraph from "../modules/AMCModule_StateMachineGraph.js" +import AMCApplicationModule_Paragraph from "../modules/AMCModule_Paragraph.js" +import AMCApplicationModule_Upload from "../modules/AMCModule_Upload.js" +import AMCApplicationModule_BuildList from "../modules/AMCModule_BuildList.js" +import AMCApplicationModule_PartList from "../modules/AMCModule_PartList.js" +import AMCApplicationModule_ExecutionList from "../modules/AMCModule_ExecutionList.js" +import AMCApplicationModule_AlertList from "../modules/AMCModule_AlertList.js" +import AMCApplicationModule_ButtonGroup from "../modules/AMCModule_ButtonGroup.js" +import AMCApplicationModule_ConfigurationList from "../modules/AMCModule_ConfigurationList.js" +import AMCApplicationModule_VideoStream from "../modules/AMCModule_VideoStream.js" +import AMCApplicationModule_Separator from "../modules/AMCModule_Separator.js" +import AMCApplicationModule_StatusBanner from "../modules/AMCModule_StatusBanner.js" +import AMCApplicationModule_Workflow from "../modules/AMCModule_Workflow.js" + +import { validateModuleJSON } from "./AMCModuleSchema.js" + +import AMCApplicationPage from "./AMCPage.js" +import AMCApplicationCustomPage from "./AMCCustomPage.js" +import AMCUpload from "./AMCImplementation_Upload.js" + +import AMCApplicationDialog from "./AMCDialog.js" + +const CONFIG_REQUEST_TIMEOUT_MS = 2000; +const DEFAULT_REQUEST_TIMEOUT_MS = 10000; +const MAX_CONSECUTIVE_FAILURES = 5; + +// Client reactivity metrics: aggregate /api/frontend roundtrips over this window +// (see SSE reactivity plan, Phase 0) and push a single summary to the backend. +const FRONTEND_METRICS_WINDOW_MS = 5000; + +// Attribute names of frontend patches are written onto plain objects and must not reach their prototype. +const FRONTEND_PATCH_FORBIDDEN_NAMES = new Set (["__proto__", "constructor", "prototype"]); + +// Live frontend updates: one SSE stream per tab, with the "since" polling endpoint as fallback. +const FRONTEND_POLL_INTERVAL_MS = 600; +const FRONTEND_STREAM_MAX_CONNECT_FAILURES = 3; +const FRONTEND_STREAM_RETRY_BASE_MS = 1000; +const FRONTEND_STREAM_RETRY_MAX_MS = 15000; +const FRONTEND_STREAM_RECOVERY_INTERVAL_MS = 30000; +// Data that is not part of the frontend status (parameter list values) is refreshed by its module. +const FRONTEND_MODULE_REFRESH_INTERVAL_MS = 600; +const FRONTEND_UNTRACKED_REQUEST_PREFIXES = ["/frontend", "/journal"]; + +export default class AMCApplication extends Common.AMCObject { + + + constructor(apiBaseURL, uiResizeEvent) { + + super (); + this.registerClass ("amcApplication"); + + console.log ("AMC Client git hash: " + GitHash.getClientGitHash ()); + + this.API = { + baseURL: apiBaseURL, + authToken: Common.nullToken (), + unsuccessfulUpdateCounter: 0, + unsuccessfulFrontendCounter: 0, + frontendState: null, + frontendLookup: {}, + frontendTargets: new Map (), + frontendStoreOwners: new Map (), + frontendRevision: 0, + frontendScope: "", + frontendRequestSerial: 0, + frontendAppliedSerial: 0, + navigationRequestSerial: 0, + frontendMetrics: this._createEmptyFrontendMetrics (), + userUUID: Common.nullUUID (), + userLogin: "", + userDescription: "", + userRole: "", + userLanguage: "", + userPermissions: new Set () + } + + this.AppState = { + currentStatus: "initial", // one of "initial" / "login" / "ready" / "error", + currentError: "", + activePage: "", + appResizeEvent: uiResizeEvent, + WebGLInstances: new Map() + } + + this.AppDefinition = { + TextApplicationName: "", + ToolbarLogoUUID: "", + TextCopyRight: "", + MainPage: "", + LogoUUID: "", + DarkLogoUUID: "", + LogoAspectRatio: 1.0, + LoginBackgroundImageUUID: "", + DarkLoginBackgroundImageUUID: "", + LoginWelcomeMessage: "", + LoginStyle: "classic", + LoginSubtitle: "", + LoginPanelUUID: "", + FirstLaunchMode: false, + Colors: {}, + DarkColors: {}, + DefaultTheme: "light" + } + + this.AppContent = { + MenuItems: [], + ToolbarItems: [], + Pages: [], + CustomPages: [], + Dialogs: [], + PageMap: new Map(), + CustomPageMap: new Map(), + DialogMap: new Map(), + ModuleMap: new Map(), + ItemMap: new Map(), + FormEntityMap: new Map() + } + + this.SnackBar = { + Visible: false, + Timeout: -1, + Text: "", + Color: "secondary", + FontColor: "white" + } + + // mode is one of "off" / "connecting" / "stream" / "polling". + this.FrontendUpdates = { + // Identifies this tab within the session's event stream, which serves each tab its active pages and dialogs. + clientID: this._createFrontendClientID (), + enabled: false, + mode: "off", + generation: 0, + source: null, + connectionHasEvents: false, + connectFailures: 0, + revision: 0, + pendingEvents: null, + reconnectTimer: null, + pollTimer: null, + moduleRefreshTimer: null, + changeListener: null, + changeNotificationPending: false + } + + } + + setStatus(newStatus) { + this.AppState.currentStatus = newStatus; + this.AppState.currentError = ""; + if (this.AppState.appResizeEvent) + this.AppState.appResizeEvent (); + } + + setStatusToError(message) { + this.AppState.currentStatus = "error"; + this.AppState.currentError = message || "An unknown error occurred."; + this.closeAllDialogs(); + } + + extractErrorMessage(err) { + if (!err) return "An unknown error occurred."; + if (err.code === "ECONNABORTED") + return "The server did not respond in time. Please ensure the server is running and reachable."; + if (err.response && err.response.data && err.response.data.message) + return err.response.data.message.toString(); + if (err.message) + return err.message.toString(); + return err.toString(); + } + + axiosGetRequest(subURL, config) { + let headers = {} + let authToken = this.API.authToken; + + if (authToken != Common.nullToken ()) + headers.Authorization = "Bearer " + authToken; + + return this._trackRequest(subURL, axios({ + method: "GET", + "headers": headers, + url: this.API.baseURL + subURL, + timeout: DEFAULT_REQUEST_TIMEOUT_MS, + ...config + })); + } + + axiosGetArrayBufferRequest(subURL) { + let headers = {} + let authToken = this.API.authToken; + + if (authToken != Common.nullToken ()) + headers.Authorization = "Bearer " + authToken; + + return this._trackRequest(subURL, axios({ + method: "GET", + "headers": headers, + "responseType": "arraybuffer", + url: this.API.baseURL + subURL + })); + } + + + axiosPostRequest(subURL, data, config) { + let headers = {} + let authToken = this.API.authToken; + + if (authToken != Common.nullToken ()) + headers.Authorization = "Bearer " + authToken; + + return this._trackRequest(subURL, axios({ + "method": "POST", + "url": this.API.baseURL + subURL, + "headers": headers, + "data": data, + timeout: DEFAULT_REQUEST_TIMEOUT_MS, + ...config + })); + } + + axiosPostFormData(subURL, formData, config) { + let headers = { + "Content-Type": "multipart/form-data" + } + let authToken = this.API.authToken; + + if (authToken != Common.nullToken ()) + headers.Authorization = "Bearer " + authToken; + + return this._trackRequest(subURL, axios({ + "method": "POST", + "url": this.API.baseURL + subURL, + "headers": headers, + "data": formData, + ...config + })); + } + + // Responses of other requests update state asynchronously (e.g. list rows loaded after a head id + // change), which frontends without deep reactivity only see through a change notification. + // Frontend status, stream and parameter list requests report their changes themselves, and + // journal queries only feed the state of the component that issued them. + _trackRequest(subURL, request) { + let path = String(subURL); + if (!FRONTEND_UNTRACKED_REQUEST_PREFIXES.some(prefix => path.startsWith(prefix))) { + let notify = () => this._scheduleFrontendChangeNotification(); + request.then(notify, notify); + } + return request; + } + + // Retrieves a generic per-user preference stored under (domain, key). + // Resolves to the parsed JSON document, or null when nothing is stored. + // Never rejects on "not found"; only genuine transport errors reject. + async getUserPreference (domain, key) { + let response = await this.axiosGetRequest ("/userpreferences", { + params: { domain: domain, key: key } + }); + + if (!response || !response.data || response.data.exists !== true) + return null; + + let rawValue = response.data.value; + if (typeof rawValue !== "string" || rawValue.length === 0) + return null; + + try { + return JSON.parse (rawValue); + } catch (parseError) { + // Stored value is not valid JSON; treat as absent rather than throwing. + return null; + } + } + + // Stores a generic per-user preference document under (domain, key). The + // document is serialized to JSON before being sent to the backend. + storeUserPreference (domain, key, valueDocument) { + let serialized = JSON.stringify (valueDocument === undefined ? null : valueDocument); + return this.axiosPostRequest ("/userpreferences", { + "domain": domain, + "key": key, + "value": serialized + }); + } + + // Removes a generic per-user preference stored under (domain, key). + deleteUserPreference (domain, key) { + return this.axiosPostRequest ("/userpreferences/delete", { + "domain": domain, + "key": key + }); + } + + retrieveConfiguration(vuetifythemes) { + this.axiosGetRequest("/config", { timeout: CONFIG_REQUEST_TIMEOUT_MS }) + .then(resultJSON => { + this.AppDefinition.TextApplicationName = resultJSON.data.appname; + this.AppDefinition.TextCopyRight = resultJSON.data.copyright; + this.AppDefinition.MainPage = resultJSON.data.mainpage; + this.AppDefinition.LogoUUID = resultJSON.data.logouuid; + this.AppDefinition.DarkLogoUUID = resultJSON.data.darklogouuid || ""; + this.AppDefinition.LoginBackgroundImageUUID = resultJSON.data.loginbackgrounduuid; + this.AppDefinition.DarkLoginBackgroundImageUUID = resultJSON.data.darkloginbackgrounduuid || ""; + this.AppDefinition.ToolbarLogoUUID = resultJSON.data.toolbarlogouuid; + this.AppDefinition.LoginWelcomeMessage = resultJSON.data.loginwelcomemessage; + this.AppDefinition.LoginStyle = resultJSON.data.loginstyle || "classic"; + this.AppDefinition.LoginSubtitle = resultJSON.data.loginsubtitle || ""; + this.AppDefinition.LoginPanelUUID = resultJSON.data.loginpaneluuid || ""; + + this.AppDefinition.LogoAspectRatio = resultJSON.data.logoaspectratio; + if (resultJSON.data.colors) { + this.AppDefinition.Colors = resultJSON.data.colors; + } else { + this.AppDefinition.Colors = {}; + } + this.AppDefinition.DarkColors = resultJSON.data.darkcolors || {}; + this.AppDefinition.DefaultTheme = resultJSON.data.defaulttheme || "light"; + this.setStatus("login"); + + document.title = this.AppDefinition.TextApplicationName; + + if (vuetifythemes) { + if (this.AppDefinition.Colors.primary) { + vuetifythemes.light.primary = this.AppDefinition.Colors.primary; + vuetifythemes.dark.primary = this.AppDefinition.Colors.primary; + } + if (this.AppDefinition.Colors.secondary) { + vuetifythemes.light.secondary = this.AppDefinition.Colors.secondary; + vuetifythemes.dark.secondary = this.AppDefinition.Colors.secondary; + } + if (this.AppDefinition.Colors.accent) { + vuetifythemes.light.accent = this.AppDefinition.Colors.accent; + vuetifythemes.dark.accent = this.AppDefinition.Colors.accent; + } + if (this.AppDefinition.Colors.error) { + vuetifythemes.light.error = this.AppDefinition.Colors.error; + vuetifythemes.dark.error = this.AppDefinition.Colors.error; + } + } + + this.changePage(this.AppDefinition.MainPage); + }) + .catch(err => { + this.setStatusToError(this.extractErrorMessage(err)); + }); + } + + performLogout() { + this.stopFrontendUpdates (); + this.API.authToken = Common.nullToken (); + this.API.unsuccessfulUpdateCounter = 0; + this.API.userUUID = Common.nullUUID (); + this.API.userLogin = ""; + this.API.userDescription = ""; + this.API.userRole = ""; + this.API.userLanguage = ""; + this.API.userPermissions = new Set (); + } + + requestLogin(userName, userPassword) { + + this.performLogout (); + + this.axiosPostRequest("/auth/", { + "username": userName + }) + .then(async resultCreateSession => { + + let sessionuuid = resultCreateSession.data.sessionuuid; + let sessionkey = resultCreateSession.data.sessionkey; + let loginsalt = resultCreateSession.data.loginsalt; + let clientkey = sessionkey; + + let saltedpassword = await sha256hex(loginsalt + userPassword); + let clientkeyhash = await sha256hex(clientkey + saltedpassword); + let sessionkeyhash = await sha256hex(sessionkey + clientkeyhash); + + let resultAuthenticate = await this.axiosPostRequest("/auth/" + sessionuuid, { + "clientkey": clientkey, + "password": sessionkeyhash + }); + + this.API.authToken = Assert.SHA256Value (resultAuthenticate.data.token); + this.API.userUUID = Assert.UUIDValue (resultAuthenticate.data.useruuid); + this.API.userLogin = Assert.IdentifierString (resultAuthenticate.data.userlogin); + this.API.userDescription = Assert.StringValue (resultAuthenticate.data.userdescription); + this.API.userRole = Assert.IdentifierString (resultAuthenticate.data.userrole); + //this.API.userLanguage = Assert.IdentifierString (resultAuthenticate.data.userlanguage); + this.API.userPermissions = new Set (); + + let permissionArray = Assert.ArrayValue (resultAuthenticate.data.userpermissions); + for (let permission of permissionArray) { + this.API.userPermissions.add (permission); + } + + this.setStatus("ready"); + this.retrieveStateUpdate(); + + }) + .catch(err => { + this.setStatusToError(this.extractErrorMessage(err)); + }); + + } + + + // Leaf modules that were historically content items and can now be + // represented as first-class v2 modules. + _isLeafModuleType (moduleType) + { + return (moduleType === "paragraph") || (moduleType === "image") || (moduleType === "chart") || (moduleType === "videostream") || + (moduleType === "upload") || (moduleType === "buildlist") || (moduleType === "partlist") || (moduleType === "executionlist") || + (moduleType === "alertlist") || (moduleType === "buttongroup") || (moduleType === "parameterlist") || + (moduleType === "statuslist") || (moduleType === "togglepanel") || + (moduleType === "configurationlist") || (moduleType === "form") || (moduleType === "workflow") || (moduleType === "statemachinegraph"); + } + + // Detect whether a JSON object uses the v2 frontend format. + _isV2Format (json) + { + return (json.moduletype !== undefined && json.type === undefined); + } + + // Normalize a v2 frontend JSON node into the legacy shape that + // existing module/item constructors expect. The conversion is + // recursive so that nested submodules (tabs, grid sections) are + // also normalized. + _normalizeV2ToLegacy (v2) + { + if (!v2 || !v2.moduletype) { + if (v2 && typeof v2 === 'object' && !v2.moduletype && !v2.type) + console.warn ('[AMC] _normalizeV2ToLegacy: payload has neither moduletype nor type', v2); + return v2; + } + if (!v2.uuid) + console.warn ('[AMC] _normalizeV2ToLegacy: v2 payload for type "' + v2.moduletype + '" is missing uuid'); + + let legacy = {}; + let moduleType = v2.moduletype; + + legacy.type = moduleType; + legacy.uuid = v2.uuid || ""; + let rawName = (v2.attributes && v2.attributes.name) ? v2.attributes.name : (v2.name || v2.uuid || ""); + legacy.name = /^\d/.test(rawName) ? '_' + rawName : rawName; + legacy.caption = (v2.attributes && v2.attributes.caption !== undefined) ? v2.attributes.caption : ""; + + if (v2.gridcolumn !== undefined) + legacy.gridcolumn = v2.gridcolumn; + if (v2.gridrow !== undefined) + legacy.gridrow = v2.gridrow; + if (v2.gridcolumnspan !== undefined) + legacy.gridcolumnspan = v2.gridcolumnspan; + if (v2.gridrowspan !== undefined) + legacy.gridrowspan = v2.gridrowspan; + + let attrs = v2.attributes || {}; + let subs = v2.submodules || []; + + if (moduleType === "content") { + legacy.headline = attrs.headline || ""; + legacy.title = attrs.title || ""; + legacy.subtitle = attrs.subtitle || ""; + legacy.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + legacy.cardstyle = attrs.cardstyle || "none"; + legacy.cardcolor = attrs.cardcolor || ""; + legacy.spacing = attrs.spacing || 0; + legacy.elevation = attrs.elevation || 2; + if (attrs.cssstyle) legacy.cssstyle = attrs.cssstyle; + legacy.modules = subs.map(sub => this._normalizeV2ToLegacy(sub)); + + } else if (moduleType === "tabs") { + legacy.tabs = subs.map(sub => this._normalizeV2ToLegacy(sub)); + // Optional card framing (mirrors "content"). + legacy.cardstyle = attrs.cardstyle || "none"; + legacy.title = attrs.title || ""; + legacy.subtitle = attrs.subtitle || ""; + + } else if (moduleType === "grid") { + legacy.padding = parseInt(attrs.padding) || 0; + if (v2.columns && v2.columns.length > 0) { + legacy.columns = v2.columns; + } else { + let colCount = parseInt(attrs.columncount) || 1; + legacy.columns = []; + for (let i = 0; i < colCount; i++) + legacy.columns.push({ width: 1, unit: "free" }); + } + + if (v2.rows && v2.rows.length > 0) { + legacy.rows = v2.rows; + } else { + let rowCount = parseInt(attrs.rowcount) || 1; + legacy.rows = []; + for (let i = 0; i < rowCount; i++) + legacy.rows.push({ height: 1, unit: "free" }); + } + + legacy.sections = subs.map(sub => { + let section = this._normalizeV2ToLegacy(sub); + let gc = sub.gridcolumn || 1; + let gr = sub.gridrow || 1; + let gcs = sub.gridcolumnspan || 1; + let grs = sub.gridrowspan || 1; + section.columnstart = gc; + section.columnend = gc + gcs - 1; + section.rowstart = gr; + section.rowend = gr + grs - 1; + section.scrollbars = (sub.scrollbars !== undefined) ? sub.scrollbars : (section.scrollbars || false); + section.columnposition = sub.columnposition || section.columnposition || "stretch"; + section.rowposition = sub.rowposition || section.rowposition || "stretch"; + return section; + }); + + } else if (moduleType === "glscene") { + legacy.scene = { + type: "scene", + uuid: v2.uuid || "", + instances: Array.isArray(attrs.instances) ? attrs.instances.map(inst => Object.assign({}, inst)) : [] + }; + + } else if (moduleType === "graphic") { + legacy.viewminx = parseFloat(attrs.viewminx) || 0; + legacy.viewminy = parseFloat(attrs.viewminy) || 0; + legacy.viewmaxx = parseFloat(attrs.viewmaxx) || 100; + legacy.viewmaxy = parseFloat(attrs.viewmaxy) || 100; + legacy.showgrid = (attrs.showgrid === "1" || attrs.showgrid === true || attrs.showgrid === "true"); + legacy.items = subs.map(sub => this._normalizeV2ItemToLegacy(sub)); + + } else if (moduleType === "layerview") { + // Optional card framing (mirrors "content"). + legacy.cardstyle = attrs.cardstyle || "none"; + legacy.title = attrs.title || ""; + legacy.subtitle = attrs.subtitle || ""; + if (subs.length > 0) { + legacy.items = subs.map(sub => this._normalizeV2ItemToLegacy(sub)); + } else if (attrs.platformuuid) { + // v2 mode: all platform data is in the module-level attributes. + // Synthesise a minimal platform item so the JS module can create it. + legacy.items = [{ + type: "platform", + uuid: attrs.platformuuid, + currentlayer: parseInt(attrs.currentlayer) || 0, + layercount: parseInt(attrs.layercount) || 0, + builduuid: attrs.builduuid || "00000000-0000-0000-0000-000000000000", + executionuuid: attrs.executionuuid || "00000000-0000-0000-0000-000000000000", + scatterplotuuid: attrs.scatterplotuuid || "00000000-0000-0000-0000-000000000000", + sizex: parseFloat(attrs.sizex) || 0, + sizey: parseFloat(attrs.sizey) || 0, + originx: parseFloat(attrs.originx) || 0, + originy: parseFloat(attrs.originy) || 0, + paddingx: parseFloat(attrs.paddingx) || 0, + paddingy: parseFloat(attrs.paddingy) || 0, + transformangle: parseFloat(attrs.transformangle) || 0, + rotationcenterx: parseFloat(attrs.rotationcenterx) || 0, + rotationcentery: parseFloat(attrs.rotationcentery) || 0, + translationx: parseFloat(attrs.translationx) || 0, + translationy: parseFloat(attrs.translationy) || 0, + showcoordinatesystem: (attrs.showcoordinatesystem === true || attrs.showcoordinatesystem === 1 || attrs.showcoordinatesystem === "1" || attrs.showcoordinatesystem === "true"), + baseimageresource: attrs.baseimageresource || "", + dark_baseimageresource: attrs.dark_baseimageresource || "", + labelvisible: (attrs.labelvisible === true || attrs.labelvisible === "1" || attrs.labelvisible === "true") ? 1 : 0, + labelcaption: attrs.labelcaption || "", + labelicon: attrs.labelicon || "", + sliderchangeevent: attrs.sliderchangeevent || "", + sliderfixed: (attrs.sliderfixed === true || attrs.sliderfixed === "1" || attrs.sliderfixed === "true") ? 1 : 0, + }]; + } else { + legacy.items = []; + } + + } else if (moduleType === "logs") { + legacy.items = []; + legacy.entries = []; + + } else if (moduleType === "custom") { + let items = []; + let propsItem = { type: "properties", uuid: v2.uuid || "" }; + for (let key in attrs) { + if (key !== "name" && key !== "caption") + propsItem[key] = attrs[key]; + } + items.push(propsItem); + + for (let sub of subs) { + let eventItem = this._normalizeV2ItemToLegacy(sub); + if (eventItem.type === "event") { + eventItem.name = (sub.attributes && sub.attributes.eventname) || ""; + if (eventItem.parameters === undefined) + eventItem.parameters = []; + } + items.push(eventItem); + } + legacy.items = items; + + } else if (moduleType === "form") { + legacy.visible = (attrs.visible !== undefined) + ? (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true") + : true; + let formSubs = subs; + if (subs.length === 1 && subs[0].moduletype === "form") { + formSubs = subs[0].submodules || []; + } + legacy.entities = formSubs.map(sub => { + let a = sub.attributes || {}; + let entity = { + uuid: sub.uuid, + name: a.name || sub.uuid, + type: sub.moduletype || "edit", + caption: a.caption || "", + value: a.value, + disabled: (a.disabled === true || a.disabled === "1" || a.disabled === "true"), + readonly: (a.readonly === true || a.readonly === "1" || a.readonly === "true"), + changeevent: a.changeevent || "", + validation: a.validation || "", + validationmessage: a.validationmessage || "", + minvalue: a.minvalue, + maxvalue: a.maxvalue, + }; + + if ((entity.type === "combobox" || entity.type === "multiselect") && sub.submodules) { + entity.items = sub.submodules.map(item => { + let ia = item.attributes || {}; + return { value: String(ia.value !== undefined ? ia.value : ""), text: ia.text || String(ia.value !== undefined ? ia.value : "") }; + }); + } + + return entity; + }); + + } else if (moduleType === "buttongroup") { + legacy.visible = true; + let bgSubs = subs; + let bgAttrs = attrs; + if (subs.length === 1 && subs[0].moduletype === "buttongroup") { + bgAttrs = subs[0].attributes || {}; + bgSubs = subs[0].submodules || []; + } + legacy.buttondistribution = bgAttrs.buttondistribution || attrs.buttondistribution || ""; + legacy.buttons = bgSubs.map(sub => { + let a = sub.attributes || {}; + return { + uuid: sub.uuid, + name: sub.uuid, + caption: a.caption || "", + disabled: (a.disabled === true || a.disabled === "1" || a.disabled === "true"), + visible: (a.visible === undefined) ? true : (a.visible === true || a.visible === "1" || a.visible === "true"), + event: a.event || "", + targetpage: a.targetpage || "", + icon: a.icon || "", + color: a.color || "", + }; + }); + + } else if (this._isLeafModuleType(moduleType)) { + // Generic leaf type: flatten module-level attrs then submodule[0] attrs. + legacy.visible = (attrs.visible !== undefined) + ? (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true") + : true; + for (let key in attrs) { + if (key !== "name" && key !== "caption" && key !== "visible") + legacy[key] = attrs[key]; + } + if (subs.length > 0 && subs[0].attributes) { + let subAttrs = subs[0].attributes; + for (let key in subAttrs) { + if (legacy[key] === undefined) + legacy[key] = subAttrs[key]; + } + } + // resource aliases + if ((moduleType === "image") && (legacy.imageresource === undefined) && (legacy.resource !== undefined)) + legacy.imageresource = legacy.resource; + if ((moduleType === "videostream") && (legacy.streamresource === undefined) && (legacy.resource !== undefined)) + legacy.streamresource = legacy.resource; + + } else { + for (let key in attrs) + legacy[key] = attrs[key]; + if (subs.length > 0) + legacy.items = subs.map(sub => this._normalizeV2ItemToLegacy(sub)); + } + + return legacy; + } + + // Normalize a v2 submodule (content item / graphic item / etc.) into a + // flat legacy item object: { type, uuid, ...attributes }. + _normalizeV2ItemToLegacy (v2Item) + { + if (!v2Item) + return v2Item; + + let item = {}; + item.type = v2Item.moduletype || ""; + item.uuid = v2Item.uuid || ""; + + let attrs = v2Item.attributes || {}; + for (let key in attrs) + item[key] = attrs[key]; + + // v2 image attributes use "resource", legacy item constructor expects "imageresource". + if ((item.type === "image") && (item.imageresource === undefined) && (item.resource !== undefined)) + item.imageresource = item.resource; + + // Keep a compatibility alias if a v2 stream item uses "resource". + if ((item.type === "videostream") && (item.streamresource === undefined) && (item.resource !== undefined)) + item.streamresource = item.resource; + + if (v2Item.submodules && v2Item.submodules.length > 0) + item.submodules = v2Item.submodules; + + return item; + } + + createModuleInstance (page, moduleDefinitionJSON) + { + Assert.ObjectValue (moduleDefinitionJSON); + Assert.ObjectInstance (page, "amcPage"); + + let def = moduleDefinitionJSON; + if (this._isV2Format(def)) + def = this._normalizeV2ToLegacy(def); + + const validation = validateModuleJSON(def); + if (!validation.valid) { + for (const err of validation.errors) + console.warn ('[AMC] Module validation: ' + err, def); + } + + if (def.type === "content") + return new AMCApplicationModule_Content (page, def); + + if (def.type === "glscene") + return new AMCApplicationModule_GLScene (page, def); + + if (def.type === "graphic") + return new AMCApplicationModule_Graphic (page, def); + + if (def.type === "grid") + return new AMCApplicationModule_Grid (page, def); + + if (def.type === "tabs") + return new AMCApplicationModule_Tabs (page, def); + + if (def.type === "logs") + return new AMCApplicationModule_Logs (page, def); + + if (def.type === "layerview") + return new AMCApplicationModule_LayerView (page, def); + + if (def.type === "custom") + return new AMCApplicationModule_Custom (page, def); + + if (def.type === "parameterlist") + return new AMCApplicationModule_ParameterList (page, def); + if (def.type === "statuslist") + return new AMCApplicationModule_StatusList (page, def); + if (def.type === "togglepanel") + return new AMCApplicationModule_TogglePanel (page, def); + if (def.type === "form") + return new AMCApplicationModule_Form (page, def); + if (def.type === "chart") + return new AMCApplicationModule_Chart (page, def); + if (def.type === "journalhistory") + return new AMCApplicationModule_JournalHistory (page, def); + if (def.type === "image") + return new AMCApplicationModule_Image (page, def); + if (def.type === "paragraph") + return new AMCApplicationModule_Paragraph (page, def); + if (def.type === "upload") + return new AMCApplicationModule_Upload (page, def); + if (def.type === "buildlist") + return new AMCApplicationModule_BuildList (page, def); + if (def.type === "partlist") + return new AMCApplicationModule_PartList (page, def); + if (def.type === "executionlist") + return new AMCApplicationModule_ExecutionList (page, def); + if (def.type === "alertlist") + return new AMCApplicationModule_AlertList (page, def); + if (def.type === "buttongroup") + return new AMCApplicationModule_ButtonGroup (page, def); + if (def.type === "configurationlist") + return new AMCApplicationModule_ConfigurationList (page, def); + if (def.type === "videostream") + return new AMCApplicationModule_VideoStream (page, def); + if (def.type === "separator") + return new AMCApplicationModule_Separator (page, def); + if (def.type === "statusbanner") + return new AMCApplicationModule_StatusBanner (page, def); + if (def.type === "workflow") + return new AMCApplicationModule_Workflow (page, def); + if (def.type === "statemachinegraph") + return new AMCApplicationModule_StateMachineGraph (page, def); + + return null; + + } + + + addModule (moduleInstance) { + if (moduleInstance && moduleInstance.uuid) { + this.AppContent.ModuleMap.set (moduleInstance.uuid, moduleInstance); + + } + } + + addItem (item) { + if (item && item.uuid) { + this.AppContent.ItemMap.set (item.uuid, item); + } + } + + + retrieveStateUpdate() { + + this.axiosGetRequest("/frontend") + + .then(resultJSON => { + + this.AppContent.Pages = []; + this.AppContent.CustomPages = []; + this.AppContent.Dialogs = []; + this.AppContent.PageMap.clear (); + this.AppContent.CustomPageMap.clear (); + this.AppContent.DialogMap.clear (); + this.AppContent.ModuleMap.clear (); + this.AppContent.ItemMap.clear (); + this.AppContent.FormEntityMap.clear (); + + this.AppContent.MenuItems = resultJSON.data.menuitems; + this.AppContent.ToolbarItems = resultJSON.data.toolbaritems; + + for (let pageJSON of resultJSON.data.pages) { + + let page = new AMCApplicationPage (this, pageJSON); + this.AppContent.Pages.push (page); + this.AppContent.PageMap.set(page.name, page); + } + + if (resultJSON.data.custompages) { + for (let customPageJSON of resultJSON.data.custompages) { + + let custompage = new AMCApplicationCustomPage (this, customPageJSON); + + //alert (custompage.component); + + this.AppContent.CustomPages.push (custompage); + this.AppContent.CustomPageMap.set(custompage.name, custompage); + + } + } + + + for (let dialogJSON of resultJSON.data.dialogs) { + let dialog = new AMCApplicationDialog (this, dialogJSON); + this.AppContent.Dialogs.push (dialog); + this.AppContent.DialogMap.set(dialog.name, dialog); + + } + + // The unfiltered response holds the modules of all pages and dialogs, which is the + // structure the event stream delivers values for. + this._setFrontendState (resultJSON.data, "*"); + this._applyFrontendUpdate (null); + this.startFrontendUpdates (); + + }) + .catch(err => { + this.setStatusToError(this.extractErrorMessage(err)); + }); + } + + + + // ==================================================================== + // Phase 1+2: Fetch v2 frontend state and build a flat UUID lookup + // map so that static items (paragraph, image, upload) can read their + // attributes directly from /api/frontend instead of legacy polling. + // ==================================================================== + + // The server only writes modules for these pages and dialogs; all other pages and dialogs + // carry just their header and visibility. + _frontendActiveScope() { + let activePageNames = this.AppContent.Pages.concat (this.AppContent.CustomPages) + .filter (page => this.pageIsActive (page)) + .map (page => page.name); + let activeDialogNames = this.AppContent.Dialogs + .filter (dialog => dialog.isActive ()) + .map (dialog => dialog.name); + + return { pages: activePageNames.join (","), dialogs: activeDialogNames.join (",") }; + } + + retrieveFrontendState() { + if (!this.userIsLoggedIn() || this._frontendUpdatesUseStream ()) + return Promise.resolve(); + + this.API.frontendRequestSerial++; + let requestSerial = this.API.frontendRequestSerial; + + let requestStartMS = this._nowMS (); + + let requestParams = this._frontendActiveScope (); + let requestScope = requestParams.pages + "|" + requestParams.dialogs; + + // Patches are only meaningful against a local state of the same pages and dialogs. + if (this.API.frontendState && (this.API.frontendRevision > 0) && (this.API.frontendScope === requestScope)) + requestParams.since = this.API.frontendRevision; + + return this.axiosGetRequest("/frontend", { params: requestParams }) + .then(resultJSON => { + this._recordFrontendMetric (requestStartMS, resultJSON); + + // Polls and navigation refreshes overlap; never let an older response replace a newer one. + if ((requestSerial < this.API.frontendAppliedSerial) || this._frontendUpdatesUseStream ()) + return; + + let data = resultJSON.data; + if (!data) + return; + + if (data.changed) { + if (!this._applyFrontendPatch (data, requestScope)) + return; + } + else { + this._setFrontendState (data, requestScope); + } + + this.API.frontendAppliedSerial = requestSerial; + this.API.unsuccessfulFrontendCounter = 0; + + this._applyFrontendVisibility(this.API.frontendState); + // A response to a request issued before the latest navigation may carry stale + // visibility, so it must not redirect away from a page or dialog that was just opened. + if (requestSerial > this.API.navigationRequestSerial) + this._enforceFrontendVisibility(); + }) + .catch(err => { + this.API.unsuccessfulFrontendCounter = (this.API.unsuccessfulFrontendCounter || 0) + 1; + if (this.API.unsuccessfulFrontendCounter > MAX_CONSECUTIVE_FAILURES) { + console.warn("[v2 frontend] repeated failure:", this.extractErrorMessage(err)); + } + }); + } + + // ==================================================================== + // Phase 0: Client reactivity measurement. Aggregate the /api/frontend + // roundtrip durations, response payload sizes and the server-reported + // build time over a short window, then push a single summary record to + // POST /api/frontend/metrics for storage in the session journal. + // ==================================================================== + + _nowMS () { + if ((typeof performance !== "undefined") && performance && (typeof performance.now === "function")) + return performance.now (); + return Date.now (); + } + + _createEmptyFrontendMetrics () { + return { + windowStartWallMicros: 0, + windowStartMS: 0, + count: 0, + sumMS: 0, + minMS: 0, + maxMS: 0, + sumSqMS: 0, + payloadSumBytes: 0, + payloadMaxBytes: 0, + serverBuildSumMS: 0 + }; + } + + _frontendResponsePayloadBytes (resultJSON) { + // Prefer the transport-reported content length; fall back to re-serializing the body. + if (resultJSON && resultJSON.headers) { + let sContentLength = resultJSON.headers["content-length"] || resultJSON.headers["Content-Length"]; + let nContentLength = parseInt (sContentLength, 10); + if (Number.isFinite (nContentLength) && (nContentLength >= 0)) + return nContentLength; + } + try { + if (resultJSON && (resultJSON.data !== undefined)) + return JSON.stringify (resultJSON.data).length; + } + catch (err) { + // Serialization is best-effort only; ignore and report zero. + } + return 0; + } + + _recordFrontendMetric (requestStartMS, resultJSON) { + let nowMS = this._nowMS (); + let durationMS = nowMS - requestStartMS; + if (!(durationMS >= 0)) + durationMS = 0; + + let payloadBytes = this._frontendResponsePayloadBytes (resultJSON); + + let serverBuildMS = 0; + if (resultJSON && resultJSON.data && (typeof resultJSON.data.servertime === "number")) + serverBuildMS = resultJSON.data.servertime; + + let metrics = this.API.frontendMetrics; + if (metrics.count === 0) { + metrics.windowStartWallMicros = Date.now () * 1000; + metrics.windowStartMS = nowMS; + metrics.minMS = durationMS; + metrics.maxMS = durationMS; + } + else { + if (durationMS < metrics.minMS) + metrics.minMS = durationMS; + if (durationMS > metrics.maxMS) + metrics.maxMS = durationMS; + } + + metrics.count++; + metrics.sumMS += durationMS; + metrics.sumSqMS += durationMS * durationMS; + metrics.payloadSumBytes += payloadBytes; + if (payloadBytes > metrics.payloadMaxBytes) + metrics.payloadMaxBytes = payloadBytes; + metrics.serverBuildSumMS += serverBuildMS; + + if ((nowMS - metrics.windowStartMS) >= FRONTEND_METRICS_WINDOW_MS) + this._flushFrontendMetrics (); + } + + _flushFrontendMetrics () { + let metrics = this.API.frontendMetrics; + if (metrics.count === 0) + return; + + // Reset the accumulator immediately so a slow/failing push does not block the next window. + this.API.frontendMetrics = this._createEmptyFrontendMetrics (); + + let windowEndWallMicros = Date.now () * 1000; + + let requestBody = { + "label": "frontend", + "intervalstart": metrics.windowStartWallMicros, + "intervalend": windowEndWallMicros, + "requestcount": metrics.count, + "sumduration": metrics.sumMS, + "minduration": metrics.minMS, + "maxduration": metrics.maxMS, + "sumsqduration": metrics.sumSqMS, + "payloadsum": metrics.payloadSumBytes, + "payloadmax": metrics.payloadMaxBytes, + "serverbuildsum": metrics.serverBuildSumMS + }; + + this.axiosPostRequest ("/frontend/metrics", requestBody) + .catch (err => { + // Metrics are best-effort telemetry; never disrupt the UI on failure. + console.warn ("[frontend metrics] push failed:", this.extractErrorMessage (err)); + }); + } + + // Copies the session-dependent visibility flags of the v2 frontend state onto the + // menu items, toolbar items, pages, custom pages and dialogs. + _applyFrontendVisibility(data) { + if (!data) + return; + + let applyItemVisibility = (items, itemsJSON) => { + if (!items || !itemsJSON) + return; + let visibilityMap = new Map(); + for (let itemJSON of itemsJSON) + visibilityMap.set(itemJSON.uuid, itemJSON.visible !== false); + for (let item of items) { + if (visibilityMap.has(item.uuid)) + item.visible = visibilityMap.get(item.uuid); + } + }; + + let applyPageVisibility = (pageMap, pagesJSON) => { + if (!pageMap || !pagesJSON) + return; + for (let pageJSON of pagesJSON) { + let page = pageMap.get(pageJSON.name); + if (page) + page.visible = (pageJSON.visible !== false); + } + }; + + applyItemVisibility(this.AppContent.MenuItems, data.menuitems); + applyItemVisibility(this.AppContent.ToolbarItems, data.toolbaritems); + applyPageVisibility(this.AppContent.PageMap, data.pages); + applyPageVisibility(this.AppContent.CustomPageMap, data.custompages); + applyPageVisibility(this.AppContent.DialogMap, data.dialogs); + } + + // Leaves a page that became hidden and closes dialogs that became hidden. + _enforceFrontendVisibility() { + let activePageName = this.AppState.activePage; + if (activePageName && !this.pageIsVisible(activePageName)) { + let fallbackPageName = ""; + if (this.AppDefinition.MainPage && this.pageIsVisible(this.AppDefinition.MainPage)) { + fallbackPageName = this.AppDefinition.MainPage; + } else { + let firstVisiblePage = this.AppContent.Pages.find(page => page.visible !== false); + if (firstVisiblePage) + fallbackPageName = firstVisiblePage.name; + } + + if (fallbackPageName && fallbackPageName !== activePageName) + this.changePage(fallbackPageName); + } + + for (let dialog of this.AppContent.Dialogs) { + if (dialog.dialogIsActive && dialog.visible === false) + dialog.dialogIsActive = false; + } + } + + pageIsVisible(pageName) { + let page = this.AppContent.PageMap.get(pageName) || this.AppContent.CustomPageMap.get(pageName); + if (page) + return page.visible !== false; + return true; + } + + dialogIsVisible(dialogName) { + let dialog = this.AppContent.DialogMap.get(dialogName); + if (dialog) + return dialog.visible !== false; + return true; + } + + // Menu and toolbar items are hidden if they are hidden themselves or if their target page is hidden. + navigationItemIsVisible(item) { + if (!item || item.visible === false) + return false; + if (item.targetpage) + return this.pageIsVisible(item.targetpage); + return true; + } + + _setFrontendState(data, scope) { + this.API.frontendState = data; + this.API.frontendScope = scope; + this.API.frontendRevision = Number.isSafeInteger (data.revision) ? data.revision : 0; + this._indexFrontendState (data); + } + + // Rebuilds frontendLookup (module uuid -> module JSON), frontendTargets (store uuid -> object that + // receives patched attributes: the item or page JSON itself, or the attributes of a module) and + // frontendStoreOwners (module store uuid -> uuids of the module and its containers, which render it). + _indexFrontendState(data) { + this.API.frontendLookup = {}; + this.API.frontendTargets = new Map (); + this.API.frontendStoreOwners = new Map (); + + for (let itemList of [data.menuitems, data.toolbaritems]) { + if (!itemList) + continue; + for (let item of itemList) { + if (item && item.uuid) + this.API.frontendTargets.set (item.uuid, item); + } + } + + for (let pageList of [data.pages, data.custompages, data.dialogs]) { + if (!pageList) + continue; + for (let page of pageList) { + if (!page) + continue; + if (page.uuid) + this.API.frontendTargets.set (page.uuid, page); + if (page.modules) { + for (let mod of page.modules) { + this._indexFrontendModule(mod, []); + } + } + } + } + } + + // Recursively index a v2 module (and its submodules) by UUID. + _indexFrontendModule(mod, containerUUIDs) { + if (!mod || !mod.uuid) + return; + + if (!mod.attributes) + mod.attributes = {}; + + this.API.frontendLookup[mod.uuid] = mod; + this.API.frontendTargets.set (mod.uuid, mod.attributes); + + let ownerUUIDs = containerUUIDs.concat ([mod.uuid]); + this.API.frontendStoreOwners.set (mod.uuid, ownerUUIDs); + + if (mod.submodules) { + for (let sub of mod.submodules) { + this._indexFrontendModule(sub, ownerUUIDs); + } + } + } + + // Applies a {revision, base, changed} response onto the local frontend state; null removes an attribute. + // Patch values are absolute, so a patch also applies to any local revision between base and revision. + _applyFrontendPatch(data, requestScope) { + if (!this.API.frontendState || (requestScope !== this.API.frontendScope)) + return false; + if (!Number.isSafeInteger (data.revision) || !Number.isSafeInteger (data.base) || !data.changed || (typeof data.changed !== "object")) + return false; + + let localRevision = this.API.frontendRevision; + if (data.revision < localRevision) + return false; + if (data.base > localRevision) { + // The local state misses changes; the next poll fetches the full state. + this.API.frontendRevision = 0; + return false; + } + + this._writeFrontendChanges (data.changed, false); + + this.API.frontendRevision = data.revision; + return true; + } + + // Writes store attributes onto the indexed frontend state. With replaceModuleAttributes, the listed + // stores carry the complete attribute set of a module, so attributes that are not listed are removed. + // Returns the uuids of the modules that render a changed store, or null if a menu item, toolbar item, + // page or dialog changed, which affects the application as a whole. + _writeFrontendChanges(changedStores, replaceModuleAttributes) { + let changedModuleUUIDs = new Set (); + let applicationChanged = false; + + for (let [uuid, attributes] of Object.entries (changedStores)) { + let target = this.API.frontendTargets.get (uuid); + if (!target || !attributes || (typeof attributes !== "object")) + continue; + + let ownerUUIDs = this.API.frontendStoreOwners.get (uuid); + if (ownerUUIDs) { + for (let ownerUUID of ownerUUIDs) + changedModuleUUIDs.add (ownerUUID); + + if (replaceModuleAttributes) { + for (let name of Object.keys (target)) { + if (!Object.prototype.hasOwnProperty.call (attributes, name)) + delete target[name]; + } + } + } + else { + applicationChanged = true; + } + + for (let [name, value] of Object.entries (attributes)) { + if (FRONTEND_PATCH_FORBIDDEN_NAMES.has (name)) + continue; + if (value === null) + delete target[name]; + else + target[name] = value; + } + } + + return applicationChanged ? null : Array.from (changedModuleUUIDs); + } + + // Pushes changed frontend state into the module and item objects and notifies the frontend. + // moduleUUIDs limits the update to the given modules; null updates everything. + _applyFrontendUpdate(moduleUUIDs) { + if (moduleUUIDs === null) { + this.updateModules (); + this.updateContentItems (); + this._applyFrontendVisibility (this.API.frontendState); + this._enforceFrontendVisibility (); + } + else { + for (let uuid of moduleUUIDs) { + this.updateModule (this.AppContent.ModuleMap.get (uuid)); + this.updateContentItem (this.AppContent.ItemMap.get (uuid)); + } + } + + this._notifyFrontendChange (moduleUUIDs); + } + + + // ==================================================================== + // Phase 4: Live frontend updates. After login, one SSE stream per tab + // (/stream/) pushes snapshot and patch events for the module + // stores of all pages and dialogs. If the stream cannot be opened, the + // client polls GET /api/frontend?since= instead and retries the + // stream periodically. + // ==================================================================== + + // The listener is called with the uuids of the modules whose state changed, or with null if + // the application as a whole may have changed (navigation, visibility, asynchronous loads). + setFrontendChangeListener(listener) { + this.FrontendUpdates.changeListener = (typeof listener === "function") ? listener : null; + } + + _notifyFrontendChange(moduleUUIDs) { + let listener = this.FrontendUpdates.changeListener; + if (!listener) + return; + try { + listener (moduleUUIDs); + } + catch (err) { + console.warn ("[frontend updates] change listener failed:", err); + } + } + + // Coalesces notifications so that the handlers of a completed request run first. + _scheduleFrontendChangeNotification() { + if (this.FrontendUpdates.changeNotificationPending) + return; + this.FrontendUpdates.changeNotificationPending = true; + setTimeout (() => { + this.FrontendUpdates.changeNotificationPending = false; + this._notifyFrontendChange (null); + }, 0); + } + + // While the event stream is used, the indexed state holds all pages and dialogs and must not be + // replaced by the scoped responses of the polling endpoint. + _frontendUpdatesUseStream() { + let mode = this.FrontendUpdates.mode; + return (mode === "stream") || (mode === "connecting"); + } + + // "off", "connecting", "stream" or "polling". + getFrontendUpdateMode() { + return this.FrontendUpdates.mode; + } + + // crypto.randomUUID only exists in secure contexts, and machines are often served over plain HTTP. + _createFrontendClientID() { + let bytes = new Uint8Array (16); + if ((typeof crypto !== "undefined") && crypto && (typeof crypto.getRandomValues === "function")) { + crypto.getRandomValues (bytes); + } + else { + for (let index = 0; index < bytes.length; index++) + bytes[index] = Math.floor (Math.random () * 256); + } + + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + let hex = Array.from (bytes, value => value.toString (16).padStart (2, "0")).join (""); + return hex.substring (0, 8) + "-" + hex.substring (8, 12) + "-" + hex.substring (12, 16) + "-" + hex.substring (16, 20) + "-" + hex.substring (20); + } + + // The stream only carries the modules of the active pages and dialogs; after a change of scope + // it sends a snapshot with the newly active modules. + _reportFrontendStreamScope() { + let updates = this.FrontendUpdates; + let scope = this._frontendActiveScope (); + return this.axiosPostRequest ("/frontend/streamscope", { client: updates.clientID, pages: scope.pages, dialogs: scope.dialogs }) + .catch (err => { + console.warn ("[frontend updates] stream scope update failed:", this.extractErrorMessage (err)); + }); + } + + startFrontendUpdates() { + this.stopFrontendUpdates (); + if (!this.userIsLoggedIn ()) + return; + + let updates = this.FrontendUpdates; + updates.enabled = true; + updates.connectFailures = 0; + updates.revision = 0; + + if (typeof EventSource === "undefined") { + this._startFrontendPolling (); + return; + } + + updates.mode = "connecting"; + this._connectFrontendStream (); + } + + stopFrontendUpdates() { + let updates = this.FrontendUpdates; + updates.enabled = false; + updates.mode = "off"; + updates.revision = 0; + updates.pendingEvents = null; + this._closeFrontendStream (); + this._clearFrontendReconnectTimer (); + this._stopFrontendPolling (); + this._stopFrontendModuleRefresh (); + } + + _closeFrontendStream() { + let updates = this.FrontendUpdates; + updates.generation++; + if (updates.source) { + updates.source.close (); + updates.source = null; + } + } + + _clearFrontendReconnectTimer() { + if (this.FrontendUpdates.reconnectTimer) { + clearTimeout (this.FrontendUpdates.reconnectTimer); + this.FrontendUpdates.reconnectTimer = null; + } + } + + _connectFrontendStream() { + let updates = this.FrontendUpdates; + if (!updates.enabled || !this.userIsLoggedIn ()) + return; + + this._closeFrontendStream (); + let generation = updates.generation; + updates.connectionHasEvents = false; + updates.pendingEvents = null; + + let scope = this._frontendActiveScope (); + this.axiosPostRequest ("/frontend/streamticket", { client: updates.clientID, pages: scope.pages, dialogs: scope.dialogs }) + .then (resultJSON => { + if ((generation !== updates.generation) || !updates.enabled) + return; + + // A scope report sent meanwhile may have been handled before the ticket request. + let currentScope = this._frontendActiveScope (); + if ((currentScope.pages !== scope.pages) || (currentScope.dialogs !== scope.dialogs)) + this._reportFrontendStreamScope (); + + let ticket = Assert.UUIDValue (resultJSON.data.ticket); + let streamURL = this.getStreamURL (ticket); + // A new ticket means a new EventSource, so the resume point is passed explicitly. + if (updates.revision > 0) + streamURL += "?lastEventId=" + encodeURIComponent (String (updates.revision)); + + let source = new EventSource (streamURL); + updates.source = source; + source.addEventListener ("snapshot", event => this._onFrontendStreamEvent (generation, "snapshot", event)); + source.addEventListener ("patch", event => this._onFrontendStreamEvent (generation, "patch", event)); + source.onerror = () => this._onFrontendStreamError (generation); + }) + .catch (err => { + if (generation !== updates.generation) + return; + console.warn ("[frontend updates] stream ticket request failed:", this.extractErrorMessage (err)); + this._onFrontendStreamError (generation); + }); + } + + // The browser reconnects an EventSource on its own, but with the consumed ticket. The stream is + // therefore always closed on error and reopened with a new ticket. + _onFrontendStreamError(generation) { + let updates = this.FrontendUpdates; + if ((generation !== updates.generation) || !updates.enabled) + return; + + this._closeFrontendStream (); + updates.pendingEvents = null; + + if (!updates.connectionHasEvents) + updates.connectFailures++; + else + updates.connectFailures = 1; + + let delayMS; + if (updates.mode === "polling") { + delayMS = FRONTEND_STREAM_RECOVERY_INTERVAL_MS; + } + else if (updates.connectFailures >= FRONTEND_STREAM_MAX_CONNECT_FAILURES) { + console.warn ("[frontend updates] event stream unavailable, falling back to polling"); + this._startFrontendPolling (); + delayMS = FRONTEND_STREAM_RECOVERY_INTERVAL_MS; + } + else { + let backoffMS = Math.min (FRONTEND_STREAM_RETRY_MAX_MS, FRONTEND_STREAM_RETRY_BASE_MS * Math.pow (2, updates.connectFailures - 1)); + // Jitter spreads the reconnects of many clients after a server restart. + delayMS = backoffMS * (0.5 + Math.random () * 0.5); + } + + this._clearFrontendReconnectTimer (); + updates.reconnectTimer = setTimeout (() => { + updates.reconnectTimer = null; + this._connectFrontendStream (); + }, delayMS); + } + + _onFrontendStreamEvent(generation, eventType, event) { + let updates = this.FrontendUpdates; + if ((generation !== updates.generation) || !updates.enabled) + return; + + let data; + try { + data = JSON.parse (event.data); + } + catch (err) { + data = null; + } + if (!data || (typeof data !== "object")) { + this._restartFrontendStream (); + return; + } + + if (!updates.connectionHasEvents) { + updates.connectionHasEvents = true; + updates.connectFailures = 0; + this._enterFrontendStreamMode (); + } + + if (updates.pendingEvents) { + updates.pendingEvents.push ({ eventType: eventType, data: data }); + return; + } + + this._applyFrontendStreamEvent (eventType, data); + } + + // Coming back from polling, the indexed state only holds the active pages and dialogs. The stream + // events are held back until the full structure is loaded again. + _enterFrontendStreamMode() { + let updates = this.FrontendUpdates; + let wasPolling = (updates.mode === "polling"); + if (updates.mode !== "stream") + console.info ("[frontend updates] receiving live updates through the event stream"); + updates.mode = "stream"; + this._stopFrontendPolling (); + this._startFrontendModuleRefresh (); + + if (!wasPolling && (this.API.frontendScope === "*")) + return; + + let generation = updates.generation; + updates.pendingEvents = []; + this.axiosGetRequest ("/frontend") + .then (resultJSON => { + if ((generation !== updates.generation) || !resultJSON.data) + return; + + this._setFrontendState (resultJSON.data, "*"); + let pendingEvents = updates.pendingEvents || []; + updates.pendingEvents = null; + this._applyFrontendUpdate (null); + for (let pendingEvent of pendingEvents) + this._applyFrontendStreamEvent (pendingEvent.eventType, pendingEvent.data); + }) + .catch (err => { + if (generation !== updates.generation) + return; + console.warn ("[frontend updates] loading the frontend structure failed:", this.extractErrorMessage (err)); + this._onFrontendStreamError (generation); + }); + } + + _applyFrontendStreamEvent(eventType, data) { + let updates = this.FrontendUpdates; + if (!Number.isSafeInteger (data.revision)) { + this._restartFrontendStream (); + return; + } + + if (eventType === "snapshot") { + if (!data.stores || (typeof data.stores !== "object")) { + this._restartFrontendStream (); + return; + } + this._writeFrontendChanges (data.stores, true); + updates.revision = data.revision; + this._applyFrontendUpdate (null); + return; + } + + if (!Number.isSafeInteger (data.base) || !data.changed || (typeof data.changed !== "object")) { + this._restartFrontendStream (); + return; + } + + // A patch only applies to the revision it was computed from; anything else forces a snapshot. + if (data.base !== updates.revision) { + updates.revision = 0; + this._restartFrontendStream (); + return; + } + + let changedModuleUUIDs = this._writeFrontendChanges (data.changed, false); + updates.revision = data.revision; + this._applyFrontendUpdate (changedModuleUUIDs); + } + + _restartFrontendStream() { + this.FrontendUpdates.revision = 0; + this.FrontendUpdates.pendingEvents = null; + this._connectFrontendStream (); + } + + _startFrontendPolling() { + let updates = this.FrontendUpdates; + updates.mode = "polling"; + updates.revision = 0; + this._stopFrontendModuleRefresh (); + if (updates.pollTimer) + return; + + updates.pollTimer = setInterval (() => { + this.retrieveFrontendState () + .finally (() => { + this.updateModules (); + this._notifyFrontendChange (null); + }); + }, FRONTEND_POLL_INTERVAL_MS); + } + + _stopFrontendPolling() { + if (this.FrontendUpdates.pollTimer) { + clearInterval (this.FrontendUpdates.pollTimer); + this.FrontendUpdates.pollTimer = null; + } + } + + // Polling calls updateModules on every cycle, which refreshes such data already. + _startFrontendModuleRefresh() { + let updates = this.FrontendUpdates; + if (updates.moduleRefreshTimer) + return; + + updates.moduleRefreshTimer = setInterval (() => { + for (let module of this.AppContent.ModuleMap.values ()) { + if ((typeof module.refreshLiveData === "function") && module.isActive ()) + module.refreshLiveData (); + } + }, FRONTEND_MODULE_REFRESH_INTERVAL_MS); + } + + _stopFrontendModuleRefresh() { + if (this.FrontendUpdates.moduleRefreshTimer) { + clearInterval (this.FrontendUpdates.moduleRefreshTimer); + this.FrontendUpdates.moduleRefreshTimer = null; + } + } + + // Look up a UUID in the v2 frontend map. Returns the entry or null. + getV2Entry(uuid) { + if (this.API.frontendLookup) { + return this.API.frontendLookup[uuid] || null; + } + return null; + } + + updateContentItem(item) { + + if (!item) + return; + + item.refresh = false; + + if (item.isActive ()) { + + // Items are updated only from the v2 frontend state; an item without an entry + // keeps its current state until the next /api/frontend response contains it. + let v2Entry = this.getV2Entry(item.uuid); + if (v2Entry && v2Entry.attributes) + item.updateFromV2Attributes(Object.assign({}, v2Entry.attributes)); + + item.setRefreshFlag(); + } + + } + + + updateContentItems() { + + let uuid, item; + + if (this.AppContent.ItemMap) { + + for ([uuid, item] of this.AppContent.ItemMap) { + + uuid; + this.updateContentItem(item); + } + + } + + } + + updateModule(module) { + + // Early return if module is invalid + if (!module) + return; + + // Reset refresh flag before attempting update + module.refresh = false; + + if (module.isActive()) { + + // Item payload (entries, etc.) lives in submodule[0]; display attrs + // (caption, visible) live at the module level. Module-level attrs win. + let v2Entry = this.getV2Entry(module.uuid); + if (v2Entry) { + let subAttrs = (v2Entry.submodules && v2Entry.submodules.length > 0) + ? (v2Entry.submodules[0].attributes || {}) + : {}; + let effectiveAttrs = Object.assign({}, subAttrs, v2Entry.attributes || {}); + module.updateFromV2Attributes(effectiveAttrs); + } + } + } + + updateModules() { + + let uuid, module; + if (this.AppContent.ModuleMap) { + for ([uuid, module] of this.AppContent.ModuleMap) { + uuid; + this.updateModule(module); + } + } + } + + + onJobUploadChunkSuccess (application, uploadObject, chunkData, uploadOffset) { + + Assert.ObjectInstance (application, "amcApplication"); + Assert.ObjectInstance (uploadObject, "amcUpload"); + Assert.IntegerValue (uploadOffset); + + if (!uploadObject.checkIfUploadIsActive()) + return; + + uploadObject.setStateMessageToProgress (); + + const formData = new FormData(); + formData.append("size", chunkData.byteLength); + formData.append("offset", uploadOffset); + formData.append("data", new Blob([chunkData], { + type: uploadObject.getMimeType () + }), uploadObject.getFileName ()); + + application.axiosPostFormData("/upload/" + uploadObject.streamuuid, formData, { + onUploadProgress: (progressEvent) => uploadObject.reportChunkProgress (uploadOffset, progressEvent.loaded) + }) + .then(async resultUploadHandle => { + + if (!uploadObject.checkIfUploadIsActive()) + return; + + resultUploadHandle; + if (!uploadObject.readChunk (application, application.onJobUploadChunkSuccess)) { + + let checkSum = await uploadObject.calculateChecksum (); + + uploadObject.setStateMessageToWaiting (); + + application.axiosPostRequest("/upload/" + uploadObject.streamuuid + "/finish", { + "streamuuid": uploadObject.streamuuid, + "context": "build", + "sha256": checkSum + }) + .then(resultUploadFinish => { + + uploadObject.clearUploadState (); + + if (uploadObject.hasSuccessEvent ()) { + + let contextuuid = Assert.UUIDValue (resultUploadFinish.data.contextuuid); + + let itemuuid = uploadObject.getItemUUID (); + let eventValues = {} + eventValues[itemuuid] = contextuuid; + + application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); + } + + /*uploadObject.setStateMessageToPreparing (); + + application.axiosPostRequest("/build/prepare", { + "builduuid": uploadObject.contextuuid, + }) + .then(resultBuildPrepare => { + + if (!uploadObject.checkIfUploadIsActive()) + return; + + resultBuildPrepare; + uploadObject.clearUploadState (); + + if (uploadObject.hasSuccessEvent ()) { + + let itemuuid = uploadObject.getItemUUID (); + let eventValues = {} + eventValues[itemuuid] = contextuuid; + + application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); + } + + }) + .catch(err => { + err; +// if (failureevent) + //this.triggerUIEvent(failureevent, itemuuid, {}); + }); */ + }) + + + } + }) + .catch(err => { + err; + }); + + + } + + + performJobUpload(itemState, successEventName, failureEventName) { + + Assert.ObjectInstance (itemState, "amcUploadState"); + + let chosenfile = itemState.getChosenFile (); + + this.axiosPostRequest("/upload/", { + "context": "build", + "name": chosenfile.name, + "size": chosenfile.size, + "mimetype": itemState.getMimeType (), + }) + + .then(resultUploadInit => { + + Assert.ObjectValue (resultUploadInit); + Assert.ObjectValue (resultUploadInit.data); + let streamuuid = Assert.UUIDValue (resultUploadInit.data.streamuuid); + + let currentUpload = new AMCUpload (itemState, streamuuid); + currentUpload.setSuccessEvent (successEventName); + currentUpload.setFailureEvent (failureEventName); + + currentUpload.readChunk (this, this.onJobUploadChunkSuccess); + + + }) + .catch(err => { + err; +/* if (failureeventname) + this.triggerUIEvent(failureeventname, itemuuid, {}); */ + }); + + } + + + onImageUploadChunkSuccess (application, uploadObject, chunkData, uploadOffset) { + + Assert.ObjectInstance (application, "amcApplication"); + Assert.ObjectInstance (uploadObject, "amcUpload"); + Assert.IntegerValue (uploadOffset); + + if (!uploadObject.checkIfUploadIsActive()) + return; + + uploadObject.setStateMessageToProgress (); + + const formData = new FormData(); + formData.append("size", chunkData.byteLength); + formData.append("offset", uploadOffset); + formData.append("data", new Blob([chunkData], { + type: uploadObject.getMimeType () + }), uploadObject.getFileName ()); + + application.axiosPostFormData("/upload/" + uploadObject.streamuuid, formData, { + onUploadProgress: (progressEvent) => uploadObject.reportChunkProgress (uploadOffset, progressEvent.loaded) + }) + .then(async resultUploadHandle => { + + if (!uploadObject.checkIfUploadIsActive()) + return; + + resultUploadHandle; + if (!uploadObject.readChunk (application, application.onImageUploadChunkSuccess)) { + + let checkSum = await uploadObject.calculateChecksum (); + + uploadObject.setStateMessageToWaiting (); + + application.axiosPostRequest("/upload/finish", { + "streamuuid": uploadObject.streamuuid, + "context": "image", + "sha256": checkSum + }) + .then(resultUploadFinish => { + + uploadObject.clearUploadState (); + + if (uploadObject.hasSuccessEvent ()) { + + let contextuuid = Assert.UUIDValue (resultUploadFinish.data.contextuuid); + + let itemuuid = uploadObject.getItemUUID (); + let eventValues = {} + eventValues[itemuuid] = contextuuid; + + application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); + } + + + /*uploadObject.setStateMessageToPreparing (); + + application.axiosPostRequest("/build/prepare", { + "builduuid": uploadObject.contextuuid, + }) + .then(resultBuildPrepare => { + + if (!uploadObject.checkIfUploadIsActive()) + return; + + resultBuildPrepare; + uploadObject.clearUploadState (); + + if (uploadObject.hasSuccessEvent ()) { + + let itemuuid = uploadObject.getItemUUID (); + let eventValues = {} + eventValues[itemuuid] = uploadObject.contextuuid; + + application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); + } + + }) + .catch(err => { + err; +// if (failureevent) + //this.triggerUIEvent(failureevent, itemuuid, {}); + }); */ + }) + + + } + }) + .catch(err => { + err; + }); + + + } + + + + performImageUpload(itemState, successEventName, failureEventName) { + + Assert.ObjectInstance (itemState, "amcUploadState"); + + let chosenfile = itemState.getChosenFile (); + + this.axiosPostRequest("/upload/", { + "context": "build", + "name": chosenfile.name, + "size": chosenfile.size, + "mimetype": itemState.getMimeType (), + }) + + .then(resultUploadInit => { + + Assert.ObjectValue (resultUploadInit); + Assert.ObjectValue (resultUploadInit.data); + let streamuuid = Assert.UUIDValue (resultUploadInit.data.streamuuid); + + let currentUpload = new AMCUpload (itemState, streamuuid); + currentUpload.setSuccessEvent (successEventName); + currentUpload.setFailureEvent (failureEventName); + + //let reader = new FileReader(); + currentUpload.readChunk (this, this.onImageUploadChunkSuccess); + + + }) + .catch(err => { + err; +/* if (failureeventname) + this.triggerUIEvent(failureeventname, itemuuid, {}); */ + }); + + + } + + + changePage(page) { + + let pageString = String(page); + this.AppState.activePage = pageString; + this.API.navigationRequestSerial = this.API.frontendRequestSerial; + + let pageObject = this.AppContent.PageMap.get(pageString); + if(pageObject) { + pageObject.setActive(); + } + + if (this.AppState.appResizeEvent) + this.AppState.appResizeEvent (); + + this.updateContentItems (); + this._refreshFrontendStateAfterNavigation (); + + } + + // Modules of pages and dialogs that were not active during the last poll have + // not received data yet, so fetch it immediately instead of waiting for the next poll. + // The event stream delivers them after the new scope is reported. + _refreshFrontendStateAfterNavigation () { + let frontendStateRequest; + if (this._frontendUpdatesUseStream ()) { + this._reportFrontendStreamScope (); + frontendStateRequest = Promise.resolve (); + } + else { + frontendStateRequest = this.retrieveFrontendState (); + } + frontendStateRequest + .then (() => { + this.updateModules (); + this.updateContentItems (); + if (this.AppState.appResizeEvent) + this.AppState.appResizeEvent (); + this._notifyFrontendChange (null); + }); + } + + closeAllDialogs() { + let dialog; + for (dialog of this.AppContent.Dialogs) { + dialog.dialogIsActive = false; + } + } + + showDialog(dialog) { + + this.closeAllDialogs(); + this.API.navigationRequestSerial = this.API.frontendRequestSerial; + + if (dialog) { + + if (this.AppContent.DialogMap.has(dialog)) { + let dialogObject = this.AppContent.DialogMap.get(dialog); + dialogObject.dialogIsActive = true; + } + } + + if (this.AppState.appResizeEvent) + this.AppState.appResizeEvent (); + + this.updateContentItems (); + this._refreshFrontendStateAfterNavigation (); + + } + + streamDownload (downloadticketuuid) + { + + + /*// Start download in Browser + const a = document.createElement('a'); + a.href = this.getDownloadURL (downloadticketuuid); + a.download = downloadfilename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); */ + + window.open (this.getDownloadURL (downloadticketuuid), "_blank"); + + } + + getImageURL(uuid) { + return this.API.baseURL + '/image/' + uuid; + } + + getChartURL(uuid) { + return this.API.baseURL + '/dataseries/' + uuid; + } + + getDownloadURL(uuid) { + return this.API.baseURL + '/download/' + uuid; + } + + getStreamURL(uuid) { + let streamBase = this.API.baseURL.replace(/\/api$/, ''); + return streamBase + '/stream/' + uuid; + } + + triggerUIEvent(eventname, senderuuid, eventValues, executionCallback, eventParameters) { + + let requestBody = { + "eventname": eventname, + "senderuuid": senderuuid, + "formvalues": eventValues + }; + // Optional event parameters are forwarded as the external event "parameters" + // object, readable in the handler via UIEnvironment::GetExternalEventParameter. + if (eventParameters) + requestBody["parameters"] = eventParameters; + + this.axiosPostRequest("/event", requestBody) + .then(resultHandleEvent => { + + if (resultHandleEvent.data.actions) { + if (Array.isArray(resultHandleEvent.data.actions)) { + let action; + for (action of resultHandleEvent.data.actions) { + if (action.action === "activatemodaldialog") { + this.showDialog(action.dialogname); + } + if (action.action === "activatepage") { + this.changePage(action.pagename); + } + if (action.action === "closemodaldialog") { + this.closeAllDialogs(); + } + if (action.action === "streamdownload") { + this.streamDownload(action.downloadticket); + } + + //this.updateContentItemResult(item.uuid, item); + } + } + } + + if (executionCallback) { + executionCallback (); + } + + }) + .catch(err => { + console.log(err); + }); + } + + triggerWidgetRequest (widgetuuid, requestType, requestJSON, executionCallback) { + + + this.axiosPostRequest("/widget/" + Assert.UUIDValue (widgetuuid) + "/" + Assert.StringValue (requestType), Assert.ObjectValue (requestJSON)) + .then(resultHandleWidgetRequest => { + + if (resultHandleWidgetRequest.data.actions) { + if (Array.isArray(resultHandleWidgetRequest.data.actions)) { + let action; + for (action of resultHandleWidgetRequest.data.actions) { + if (action.action === "activatemodaldialog") { + this.showDialog(action.dialogname); + } + if (action.action === "activatepage") { + this.changePage(action.pagename); + } + if (action.action === "closemodaldialog") { + this.closeAllDialogs(); + } + if (action.action === "streamdownload") { + this.streamDownload(action.downloadticket); + } + + //this.updateContentItemResult(item.uuid, item); + } + } + } + + if (executionCallback) { + executionCallback (); + } + + }) + .catch(err => { + console.log(err); + }); + } + + assembleFormValues(formValueUUIDList) { + + + Assert.ArrayValue (formValueUUIDList); + + let resultObject = {} + for (let entityUUID of formValueUUIDList) { + + if (this.AppContent.FormEntityMap.has (entityUUID)) { + let entity = this.AppContent.FormEntityMap.get (entityUUID); + if (entity.dataObject) { + let formValue = entity.dataObject.value; + resultObject[entityUUID] = formValue; + } + } + } + + return resultObject; + + } + + validateFormValues (eventname, senderuuid, formvalues) { + return this.axiosPostRequest("/validate", { + "eventname": eventname, + "senderuuid": senderuuid, + "formvalues": formvalues + }) + .then(response => { + const data = response.data || {}; + return { + valid: data.valid === true, + errors: data.errors || {} + }; + }) + .catch(err => { + console.log('[AMC] validateFormValues error:', err); + return { valid: true, errors: {} }; + }); + } + + retrieveWebGLInstance(uuid) { + return this.AppState.WebGLInstances[uuid]; + } + + storeWebGLInstance(uuid, instance) { + this.AppState.WebGLInstances[uuid] = instance; + } + + findPage (pageName) { + + if (this.PageMap.has (pageName)) + return this.PageMap.get (pageName); + + return null; + + } + + findCustomPage (pageName) { + + if (this.CustomPageMap.has (pageName)) + return this.CustomPageMap.get (pageName); + + return null; + + } + + userIsLoggedIn () + { + return (this.API.authToken !== Common.nullToken ()); + } + + userUUID () + { + if (!this.userIsLoggedIn ()) + throw "could not get user UUID: user is not logged in"; + + return this.API.userUUID; + } + + userLogin () + { + if (!this.userIsLoggedIn ()) + throw "could not get user login: user is not logged in"; + + return this.API.userLogin; + } + + userDescription () + { + if (!this.userIsLoggedIn ()) + throw "could not get user description: user is not logged in"; + + return this.API.userDescription; + } + + userRole () + { + if (!this.userIsLoggedIn ()) + throw "could not get user role: user is not logged in"; + + return this.API.userRole; + } + + userLanguage () + { + if (!this.userIsLoggedIn ()) + throw "could not get user language: user is not logged in"; + + return this.API.userLanguage; + } + + userPermissions () + { + if (!this.userIsLoggedIn ()) + throw "could not get user permissions: user is not logged in"; + + return new Set(this.API.userPermissions); + } + + checkPermission (permissionIdentifier) + { + if (!this.userIsLoggedIn ()) + return false; + + return this.API.userPermissions.has (Assert.IdentifierString (permissionIdentifier)); + } + + async generateUserPassword (clearTextPassword) + { + if (typeof clearTextPassword !== 'string') + throw "could not set user password: invalid input string"; + + let trimmedPassword = clearTextPassword.trim (); + + if (trimmedPassword.length < Common.minimumPasswordLength ()) + throw "could not set user password: invalid user password length"; + + if (!this.userIsLoggedIn ()) + throw "could not get user permissions: user is not logged in"; + + const randomArray = new Uint32Array(1024); + crypto.getRandomValues(randomArray); + + let randomString = this.API.authToken; + for (let value of randomArray) + randomString = randomString + value.toString (); + + let passwordSalt = await sha256hex(randomString); + let passwordHash = await sha256hex(passwordSalt + trimmedPassword); + + return { + "salt": passwordSalt, + "hash": passwordHash + } + + } + + pageIsActive (page) + { + if (page) { + + if (page.isAlwaysActive) + return true; + + return page.name === this.AppState.activePage; + } + + return false; + } + + +} diff --git a/Client/src/common/AMCAsserts.js b/Client/core/common/AMCAsserts.js similarity index 100% rename from Client/src/common/AMCAsserts.js rename to Client/core/common/AMCAsserts.js diff --git a/Client/src/common/AMCCommon.js b/Client/core/common/AMCCommon.js similarity index 83% rename from Client/src/common/AMCCommon.js rename to Client/core/common/AMCCommon.js index 6ccd8422d..123f991a6 100644 --- a/Client/src/common/AMCCommon.js +++ b/Client/core/common/AMCCommon.js @@ -84,6 +84,8 @@ export class AMCApplicationItem extends AMCObject { this.type = itemtype; this.uuid = uuid; this.refresh = false; + // Phase 2: set to true in subclasses that can be fully driven by v2 attributes + this.usesV2Frontend = false; } setRefreshFlag () @@ -96,6 +98,14 @@ export class AMCApplicationItem extends AMCObject { Assert.ObjectValue (updateJSON); } + // Phase 2: Override in subclasses to apply v2 frontend attributes. + // Return true if the item was fully updated, false to fall back to legacy. + updateFromV2Attributes (attrs) + { + attrs; + return false; + } + getApplication () { return this.moduleInstance.page.application; @@ -128,8 +138,11 @@ export class AMCApplicationModule extends AMCObject { this.type = Assert.IdentifierString (moduletype); this.name = Assert.IdentifierString (name); this.caption = Assert.StringValue (caption); + this.visible = true; this.onDataHasChanged = null; this.stateid = 0; + // Phase 2: set to true in subclasses that can read from v2 frontend + this.usesV2Frontend = false; } callDataHasChanged () @@ -138,6 +151,14 @@ export class AMCApplicationModule extends AMCObject { this.onDataHasChanged (this); } } + + // Phase 2: Override in subclasses to apply v2 frontend attributes. + // Return true if the module was fully updated, false to fall back to legacy. + updateFromV2Attributes (attrs) + { + attrs; + return false; + } isActive () { diff --git a/Client/src/common/AMCCustomPage.js b/Client/core/common/AMCCustomPage.js similarity index 100% rename from Client/src/common/AMCCustomPage.js rename to Client/core/common/AMCCustomPage.js diff --git a/Client/src/common/AMCDialog.js b/Client/core/common/AMCDialog.js similarity index 73% rename from Client/src/common/AMCDialog.js rename to Client/core/common/AMCDialog.js index 48a306f67..fdc622384 100644 --- a/Client/src/common/AMCDialog.js +++ b/Client/core/common/AMCDialog.js @@ -37,8 +37,21 @@ export default class AMCApplicationDialog extends AMCApplicationPage { super (application, dialogJSON); this.registerClass ("amcDialog"); + // The base page class does not track the dialog title (sent as "title" in the + // dialog JSON); capture it so the client can render the dialog header. + this.title = dialogJSON.title || ""; this.dialogIsActive = false; } + // A dialog is never the application's active page, so the inherited page-based + // activeness check would always report false and its modules would never be + // polled/updated (e.g. a configuration list would stay on its loading text and + // synced form values would never refresh). While the dialog is open its modules + // must be treated as active instead. + isActive () + { + return this.dialogIsActive === true; + } + } \ No newline at end of file diff --git a/Client/src/common/AMCGitHash.js b/Client/core/common/AMCGitHash.js similarity index 100% rename from Client/src/common/AMCGitHash.js rename to Client/core/common/AMCGitHash.js diff --git a/Client/src/common/AMCImplementation_Graphic.js b/Client/core/common/AMCImplementation_Graphic.js similarity index 100% rename from Client/src/common/AMCImplementation_Graphic.js rename to Client/core/common/AMCImplementation_Graphic.js diff --git a/Client/src/common/AMCImplementation_LayerView.js b/Client/core/common/AMCImplementation_LayerView.js similarity index 50% rename from Client/src/common/AMCImplementation_LayerView.js rename to Client/core/common/AMCImplementation_LayerView.js index 8653ef5e7..f834a0c90 100644 --- a/Client/src/common/AMCImplementation_LayerView.js +++ b/Client/core/common/AMCImplementation_LayerView.js @@ -32,6 +32,26 @@ const LAYERVIEW_MINSCALING = 0.4; const LAYERVIEW_MAXSCALING = 4000.0; const LAYERVIEW_MINVELOCITYRANGE = 1.0; +// Segments of parts that have been disabled are still drawn, but in this neutral gray. +const LAYERVIEW_DISABLEDPARTCOLOR = 0xB4B4B4; + +// Grid level-of-detail switch band. The grid geometry is self-similar every 5 +// subdivisions, so the lower/upper bounds MUST keep a 5x ratio for the wrap to +// stay seamless (LOWER * GRID_LOD_RECURSION === UPPER). Lowering the band +// compared to the previous 0.5..2.5 keeps the on-screen grid finer and avoids +// the coarse, "clunky" cells that appeared at the top of the old band right +// after a zoom step crossed a threshold. +const LAYERVIEW_GRIDLOD_LOWER = 0.25; +const LAYERVIEW_GRIDLOD_UPPER = 1.25; +const LAYERVIEW_GRIDLOD_RECURSION = 5.0; + +// The grid mesh is (re)generated only on viewport resize, but at render time it +// is scaled by gridScale, which can drop as low as LAYERVIEW_GRIDLOD_LOWER. The +// mesh must therefore span (viewport / LOWER) model units so it still fills the +// screen at the coarsest LOD. Deriving it from LOWER keeps the two in sync if +// the LOD band is ever retuned (e.g. 1 / 0.25 => a 4x-viewport mesh). +const LAYERVIEW_GRIDMESH_VIEWPORTFACTOR = Math.ceil (1.0 / LAYERVIEW_GRIDLOD_LOWER); + class LayerViewImpl { constructor(glInstance) { @@ -53,11 +73,27 @@ class LayerViewImpl { x: 0, y: 0 } + this.transformAngleDegrees = 0.0; + this.rotationCenter = { + x: 0, + y: 0 + }; + this.translation = { + x: 0, + y: 0 + }; this.lineScaleLevel = 0; this.renderNeedsUpdate = true; this.layerSegmentsArray = null; + this.layerPartNames = new Map (); + this.layerDisabledParts = new Set (); + this.partBoundsCache = null; + this.partBoundsCacheKey = ""; + + // Invoked after every pan/zoom/placement change so screen-space overlays can follow. + this.onTransformChanged = null; this.layerPointsMode = "unicolor"; this.layerPointsArray = null; @@ -70,11 +106,36 @@ class LayerViewImpl { this.toolpathVisible = true; this.pointsVisible = true; + this.showLaserOffPoints = false; + this.filteredToOriginalIndexMap = null; + + this.gridColor = undefined; this.updateTransform (); } + applyColors(colorSet) { + if (!colorSet) return; + if (colorSet.background && this.glInstance) + this.glInstance.setBackgroundColor(colorSet.background); + if (colorSet.grid !== undefined) + this.gridColor = colorSet.grid; + this.rebuildGrid(); + this.RenderScene(true); + } + + rebuildGrid() { + if (!this.glInstance) return; + if (this.currentSize.gridWidth <= 0 || this.currentSize.gridHeight <= 0) return; + var gridObject = this.glInstance.scene.getObjectByName("grid"); + if (gridObject) + this.glInstance.scene.remove(gridObject); + this.glInstance.add2DGridGeometry("grid", this.currentSize.gridWidth, this.currentSize.gridHeight, 50, 5, this.gridColor); + this.updateTransform(); + this.renderNeedsUpdate = true; + } + updateSize(width, height) { if ((width > 0) && (height > 0)) { @@ -86,8 +147,8 @@ class LayerViewImpl { this.glInstance.setup2DView(width, height, 0.1, 100); } - var newWidth = width * 2 + 50; - var newHeight = height * 2 + 50; + var newWidth = width * LAYERVIEW_GRIDMESH_VIEWPORTFACTOR + 50; + var newHeight = height * LAYERVIEW_GRIDMESH_VIEWPORTFACTOR + 50; if ((this.currentSize.gridWidth < newWidth) || (this.currentSize.gridHeight < newHeight)) { this.currentSize.gridWidth = newWidth; @@ -110,7 +171,7 @@ class LayerViewImpl { if (gridObject) this.glInstance.scene.remove(gridObject); - this.glInstance.add2DGridGeometry("grid", width, height, 50, 5); + this.glInstance.add2DGridGeometry("grid", width, height, 50, 5, this.gridColor); this.updateTransform (); this.renderNeedsUpdate = true; @@ -118,52 +179,68 @@ class LayerViewImpl { } + transformToolpathPoint(x, y) { + const angleInRadians = this.transformAngleDegrees * Math.PI / 180.0; + const cosine = Math.cos(angleInRadians); + const sine = Math.sin(angleInRadians); + const relativeX = x - this.rotationCenter.x; + const relativeY = y - this.rotationCenter.y; + + return { + x: relativeX * cosine - relativeY * sine + this.rotationCenter.x + this.translation.x, + y: relativeX * sine + relativeY * cosine + this.rotationCenter.y + this.translation.y + }; + } + updateTransform() { if (!this.glInstance) return; + const placementOffset = this.transformToolpathPoint(0, 0); + const toolpathPositionX = this.transform.x + (this.origin.x + placementOffset.x) * this.transform.scaling; + const toolpathPositionY = this.transform.y - (this.origin.y + placementOffset.y) * this.transform.scaling; + var gridgeometry = this.glInstance.findElement("grid"); if (gridgeometry) { var gridScale = this.transform.scaling; var lineScaleLevel = 1; - if (gridScale < 0.5) { - gridScale = gridScale * 5.0; + if (gridScale < LAYERVIEW_GRIDLOD_LOWER) { + gridScale = gridScale * LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.8; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.4; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.25; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.125; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.06; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.02; } - if (gridScale > 2.5) { - gridScale = gridScale / 5.0; + if (gridScale > LAYERVIEW_GRIDLOD_UPPER) { + gridScale = gridScale / LAYERVIEW_GRIDLOD_RECURSION; lineScaleLevel = 0.01; } - - console.log ("line scale level: " + lineScaleLevel); + this.updateLineScaleLevel (lineScaleLevel); var fullGridSize = gridScale * 25.0 * 5; @@ -176,14 +253,26 @@ class LayerViewImpl { var layerlinesgeometry = this.glInstance.findElement("layerdata_lines"); if (layerlinesgeometry) { - layerlinesgeometry.setPositionXY(this.transform.x + this.origin.x * this.transform.scaling, this.transform.y - this.origin.y * this.transform.scaling); + layerlinesgeometry.setPositionXY(toolpathPositionX, toolpathPositionY); layerlinesgeometry.setScaleXY(this.transform.scaling, - this.transform.scaling); + // Three.js composes rotation before the screen-space Y inversion from + // setScaleXY. Negating the angle therefore produces a positive + // counter-clockwise rotation in machine coordinates. + layerlinesgeometry.setRotationZ(-this.transformAngleDegrees * Math.PI / 180.0); + } + + var layerhighlightgeometry = this.glInstance.findElement("layerdata_highlight"); + if (layerhighlightgeometry) { + layerhighlightgeometry.setPositionXY(toolpathPositionX, toolpathPositionY); + layerhighlightgeometry.setScaleXY(this.transform.scaling, - this.transform.scaling); + layerhighlightgeometry.setRotationZ(-this.transformAngleDegrees * Math.PI / 180.0); } var layerpointsgeometry = this.glInstance.findElement("layerdata_points"); if (layerpointsgeometry) { - layerpointsgeometry.setPositionXY(this.transform.x + this.origin.x * this.transform.scaling, this.transform.y - this.origin.y * this.transform.scaling); + layerpointsgeometry.setPositionXY(toolpathPositionX, toolpathPositionY); layerpointsgeometry.setScaleXY(this.transform.scaling, - this.transform.scaling); + layerpointsgeometry.setRotationZ(-this.transformAngleDegrees * Math.PI / 180.0); } var buildplategeometry = this.glInstance.findElement("buildplate"); @@ -193,6 +282,9 @@ class LayerViewImpl { } this.renderNeedsUpdate = true; + + if (typeof this.onTransformChanged === "function") + this.onTransformChanged (); } updateLineScaleLevel (newLineScaleLevel) @@ -220,16 +312,40 @@ class LayerViewImpl { let layerLines = this.glInstance.findElement("layerdata_lines"); if (layerLines) { const pathBoundaries = layerLines.glelement.geometry.boundingSphere; - - return pathBoundaries; + if (!pathBoundaries) + return null; + + const transformedCenter = this.transformToolpathPoint(pathBoundaries.center.x, pathBoundaries.center.y); + + return { + center: { + x: transformedCenter.x, + y: transformedCenter.y, + z: pathBoundaries.center.z + }, + radius: pathBoundaries.radius + }; } else { return null; } } - loadLayer(segmentsArray) { + loadLayer(segmentsArray, partsArray) { this.layerSegmentsArray = segmentsArray; + this.layerPartNames = new Map (); + this.layerDisabledParts = new Set (); + if (Array.isArray (partsArray)) { + for (let part of partsArray) { + if (part && (typeof part.uuid === "string")) { + let partUUID = part.uuid.toLowerCase (); + this.layerPartNames.set (partUUID, (typeof part.name === "string") ? part.name : ""); + if (part.disabled === true) + this.layerDisabledParts.add (partUUID); + } + } + } + this.partBoundsCache = null; this.updateLoadedLayer (); this.updateTransform(); @@ -326,6 +442,28 @@ class LayerViewImpl { } + computeChannelColumnRange (pointsChannelName, pointsColumnName) + { + if (this[pointsChannelName] && this[pointsChannelName][pointsColumnName]) { + let dataArray = this[pointsChannelName][pointsColumnName]; + + let maxValue = Number.NEGATIVE_INFINITY; + let minValue = Number.POSITIVE_INFINITY; + + for (let i = 0; i < dataArray.length; i++) { + let value = dataArray[i]; + if (value > maxValue) { + maxValue = value; + } + if (value < minValue) { + minValue = value; + } + } + this[pointsChannelName][pointsColumnName].max = maxValue; + this[pointsChannelName][pointsColumnName].min = minValue; + } + } + makeLaserOnColors () { this.laserOnPointsColorArray = null; @@ -351,6 +489,37 @@ class LayerViewImpl { } + makeLaserPowerColors () + { + this.layerPointsColorArray = null; + + if (this.laser && this.laser.power && this.layerPointsArray) { + const powerRange = (this.laser.power.max - this.laser.power.min); + if (powerRange > 0) { + + let pointCount = this.laser.power.length; + let colors = []; + + for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) { + let power = this.laser.power[pointIndex]; + let fraction = (power - this.laser.power.min) / powerRange; + if (fraction >= 0.0) { + if (fraction > 1.0) + fraction = 1.0; + } else { + fraction = 0.0; + } + + const hue = (fraction) * 240 / 360; + colors.push (this.hslToRgb (hue, 1.0, 0.5)); + } + + this.layerPointsColorArray = colors; + } + } + } + + hslToRgb(h, s, l) { // Ensure h, s, l are in the range [0, 1] h = h % 1; // Wrap around if h is greater than 1 @@ -429,6 +598,8 @@ class LayerViewImpl { // Assign the data array to the corresponding column this[pointsChannelName][pointsColumnName] = pointsChannelDataArray; + + this.computeChannelColumnRange (pointsChannelName, pointsColumnName); } clearPoints () @@ -469,6 +640,10 @@ class LayerViewImpl { if (this.layerPointsMode == "laseron") { this.makeLaserOnColors (); } + + if (this.layerPointsMode == "powerramp") { + this.makeLaserPowerColors (); + } } setColorMode (newColorMode) { @@ -495,12 +670,45 @@ class LayerViewImpl { this.glInstance.removeElement("layerdata_points"); if (this.layerPointsArray && this.pointsVisible) { - this.glInstance.add2DLocalizedPointsGeometry("layerdata_points", this.layerPointsArray, 61, this.lineScaleLevel * 0.06, 0x00d0ff, this.layerPointsColorArray, -200, -200, 2, 2, 400, 400); + let pointsToRender = this.layerPointsArray; + let colorsToRender = this.layerPointsColorArray; + this.filteredToOriginalIndexMap = null; + + if (!this.showLaserOffPoints && this.laser && this.laser.laseron) { + let pointCount = this.layerPointsArray.length / 2; + let filteredCoords = []; + let filteredColors = colorsToRender ? [] : null; + let indexMap = []; + + for (let i = 0; i < pointCount; i++) { + if (this.laser.laseron[i] !== 0) { + filteredCoords.push(this.layerPointsArray[i * 2], this.layerPointsArray[i * 2 + 1]); + if (filteredColors && colorsToRender[i] !== undefined) { + filteredColors.push(colorsToRender[i]); + } + indexMap.push(i); + } + } + pointsToRender = new Float32Array(filteredCoords); + colorsToRender = filteredColors; + this.filteredToOriginalIndexMap = indexMap; + } + + this.glInstance.add2DLocalizedPointsGeometry("layerdata_points", pointsToRender, 61, this.lineScaleLevel * 0.06, 0x00d0ff, colorsToRender, -200, -200, 2, 2, 400, 400); this.updateTransform (); this.RenderScene (true); } } - + + resolvePointIndex (filteredIndex) + { + if (this.filteredToOriginalIndexMap && filteredIndex >= 0 + && filteredIndex < this.filteredToOriginalIndexMap.length) { + return this.filteredToOriginalIndexMap[filteredIndex]; + } + return filteredIndex; + } + getPointPosition (pointIndex) { if (this.layerPointsArray) { @@ -587,11 +795,25 @@ class LayerViewImpl { } + getPointPower (pointIndex) + { + if (this.laser && this.laser.power) { + if (pointIndex >= 0 && pointIndex < this.laser.power.length) { + return this.laser.power[pointIndex]; + } + } + return null; + } + updateLoadedLayer () { if (!this.glInstance) return; this.glInstance.removeElement("layerdata_lines"); + // The highlighted line references indices into linesCoordinates, which are + // about to be regenerated, so drop any stale highlight overlay. + this.glInstance.removeElement("layerdata_highlight"); + this.highlightLineIndex = -1; if (this.layerSegmentsArray && this.toolpathVisible) { @@ -606,8 +828,20 @@ class LayerViewImpl { for (segmentIndex = 0; segmentIndex < segmentCount; segmentIndex++) { var segment = segmentsArray[segmentIndex]; - let segmentColor = segment.color; - let segmentData = { laserpower: segment.laserpower, laserspeed: segment.laserspeed, profilename: segment.profilename } + let partUUID = (typeof segment.partuuid === "string") ? segment.partuuid.toLowerCase () : ""; + let partDisabled = this.layerDisabledParts.has (partUUID); + let segmentColor = partDisabled ? LAYERVIEW_DISABLEDPARTCOLOR : segment.color; + let segmentData = { + type: segment.type, + laserpower: segment.laserpower, + laserspeed: segment.laserspeed, + profilename: segment.profilename, + partid: segment.partid, + partuuid: partUUID, + partname: this.layerPartNames.get (partUUID) || "", + partdisabled: partDisabled, + laserindex: segment.laserindex + } if ((segment.type === "loop") || (segment.type === "polyline")) { var pointCount = segment.points.length; @@ -620,6 +854,12 @@ class LayerViewImpl { var x = segment.points[pointIndex].x; var y = segment.points[pointIndex].y; + if ((oldx === x) && (oldy === y)) { + oldx = x; + oldy = y; + continue; + } + this.linesCoordinates.push(oldx, oldy, x, y); this.segmentProperties.push (segmentData); vertexcolors.push (segmentColor); @@ -639,6 +879,10 @@ class LayerViewImpl { var x2 = segment.points[lineIndex * 2 + 1].x; var y2 = segment.points[lineIndex * 2 + 1].y; + if ((x1 === x2) && (y1 === y2)) { + continue; + } + this.linesCoordinates.push(x1, y1, x2, y2); this.segmentProperties.push (segmentData); vertexcolors.push (segmentColor); @@ -775,6 +1019,7 @@ class LayerViewImpl { if (this.glInstance) { if (url) { this.svgImage = this.glInstance.addSVGImage("buildplate", url, 35, true, true); + this.updateTransform (); } else { this.glInstance.removeElement ("buildplate"); } @@ -789,6 +1034,298 @@ class LayerViewImpl { this.origin.x = x; this.origin.y = y; } + + // Converts a viewport pixel coordinate (relative to the canvas, in CSS pixels) + // into machine/build-plate coordinates in millimeters. The build plate places + // machine (0,0) at (transform.x, transform.y) with the Y axis inverted, so this + // is the exact inverse of that mapping. Returns null if no valid scaling exists. + /** + * @param {number} screenX + * @param {number} screenY + */ + screenToMachine (screenX, screenY) + { + if (!this.transform) + return null; + + const scaling = this.transform.scaling; + if (!(scaling > 0) || isNaN (screenX) || isNaN (screenY)) + return null; + + return { + x: (screenX - this.transform.x) / scaling, + y: (this.transform.y - screenY) / scaling + }; + } + + // Maps a raw toolpath point (as stored in linesCoordinates, i.e. before the + // placement/rotation/origin transform) into machine/build-plate coordinates + // in millimeters. This is the exact forward of screenToMachine so that a + // cursor position and a segment endpoint can be compared in the same frame. + /** + * @param {number} toolpathX + * @param {number} toolpathY + */ + toolpathPointToMachine (toolpathX, toolpathY) + { + const angleInRadians = this.transformAngleDegrees * Math.PI / 180.0; + const cosine = Math.cos (angleInRadians); + const sine = Math.sin (angleInRadians); + const placement = this.transformToolpathPoint (0, 0); + + return { + x: this.origin.x + placement.x + (toolpathX * cosine + toolpathY * sine), + y: this.origin.y + placement.y + (-toolpathX * sine + toolpathY * cosine) + }; + } + + // Inverse of screenToMachine: machine coordinates (mm) to viewport pixels. + /** + * @param {number} machineX + * @param {number} machineY + */ + machineToScreen (machineX, machineY) + { + if (!this.transform) + return null; + + return { + x: this.transform.x + machineX * this.transform.scaling, + y: this.transform.y - machineY * this.transform.scaling + }; + } + + // Returns one axis-aligned bounding box per part of the loaded layer, in + // machine coordinates (mm). Parts are identified by their build item UUID + // (lower case), which is stable across layers, unlike the layer-local partid. + // Segments without a UUID (older servers) are grouped by partid instead; + // those boxes have an empty uuid. + getPartBoundingBoxes () + { + if (!this.layerSegmentsArray || !this.toolpathVisible) + return []; + + const cacheKey = [this.transformAngleDegrees, this.rotationCenter.x, this.rotationCenter.y, + this.translation.x, this.translation.y, this.origin.x, this.origin.y].join ("|"); + if (this.partBoundsCache && (this.partBoundsCacheKey === cacheKey)) + return this.partBoundsCache; + + const angleInRadians = this.transformAngleDegrees * Math.PI / 180.0; + const cosine = Math.cos (angleInRadians); + const sine = Math.sin (angleInRadians); + const placement = this.transformToolpathPoint (0, 0); + const offsetX = this.origin.x + placement.x; + const offsetY = this.origin.y + placement.y; + + const boxesByKey = new Map (); + for (const segment of this.layerSegmentsArray) { + if (!segment || !Array.isArray (segment.points)) + continue; + + let partUUID = (typeof segment.partuuid === "string") ? segment.partuuid.toLowerCase () : ""; + if (partUUID === "00000000-0000-0000-0000-000000000000") + partUUID = ""; + + let key; + let name; + if (partUUID !== "") { + key = partUUID; + name = this.layerPartNames.get (partUUID) || ""; + } else if (Number.isInteger (segment.partid)) { + key = "partid:" + segment.partid; + name = "Part " + segment.partid; + } else { + continue; + } + + let box = boxesByKey.get (key); + if (!box) { + box = { + key: key, + uuid: partUUID, + name: name, + disabled: (partUUID !== "") && this.layerDisabledParts.has (partUUID), + minx: Infinity, miny: Infinity, maxx: -Infinity, maxy: -Infinity + }; + boxesByKey.set (key, box); + } + + for (const point of segment.points) { + const machineX = offsetX + (point.x * cosine + point.y * sine); + const machineY = offsetY + (-point.x * sine + point.y * cosine); + if (machineX < box.minx) box.minx = machineX; + if (machineX > box.maxx) box.maxx = machineX; + if (machineY < box.miny) box.miny = machineY; + if (machineY > box.maxy) box.maxy = machineY; + } + } + + this.partBoundsCache = Array.from (boxesByKey.values ()).filter ((box) => (box.minx <= box.maxx) && (box.miny <= box.maxy)); + this.partBoundsCacheKey = cacheKey; + return this.partBoundsCache; + } + + // Squared distance from point (px,py) to the line segment (ax,ay)-(bx,by). + static pointSegmentDistanceSq (px, py, ax, ay, bx, by) + { + const dx = bx - ax; + const dy = by - ay; + const lengthSq = dx * dx + dy * dy; + + let t = 0.0; + if (lengthSq > 0.0) { + t = ((px - ax) * dx + (py - ay) * dy) / lengthSq; + if (t < 0.0) t = 0.0; + if (t > 1.0) t = 1.0; + } + + const cx = ax + t * dx; + const cy = ay + t * dy; + const ex = px - cx; + const ey = py - cy; + return ex * ex + ey * ey; + } + + // Finds the toolpath line segment closest to the given machine coordinate + // (mm). Returns the associated segment properties (laser power/speed, profile + // name, part/laser index, type) when within toleranceMM, otherwise null. + /** + * @param {number} machineX + * @param {number} machineY + * @param {number} toleranceMM + */ + pickSegmentAtMachinePoint (machineX, machineY, toleranceMM) + { + if (!this.linesCoordinates || !this.segmentProperties) + return null; + + const coords = this.linesCoordinates; + const lineCount = Math.floor (coords.length / 4); + if (lineCount <= 0) + return null; + + const angleInRadians = this.transformAngleDegrees * Math.PI / 180.0; + const cosine = Math.cos (angleInRadians); + const sine = Math.sin (angleInRadians); + const placement = this.transformToolpathPoint (0, 0); + const baseX = this.origin.x + placement.x; + const baseY = this.origin.y + placement.y; + + let bestDistanceSq = toleranceMM * toleranceMM; + let bestIndex = -1; + + for (let lineIndex = 0; lineIndex < lineCount; lineIndex++) { + const arrayIndex = lineIndex * 4; + const px1 = coords[arrayIndex]; + const py1 = coords[arrayIndex + 1]; + const px2 = coords[arrayIndex + 2]; + const py2 = coords[arrayIndex + 3]; + + const ax = baseX + (px1 * cosine + py1 * sine); + const ay = baseY + (-px1 * sine + py1 * cosine); + const bx = baseX + (px2 * cosine + py2 * sine); + const by = baseY + (-px2 * sine + py2 * cosine); + + const distanceSq = LayerViewImpl.pointSegmentDistanceSq (machineX, machineY, ax, ay, bx, by); + if (distanceSq < bestDistanceSq) { + bestDistanceSq = distanceSq; + bestIndex = lineIndex; + } + } + + if (bestIndex >= 0 && bestIndex < this.segmentProperties.length) + return { ...this.segmentProperties[bestIndex], lineIndex: bestIndex }; + + return null; + } + + // Draws (or removes, when lineIndex < 0) a highlight overlay on top of a + // single toolpath line so the segment currently under the cursor stands out. + // The overlay shares the toolpath transform applied in updateTransform(). + /** + * @param {number} lineIndex + */ + setHighlightLine (lineIndex) + { + if (!this.glInstance) + return; + + this.glInstance.removeElement ("layerdata_highlight"); + this.highlightLineIndex = -1; + + if (lineIndex === undefined || lineIndex === null || lineIndex < 0 || !this.linesCoordinates) { + this.RenderScene (true); + return; + } + + const arrayIndex = lineIndex * 4; + if (arrayIndex + 3 >= this.linesCoordinates.length) { + this.RenderScene (true); + return; + } + + const highlightCoordinates = [ + this.linesCoordinates[arrayIndex], + this.linesCoordinates[arrayIndex + 1], + this.linesCoordinates[arrayIndex + 2], + this.linesCoordinates[arrayIndex + 3] + ]; + + // Noticeably thicker than the regular preview lines (lineScaleLevel * 0.3) + // and drawn at a higher z so it sits above lines (60) and points (61). + const highlightThickness = this.lineScaleLevel * 1.1; + const highlightColor = 0x00e5ff; + + this.glInstance.add2DLineGeometry ("layerdata_highlight", highlightCoordinates, 63, highlightThickness, highlightColor, [highlightColor]); + this.highlightLineIndex = lineIndex; + + this.updateTransform (); + this.RenderScene (true); + } + + clearHighlight () + { + this.setHighlightLine (-1); + } + + // Convenience picker that works directly in viewport pixel space. The pixel + // tolerance is converted to millimeters using the current zoom so the hover + // hit area stays constant on screen regardless of zoom level. + /** + * @param {number} screenX + * @param {number} screenY + * @param {number} [pixelTolerance] + */ + pickSegmentAtScreenPoint (screenX, screenY, pixelTolerance = 6) + { + const machine = this.screenToMachine (screenX, screenY); + if (!machine) + return null; + + const scaling = this.transform.scaling; + if (!(scaling > 0)) + return null; + + return this.pickSegmentAtMachinePoint (machine.x, machine.y, pixelTolerance / scaling); + } + + setTransformAngle (angleInDegrees) + { + this.setCoordinateTransform(angleInDegrees, this.rotationCenter.x, this.rotationCenter.y, this.translation.x, this.translation.y); + } + + setCoordinateTransform (angleInDegrees, rotationCenterX, rotationCenterY, translationX, translationY) + { + if (isNaN(angleInDegrees) || isNaN(rotationCenterX) || isNaN(rotationCenterY) || isNaN(translationX) || isNaN(translationY)) + return; + + this.transformAngleDegrees = Number(angleInDegrees); + this.rotationCenter.x = Number(rotationCenterX); + this.rotationCenter.y = Number(rotationCenterY); + this.translation.x = Number(translationX); + this.translation.y = Number(translationY); + this.updateTransform(); + } } diff --git a/Client/src/common/AMCImplementation_Upload.js b/Client/core/common/AMCImplementation_Upload.js similarity index 80% rename from Client/src/common/AMCImplementation_Upload.js rename to Client/core/common/AMCImplementation_Upload.js index 217d59dde..d37768d74 100644 --- a/Client/src/common/AMCImplementation_Upload.js +++ b/Client/core/common/AMCImplementation_Upload.js @@ -28,8 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import * as asmCrypto from "asmcrypto-lite"; - import * as Assert from "./AMCAsserts.js"; import * as Common from "./AMCCommon.js" @@ -63,22 +61,11 @@ export default class AMCUpload extends Common.AMCObject { this.chunkCount = Math.floor ((this.fileSize + this.chunkSize - 1) / this.chunkSize); this.currentPosition = 0; - // Create SHA Instance - this.shaInstance = new asmCrypto.SHA256(); - this.shaInstance.reset(); + this.chunkBuffers = []; } - bytesToHex (buffer) { - let hex = ""; - let n; - for (n in buffer) { - hex += ("0" + (0xff & buffer[n]).toString(16)).slice(-2); - } - return hex; - } - getFileName () { @@ -134,7 +121,7 @@ export default class AMCUpload extends Common.AMCObject { this.currentPosition = this.currentPosition + bytesToRead; - this.shaInstance.process (dataBuffer); + this.chunkBuffers.push(dataBuffer); if (callback) callback (ownerInstance, this, dataBuffer, uploadOffset); } @@ -159,6 +146,26 @@ export default class AMCUpload extends Common.AMCObject { this.itemState.setMessage (this.itemState.progressMessage + " (" + this.getProgressString () + ")"); } } + + // Reports the overall upload progress while a single chunk is being sent. + // baseOffset is the byte offset of the current chunk within the whole file, + // loadedInChunk is the number of bytes of that chunk uploaded so far (from + // the axios onUploadProgress event). Together they yield the total percentage. + reportChunkProgress (baseOffset, loadedInChunk) + { + if (!this.itemState) + return; + + let uploaded = baseOffset + (loadedInChunk || 0); + if (uploaded > this.fileSize) + uploaded = this.fileSize; + + let percent = 0.0; + if (this.fileSize > 0) + percent = uploaded * 100.0 / this.fileSize; + + this.itemState.setProgress (percent); + } setStateMessageToWaiting () { @@ -178,20 +185,34 @@ export default class AMCUpload extends Common.AMCObject { } } - calculateChecksum () + async calculateChecksum () { - this.shaInstance.finish(); - this.sha256sum = this.bytesToHex (this.shaInstance.result); - this.shaInstance.reset(); - - return this.sha256sum; + const totalLength = this.chunkBuffers.reduce((sum, buf) => sum + buf.byteLength, 0); + const combined = new Uint8Array(totalLength); + let offset = 0; + for (const buf of this.chunkBuffers) { + combined.set(new Uint8Array(buf), offset); + offset += buf.byteLength; + } + + const hashBuffer = await crypto.subtle.digest('SHA-256', combined); + this.sha256sum = Array.from(new Uint8Array(hashBuffer)) + .map(b => b.toString(16).padStart(2, '0')) + .join(''); + + return this.sha256sum; } getChecksum () { return this.sha256sum; } - + + getMimeType () + { + return this.itemState.getMimeType(); + } + checkIfUploadIsActive () { if (this.itemState) { diff --git a/Client/src/common/AMCImplementation_UploadState.js b/Client/core/common/AMCImplementation_UploadState.js similarity index 67% rename from Client/src/common/AMCImplementation_UploadState.js rename to Client/core/common/AMCImplementation_UploadState.js index e2876de2a..cda370110 100644 --- a/Client/src/common/AMCImplementation_UploadState.js +++ b/Client/core/common/AMCImplementation_UploadState.js @@ -52,6 +52,23 @@ export default class AMCUploadState extends Common.AMCObject { this.waitMessage = "Waiting for upload to finish.."; this.buildMessage = "Processing build.."; this.mimeType = "application/binary"; + this.progress = 0; + this._onComplete = null; + this._onError = null; + this._onProgress = null; + } + + // Reports upload progress as a percentage (0..100). Invokes the optional + // _onProgress callback so a frontend widget can render a progress bar. + setProgress (percent) + { + let value = Assert.NumberValue (percent); + if (value < 0) value = 0; + if (value > 100) value = 100; + this.progress = value; + if (this._onProgress) { + try { this._onProgress (value); } catch (_) { /* noop */ } + } } generateUploadID () @@ -68,9 +85,33 @@ export default class AMCUploadState extends Common.AMCObject { } this.chosenFile = null; + this.progress = 0; this.setMessage (this.cancelMessage); + if (this._onError) { + try { this._onError (); } catch (_) { /* noop */ } + this._onComplete = null; + this._onError = null; + this._onProgress = null; + } } + setChosenFile (file) + { + Assert.ObjectValue (file); + this.chosenFile = file; + + if (file.type && file.type.length > 0) { + this.mimeType = file.type; + } else { + const name = (file.name || "").toLowerCase (); + if (name.endsWith (".3mf")) this.mimeType = "application/3mf"; + else if (name.endsWith (".csv")) this.mimeType = "text/csv"; + else if (name.endsWith (".png")) this.mimeType = "image/png"; + else if (name.endsWith (".jpg") || name.endsWith (".jpeg")) this.mimeType = "image/jpeg"; + else this.mimeType = "application/octet-stream"; + } + } + getChosenFile () { if (!this.chosenFile) @@ -86,7 +127,14 @@ export default class AMCUploadState extends Common.AMCObject { { this.uploadID = 0; this.chosenFile = null; + this.progress = 100; this.setMessage (this.finishMessage); + if (this._onComplete) { + try { this._onComplete (); } catch (_) { /* noop */ } + this._onComplete = null; + this._onError = null; + this._onProgress = null; + } } setMessage (messageString) diff --git a/Client/src/common/AMCImplementation_WebGL.js b/Client/core/common/AMCImplementation_WebGL.js similarity index 94% rename from Client/src/common/AMCImplementation_WebGL.js rename to Client/core/common/AMCImplementation_WebGL.js index 811b392b4..90176a90c 100644 --- a/Client/src/common/AMCImplementation_WebGL.js +++ b/Client/core/common/AMCImplementation_WebGL.js @@ -36,6 +36,16 @@ import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; //const RAYCAST_LINE_THRESHOLD = 3; +const DEFAULT_SCENE_BACKGROUND = 0xffffff; +const DEFAULT_GRID_COLOR_FINE = 0xe0e0e0; +const DEFAULT_GRID_COLOR_MEDIUM = 0xc8c8c8; +const DEFAULT_GRID_COLOR_COARSE = 0xc0c0c0; +const GRID_DARK_LUMINANCE_THRESHOLD = 0.3; +const GRID_DARK_SCALE_MEDIUM = 1.4; +const GRID_DARK_SCALE_COARSE = 1.8; +const GRID_LIGHT_SCALE_MEDIUM = 0.88; +const GRID_LIGHT_SCALE_COARSE = 0.78; + class WebGLElement { constructor() { @@ -50,6 +60,7 @@ class WebGLElement { y: 1.0, z: 1.0 } + this.rotationZ = 0.0; } setPosition(x, y, z) { @@ -97,6 +108,14 @@ class WebGLElement { this.glelement.scale.y = y; } } + + setRotationZ(angleInRadians) { + this.rotationZ = angleInRadians; + + if (this.glelement) { + this.glelement.rotation.z = angleInRadians; + } + } updateGLPosition () { @@ -107,6 +126,7 @@ class WebGLElement { this.glelement.scale.x = this.scale.x; this.glelement.scale.y = this.scale.y; this.glelement.scale.z = this.scale.z; + this.glelement.rotation.z = this.rotationZ; } } @@ -596,7 +616,7 @@ class WebGLMeshElement extends WebGLElement { this.glelement = group; - applicationInstance.axiosGetArrayBufferRequest("/ui/meshgeometry/" + normalizedUUID) + applicationInstance.axiosGetArrayBufferRequest("/meshgeometry/" + normalizedUUID) .then(responseData => { let meshpositions = responseData.data; @@ -618,7 +638,7 @@ class WebGLMeshElement extends WebGLElement { } }); - applicationInstance.axiosGetArrayBufferRequest("/ui/meshedges/" + normalizedUUID) + applicationInstance.axiosGetArrayBufferRequest("/meshedges/" + normalizedUUID) .then(responseData => { let linepositions = responseData.data; @@ -652,7 +672,7 @@ class WebGLMeshElement extends WebGLElement { class WebGLGridElement extends WebGLElement { - constructor(width, height, zValue, factor) { + constructor(width, height, zValue, factor, gridBaseColor) { super(); this.lineElement1 = null; @@ -704,9 +724,23 @@ class WebGLGridElement extends WebGLElement { gridArray3.push(0, y * gridRecursionSquared * factor, width, y * gridRecursionSquared * factor); } - this.lineElement1 = new WebGLLinesElement(gridArray1, zValue, 0.5, 0xe0e0e0); - this.lineElement2 = new WebGLLinesElement(gridArray2, zValue, 0.6, 0xc8c8c8); - this.lineElement3 = new WebGLLinesElement(gridArray3, zValue, 0.8, 0xc0c0c0); + let c1 = DEFAULT_GRID_COLOR_FINE, c2 = DEFAULT_GRID_COLOR_MEDIUM, c3 = DEFAULT_GRID_COLOR_COARSE; + if (gridBaseColor !== undefined) { + const base = new THREE.Color(gridBaseColor); + c1 = base.getHex(); + const luminance = base.r * 0.299 + base.g * 0.587 + base.b * 0.114; + if (luminance < GRID_DARK_LUMINANCE_THRESHOLD) { + c2 = base.clone().multiplyScalar(GRID_DARK_SCALE_MEDIUM).getHex(); + c3 = base.clone().multiplyScalar(GRID_DARK_SCALE_COARSE).getHex(); + } else { + c2 = base.clone().multiplyScalar(GRID_LIGHT_SCALE_MEDIUM).getHex(); + c3 = base.clone().multiplyScalar(GRID_LIGHT_SCALE_COARSE).getHex(); + } + } + + this.lineElement1 = new WebGLLinesElement(gridArray1, zValue, 0.5, c1); + this.lineElement2 = new WebGLLinesElement(gridArray2, zValue, 0.6, c2); + this.lineElement3 = new WebGLLinesElement(gridArray3, zValue, 0.8, c3); group.add(this.lineElement1.glelement); group.add(this.lineElement2.glelement); @@ -829,7 +863,7 @@ class WebGLImpl { }); this.scene = new THREE.Scene(); - this.scene.background = new THREE.Color(0xffffff); + this.scene.background = new THREE.Color(DEFAULT_SCENE_BACKGROUND); this.raycaster = new THREE.Raycaster(); @@ -841,6 +875,12 @@ class WebGLImpl { this.controls = null; } + setBackgroundColor(hexColor) { + if (this.scene && hexColor) { + this.scene.background = new THREE.Color(hexColor); + } + } + setup2DView(paramSizeX, paramSizeY, paramNear, paramFar) { let dSizeX = Assert.NumberValue (paramSizeX); @@ -1040,12 +1080,12 @@ class WebGLImpl { } } - add2DGridGeometry(identifier, width, height, zValue, factor) { + add2DGridGeometry(identifier, width, height, zValue, factor, gridBaseColor) { if (!identifier) return; - let gridElement = new WebGLGridElement(width, height, zValue, factor); + let gridElement = new WebGLGridElement(width, height, zValue, factor, gridBaseColor); this.addElement(identifier, gridElement); diff --git a/Client/core/common/AMCModuleSchema.js b/Client/core/common/AMCModuleSchema.js new file mode 100644 index 000000000..a7db4f84d --- /dev/null +++ b/Client/core/common/AMCModuleSchema.js @@ -0,0 +1,171 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + +/** + * Runtime schema definitions for all module types. + * Each entry lists the required fields that must be present for a module + * payload to be considered well-formed, plus an optional list for + * documentation purposes. + * + * validateModuleJSON(json) validates a single module payload object against + * its schema and returns { valid, errors }. + */ + +const MODULE_SCHEMAS = { + content: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headline', 'title', 'subtitle', 'entries'], + }, + grid: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'columns', 'rows', 'sections', 'padding'], + }, + tabs: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'tabs', 'cardstyle', 'title', 'subtitle'], + }, + glscene: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'scene'], + }, + layerview: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'items', 'cardstyle', 'title', 'subtitle'], + }, + graphic: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'viewminx', 'viewminy', 'viewmaxx', 'viewmaxy', 'showgrid', 'items'], + }, + logs: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'entries'], + }, + parameterlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headers', 'entries', 'loadingtext', 'entriesperpage'], + }, + statuslist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'title', 'rows', 'loadingtext'], + }, + togglepanel: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'columns', 'toggles'], + }, + form: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'entities'], + }, + chart: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'dataseries', 'version'], + }, + image: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'imageresource', 'aspectratio', 'maxwidth', 'maxheight'], + }, + paragraph: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'text', 'headline', 'muted'], + }, + upload: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'uploadcaption', 'acceptedtypes', 'uploadclass'], + }, + buildlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headers', 'entries', 'loadingtext', 'entriesperpage', 'selectevent', 'selectionvalueuuid', 'buttonvalueuuid', 'entrybuttons'], + }, + executionlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headers', 'entries', 'loadingtext', 'entriesperpage', 'selectevent', 'selectionvalueuuid', 'buttonvalueuuid', 'entrybuttons'], + }, + partlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'builduuid', 'loadingtext', 'details', 'parts', 'loading', 'errorMessage'], + }, + alertlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headers', 'entries', 'loadingtext', 'entriesperpage', 'selectevent', 'selectionvalueuuid'], + }, + buttongroup: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'buttons', 'cssstyle', 'buttoncssstyle', 'buttondistribution'], + }, + configurationlist: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'headers', 'entries', 'loadingtext', 'entriesperpage', 'selectevent', 'selectionvalueuuid', 'buttonvalueuuid', 'entrybuttons', 'schema'], + }, + videostream: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'streamresource', 'maxwidth', 'maxheight'], + }, + separator: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'orientation', 'variant'], + }, + statusbanner: { + required: ['uuid', 'type'], + optional: ['caption', 'visible', 'severity', 'title', 'description'], + }, + custom: { + required: ['uuid', 'type'], + optional: ['caption', 'visible'], + }, +}; + +/** + * Validate a module JSON payload against the schema for its type. + * + * @param {object} json - raw module payload (after v2-to-legacy normalisation) + * @returns {{ valid: boolean, errors: string[] }} + */ +export function validateModuleJSON (json) { + if (!json || typeof json !== 'object') + return { valid: false, errors: ['Module payload is not an object'] }; + + const type = json.type; + if (!type) + return { valid: false, errors: ['Module payload is missing "type" field'] }; + + const schema = MODULE_SCHEMAS[type]; + if (!schema) + return { valid: false, errors: ['Unknown module type: ' + type] }; + + const errors = []; + for (const field of schema.required) { + if (json[field] == null) + errors.push('Missing required field "' + field + '" in module of type "' + type + '"'); + } + + return { valid: errors.length === 0, errors }; +} + +export default MODULE_SCHEMAS; diff --git a/Client/src/common/AMCPage.js b/Client/core/common/AMCPage.js similarity index 98% rename from Client/src/common/AMCPage.js rename to Client/core/common/AMCPage.js index 897b88123..a45de447f 100644 --- a/Client/src/common/AMCPage.js +++ b/Client/core/common/AMCPage.js @@ -47,6 +47,7 @@ export default class AMCApplicationPage extends Common.AMCObject { this.name = pageJSON.name; this.uuid = pageJSON.uuid; this.showevent = pageJSON.showevent || ""; + this.visible = (pageJSON.visible !== false); this.modules = []; for (let moduleDefinitionJSON of pageJSON.modules) { diff --git a/Client/core/modules/AMCModule_AlertList.js b/Client/core/modules/AMCModule_AlertList.js new file mode 100644 index 000000000..1c3cef8fc --- /dev/null +++ b/Client/core/modules/AMCModule_AlertList.js @@ -0,0 +1,150 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" +import AMCListDeltaSync, { compareEntriesBy } from "../common/AMCListDeltaSync.js"; + + +export default class AMCApplicationModule_AlertList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_AlertList"); + + this.usesV2Frontend = true; + this.entries = []; + + this.headers = [ + { text: 'Time', value: 'alerttimestamp', sortable: true }, + { text: 'Alert', value: 'alertcaption', sortable: true }, + { text: 'Level', value: 'severity', sortable: true }, + { text: 'Context', value: 'alertcontext', sortable: false }, + { text: 'Active', value: 'alertactive', sortable: true }, + ]; + + if (moduleJSON.headers && moduleJSON.headers.length > 0) + this.headers = moduleJSON.headers; + + this.loadingtext = ""; + this.selectevent = ""; + this.selectionvalueuuid = Common.nullUUID (); + this.entriesperpage = 25; + this.listSync = new AMCListDeltaSync (this.entries, "alertuuid", compareEntriesBy ("alerttimestamp", false), + (sinceHeadID) => this.requestAlerts (sinceHeadID)); + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.selectevent) + this.selectevent = Assert.IdentifierString (updateJSON.selectevent); + if (updateJSON.selectionvalueuuid) + this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); + if (updateJSON.entriesperpage) + this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); + + if (!updateJSON.entries) + return; + + let oldEntryCount = this.entries.length; + for (let index = 0; index < oldEntryCount; index++) { + this.entries.pop(); + } + for (let entry of updateJSON.entries) { + this.entries.push(entry); + } + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.selectevent !== undefined) + this.selectevent = attrs.selectevent; + if (attrs.entriesperpage !== undefined) + this.entriesperpage = parseInt(attrs.entriesperpage) || this.entriesperpage; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + if (attrs.alertlistheadid !== undefined) + this.listSync.notifyHeadID (parseInt(attrs.alertlistheadid)); + + return true; + } + + + requestAlerts (sinceHeadID) + { + let url = "/alerts"; + if (sinceHeadID !== null) + url += "?since=" + sinceHeadID; + + return this.page.application.axiosGetRequest(url) + .then(resultJSON => { + let data = resultJSON.data; + if (!data || !Array.isArray(data.alerts)) + throw "invalid alert list response"; + + let rows = []; + for (let alert of data.alerts) { + rows.push({ + alertuuid: alert.alertuuid || "", + alertidentifier: alert.alertidentifier || "", + alerttimestamp: alert.alerttimestamp || "", + alertcaption: alert.alertcaption || "", + alertcontext: alert.alertcontext || "", + alertlevel: alert.alertlevel || "", + severity: alert.alertlevel || "", + alertactive: alert.alertactive || false, + alertneedsacknowledge: alert.alertneedsacknowledge || false, + }); + } + + return { headID: parseInt(data.alertlistheadid), delta: (data.delta === true), rows: rows, removedKeys: [] }; + }); + } + +} diff --git a/Client/core/modules/AMCModule_BuildList.js b/Client/core/modules/AMCModule_BuildList.js new file mode 100644 index 000000000..1893aed2a --- /dev/null +++ b/Client/core/modules/AMCModule_BuildList.js @@ -0,0 +1,182 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" +import AMCListDeltaSync, { compareEntriesBy } from "../common/AMCListDeltaSync.js"; + + +export default class AMCApplicationModule_BuildList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_BuildList"); + + this.usesV2Frontend = true; + this.entries = []; + + this.headers = []; + if (moduleJSON.headers && moduleJSON.headers.length > 0) { + for (let header of moduleJSON.headers) { + this.headers.push({ + text: header.text, + value: header.value, + sortable: header.sortable, + width: header.width, + }); + } + } + + this.entrybuttons = []; + if (moduleJSON.entrybuttons) { + for (let entrybutton of moduleJSON.entrybuttons) { + this.entrybuttons.push({ + uuid: entrybutton.uuid, + caption: entrybutton.caption, + color: entrybutton.color, + cursor: entrybutton.cursor, + selectevent: entrybutton.selectevent, + }); + } + } + + this.loadingtext = ""; + this.selectevent = ""; + this.selectionvalueuuid = Common.nullUUID (); + this.buttonvalueuuid = Common.nullUUID (); + this.thumbnailaspectratio = 1.8; + this.thumbnailheight = "150pt"; + this.thumbnailwidth = ""; + this.entriesperpage = 25; + this.loaded = false; + this.defaultThumbnailUUID = Common.nullUUID (); + this.listSync = new AMCListDeltaSync (this.entries, "buildUUID", compareEntriesBy ("buildTimestamp", true), + (sinceHeadID) => this.requestBuilds (sinceHeadID)); + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.selectevent) + this.selectevent = Assert.IdentifierString (updateJSON.selectevent); + if (updateJSON.selectionvalueuuid) + this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); + if (updateJSON.buttonvalueuuid) + this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); + if (updateJSON.entriesperpage) + this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); + + if (updateJSON.entries) { + let oldEntryCount = this.entries.length; + for (let index = 0; index < oldEntryCount; index++) { + this.entries.pop(); + } + for (let entry of updateJSON.entries) { + this.entries.push(entry); + } + } + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.selectevent !== undefined) + this.selectevent = attrs.selectevent; + if (attrs.entriesperpage !== undefined) + this.entriesperpage = parseInt(attrs.entriesperpage) || this.entriesperpage; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + if (attrs.defaultthumbnail !== undefined) + this.defaultThumbnailUUID = attrs.defaultthumbnail; + if (attrs.selectionvalueuuid !== undefined) + this.selectionvalueuuid = attrs.selectionvalueuuid; + if (attrs.buttonvalueuuid !== undefined) + this.buttonvalueuuid = attrs.buttonvalueuuid; + + if (attrs.buildlistheadid !== undefined) + this.listSync.notifyHeadID (parseInt(attrs.buildlistheadid)); + + return true; + } + + + requestBuilds (sinceHeadID) + { + let url = "/build?status=validated"; + if (sinceHeadID !== null) + url += "&since=" + sinceHeadID; + + return this.page.application.axiosGetRequest(url) + .then(resultJSON => { + this.loaded = true; + + let data = resultJSON.data; + if (!data || !Array.isArray(data.buildjobs)) + throw "invalid build list response"; + + let rows = []; + for (let job of data.buildjobs) { + rows.push({ + buildUUID: job.uuid || "", + buildName: job.name || "", + buildLayers: job.layercount || 0, + buildTimestamp: job.timestamp || "", + buildUser: job.user || "", + buildExecutionCount: job.executioncount || 0, + buildThumbnail: job.thumbnail || this.defaultThumbnailUUID || "00000000-0000-0000-0000-000000000000", + }); + } + + let removedKeys = Array.isArray(data.removed) ? data.removed : []; + + return { headID: parseInt(data.buildlistheadid), delta: (data.delta === true), rows: rows, removedKeys: removedKeys }; + }, error => { + this.loaded = true; + throw error; + }); + } + +} diff --git a/Client/core/modules/AMCModule_ButtonGroup.js b/Client/core/modules/AMCModule_ButtonGroup.js new file mode 100644 index 000000000..44723728e --- /dev/null +++ b/Client/core/modules/AMCModule_ButtonGroup.js @@ -0,0 +1,119 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_ButtonGroup extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_ButtonGroup"); + + this.usesV2Frontend = true; + + this.buttons = Array.isArray(moduleJSON.buttons) ? moduleJSON.buttons : []; + + this.buttoncssstyle = ""; + this.cssstyle = ""; + this.buttondistribution = moduleJSON.buttondistribution || ""; + + let buttondistribution = this.buttondistribution; + + if (buttondistribution === "rightaligned") + this.cssstyle += "text-align: right;"; + if (buttondistribution === "leftaligned") + this.cssstyle += "text-align: left;"; + if (buttondistribution === "centered") + this.cssstyle += "text-align: centered;"; + if (buttondistribution === "equal") { + let buttoncount = this.buttons.length; + if (buttoncount > 0) + this.buttoncssstyle += "min-width: calc(" + (100.0 / buttoncount) + "% - 10px);"; + this.cssstyle += "text-align: center;"; + } + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + if (updateJSON.buttons) + this.buttons = updateJSON.buttons; + if (updateJSON.buttondistribution !== undefined) + this.buttondistribution = updateJSON.buttondistribution; + } + + + updateFromV2Attributes (attrs) + { + let v2Entry = this.page.application.getV2Entry(this.uuid); + if (v2Entry && v2Entry.submodules && v2Entry.submodules.length > 0) { + // ContentLeaf wraps the ButtonGroup item as submodules[0]. + // The individual buttons are one level deeper: submodules[0].submodules. + let itemEntry = v2Entry.submodules[0]; + let buttonEntries = (itemEntry && itemEntry.submodules) ? itemEntry.submodules : []; + this.buttons = buttonEntries.map(sub => { + let a = sub.attributes || {}; + let formValues = []; + if (a.eventformvalues && a.eventformvalues.trim() !== "") { + formValues = a.eventformvalues.split(" "); + } + return { + uuid: sub.uuid, + name: sub.uuid, + caption: a.caption || "", + disabled: (a.disabled === true || a.disabled === "1" || a.disabled === "true"), + visible: (a.visible === undefined) ? true : (a.visible === true || a.visible === "1" || a.visible === "true"), + event: a.event || "", + targetpage: a.targetpage || "", + icon: a.icon || "", + kind: a.kind || "button", + variant: a.variant || "default", + width: a.width || "auto", + iconresource: a.iconresource || "", + eventformvalues: formValues, + }; + }); + } + if (attrs && attrs.buttondistribution !== undefined) + this.buttondistribution = attrs.buttondistribution; + if (attrs && attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs && attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/core/modules/AMCModule_Chart.js b/Client/core/modules/AMCModule_Chart.js new file mode 100644 index 000000000..7d1904dca --- /dev/null +++ b/Client/core/modules/AMCModule_Chart.js @@ -0,0 +1,143 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_Chart extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Chart"); + + this.usesV2Frontend = true; + + this.dataseries = Common.nullUUID (); + this.version = 0; + this.loadeddataseries = Common.nullUUID (); + this.loadedversion = 0; + this.onChartDataUpdated = null; + this.chartData = []; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + let dataSeriesUUID = Common.nullUUID (); + if (updateJSON.dataseries) + dataSeriesUUID = Assert.UUIDValue(updateJSON.dataseries); + + let nVersion = 0; + if (updateJSON.version !== undefined) + nVersion = Assert.IntegerValue(updateJSON.version); + + this.updateDataSeriesMetadata(dataSeriesUUID, nVersion); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + + let dataSeriesUUID = this.dataseries; + if (attrs.dataseries !== undefined) + dataSeriesUUID = Assert.UUIDValue(attrs.dataseries); + + let nVersion = this.version; + if (attrs.version !== undefined) + nVersion = Assert.IntegerValue(attrs.version); + + this.updateDataSeriesMetadata(dataSeriesUUID, nVersion); + return true; + } + + + updateDataSeriesMetadata (dataSeriesUUID, nVersion) + { + this.dataseries = dataSeriesUUID; + this.version = nVersion; + + if ((this.loadeddataseries != this.dataseries) || (this.loadedversion != this.version)) { + this.loadeddataseries = this.dataseries; + this.loadedversion = this.version; + this.refreshChartData (); + } + } + + + refreshChartData () + { + let application = this.page.application; + let normalizedUUID = this.dataseries; + + if ((normalizedUUID == Common.nullUUID ()) || (normalizedUUID == "")) + return; + + application.axiosGetArrayBufferRequest("/dataseries/" + normalizedUUID) + .then(responseData => { + var floatView = new Float32Array(responseData.data); + let dataLength = floatView.length; + let pointCount = dataLength / 2; + + this.chartData = []; + for (let index = 0; index < pointCount; index++) { + let xvalue = floatView[index * 2]; + let yvalue = floatView[index * 2 + 1]; + this.chartData.push ([xvalue, yvalue]); + } + + if (this.onChartDataUpdated) + this.onChartDataUpdated (); + }) + .catch(err => { + this.loadeddataseries = Common.nullUUID (); + if (err.response) { + console.log (err.response); + } else { + console.log ("fatal error while retrieving chart data " + normalizedUUID); + } + }); + } + +} diff --git a/Client/core/modules/AMCModule_ConfigurationList.js b/Client/core/modules/AMCModule_ConfigurationList.js new file mode 100644 index 000000000..0f86dc8db --- /dev/null +++ b/Client/core/modules/AMCModule_ConfigurationList.js @@ -0,0 +1,208 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_ConfigurationList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_ConfigurationList"); + + this.usesV2Frontend = true; + this.entries = []; + + this.headers = []; + if (moduleJSON.headers && moduleJSON.headers.length > 0) { + for (let header of moduleJSON.headers) { + this.headers.push({ + text: header.text, + value: header.value, + sortable: header.sortable, + width: header.width, + align: header.align, + }); + } + } else { + this.headers = [ + { text: "Active", value: "configurationActive", sortable: true, width: "5vw", align: "center" }, + { text: "Version", value: "configurationVersion", sortable: true, width: "5vw", align: "center" }, + { text: "Name", value: "configurationName", sortable: true, width: "15vw" }, + { text: "Upload time", value: "configurationTimestamp", sortable: true, width: "10vw", align: "center" }, + { text: "User", value: "userName", sortable: true, width: "5vw", align: "center" }, + { text: "Actions", value: "configurationActions", sortable: true, width: "20vw", align: "center" }, + ]; + } + + this.entrybuttons = []; + if (moduleJSON.entrybuttons) { + for (let entrybutton of moduleJSON.entrybuttons) { + this.entrybuttons.push({ + uuid: entrybutton.uuid, + caption: entrybutton.caption, + color: entrybutton.color, + cursor: entrybutton.cursor, + selectevent: entrybutton.selectevent, + }); + } + } + + this.loadingtext = ""; + this.selectevent = ""; + this.selectionvalueuuid = Common.nullUUID (); + this.buttonvalueuuid = Common.nullUUID (); + this.thumbnailaspectratio = 1.8; + this.thumbnailheight = "150pt"; + this.thumbnailwidth = ""; + this.entriesperpage = 5; + this.configurationSchema = "com.scanlab.ocmsmc"; + this.lastKnownHeadID = -1; + this.hasFetchedEntries = false; + this.configurationFetchInFlight = false; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.selectevent) + this.selectevent = Assert.IdentifierString (updateJSON.selectevent); + if (updateJSON.selectionvalueuuid) + this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); + if (updateJSON.buttonvalueuuid) + this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); + if (updateJSON.entriesperpage) + this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); + + if (!updateJSON.entries) + return; + + let oldEntryCount = this.entries.length; + for (let index = 0; index < oldEntryCount; index++) { + this.entries.pop(); + } + for (let entry of updateJSON.entries) { + this.entries.push(entry); + } + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.selectevent !== undefined) + this.selectevent = attrs.selectevent; + if (attrs.entriesperpage !== undefined) + this.entriesperpage = parseInt(attrs.entriesperpage) || this.entriesperpage; + if (attrs.selectionvalueuuid !== undefined) + this.selectionvalueuuid = attrs.selectionvalueuuid; + if (attrs.buttonvalueuuid !== undefined) + this.buttonvalueuuid = attrs.buttonvalueuuid; + if (attrs.schema !== undefined) + this.configurationSchema = attrs.schema; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + let shouldFetch = !this.hasFetchedEntries; + + if (attrs.configurationlistheadid !== undefined) { + let headID = parseInt(attrs.configurationlistheadid); + // The head id is a content hash (see frontendWriteItemToJSON) that also encodes + // which version is active, so it can change in either direction. Refetch whenever + // it differs - not just when it grows - otherwise activating a version does not + // refresh the active-marker / list. + if (!isNaN(headID) && headID !== this.lastKnownHeadID) { + this.lastKnownHeadID = headID; + shouldFetch = true; + } + } + + if (!shouldFetch) + return true; + if (this.configurationFetchInFlight) + return true; + + this.configurationFetchInFlight = true; + + let app = this.page.application; + let requestURL = "/configurations"; + if (this.configurationSchema && this.configurationSchema.length > 0) + requestURL += "?schema=" + encodeURIComponent(this.configurationSchema); + + app.axiosGetRequest(requestURL) + .then(resultJSON => { + this.configurationFetchInFlight = false; + this.hasFetchedEntries = true; + + if (resultJSON.data && resultJSON.data.configurations) { + let newEntries = []; + for (let entry of resultJSON.data.configurations) { + newEntries.push({ + configurationActive: !!entry.configurationactive, + configurationVersion: entry.configurationversion || 0, + configurationName: entry.configurationname || "", + userName: entry.username || "", + configurationUUID: entry.configurationuuid || Common.nullUUID (), + configurationTimestamp: entry.configurationtimestamp || "", + }); + } + + // Show the most recent version first. + newEntries.sort((a, b) => b.configurationVersion - a.configurationVersion); + + let oldCount = this.entries.length; + for (let i = 0; i < oldCount; i++) this.entries.pop(); + for (let newEntry of newEntries) this.entries.push(newEntry); + } + }) + .catch(() => { + this.configurationFetchInFlight = false; + }); + + return true; + } + +} diff --git a/Client/core/modules/AMCModule_Content.js b/Client/core/modules/AMCModule_Content.js new file mode 100644 index 000000000..42ddeed0c --- /dev/null +++ b/Client/core/modules/AMCModule_Content.js @@ -0,0 +1,121 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + +export default class AMCApplicationModule_Content extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); + this.registerClass ("amcModule_Content"); + + // Phase 2: content module can read from v2 frontend attributes + this.usesV2Frontend = true; + + this.headline = Assert.StringValue (moduleJSON.headline); + this.title = Assert.StringValue (moduleJSON.title); + this.subtitle = Assert.StringValue (moduleJSON.subtitle); + + this.visible = Assert.BoolValue (moduleJSON.visible); + + this.cardstyle = moduleJSON.cardstyle || "none"; + this.spacing = parseInt (moduleJSON.spacing) || 0; + this.elevation = parseInt (moduleJSON.elevation) || 2; + this.cardcolor = moduleJSON.cardcolor || ""; + + this.modules = []; + + // The legacy backend serialises child modules under the "modules" key via + // writeLegacyDefinitionToJSON; each child is a ContentLeaf shell: + // { type, uuid (ContentLeaf UUID), name, caption, visible, items: [innerJSON] } + // The actual payload (entities, buttons, imageresource …) lives in items[0]. + // Both the "modules" and legacy "items" key are handled with the same + // ContentLeaf-unwrapping logic so the leaf constructors receive clean data. + const childList = + (moduleJSON.modules && Array.isArray(moduleJSON.modules)) ? moduleJSON.modules : + (moduleJSON.items && Array.isArray(moduleJSON.items)) ? moduleJSON.items : + []; + + for (let childJSON of childList) { + // Unwrap ContentLeaf shell when present: real payload is in items[0]. + let innerJSON = (childJSON.items && childJSON.items.length > 0) ? childJSON.items[0] : childJSON; + + let wrappedModuleJSON = Object.assign({}, innerJSON); + wrappedModuleJSON.type = childJSON.type || innerJSON.type; + wrappedModuleJSON.uuid = childJSON.uuid; + wrappedModuleJSON.name = childJSON.name || innerJSON.name || childJSON.uuid || (this.name + "_" + (childJSON.type || "")); + wrappedModuleJSON.caption = (childJSON.caption !== undefined) ? childJSON.caption : (innerJSON.caption || ""); + wrappedModuleJSON.visible = (childJSON.visible !== undefined) ? childJSON.visible : true; + + let childModule = this.page.application.createModuleInstance(this.page, wrappedModuleJSON); + if (!childModule) + throw "Child module type not found: " + (childJSON.type || innerJSON.type); + this.modules.push(childModule); + this.page.application.addModule(childModule); + } + + } + + updateFromJSON(updateJSON) { + + Assert.ObjectValue(updateJSON); + + if(updateJSON.visible !== undefined) + this.visible = Assert.BoolValue(updateJSON.visible); + } + + updateFromV2Attributes (attrs) { + if (attrs.headline !== undefined) + this.headline = attrs.headline; + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.subtitle !== undefined) + this.subtitle = attrs.subtitle; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + if (attrs.cardstyle !== undefined) + this.cardstyle = attrs.cardstyle; + if (attrs.cardcolor !== undefined) + this.cardcolor = attrs.cardcolor; + if (attrs.spacing !== undefined) + this.spacing = parseInt (attrs.spacing) || 0; + if (attrs.elevation !== undefined) + this.elevation = parseInt (attrs.elevation) || 2; + return true; + } + +} diff --git a/Client/src/modules/AMCModule_Custom.js b/Client/core/modules/AMCModule_Custom.js similarity index 74% rename from Client/src/modules/AMCModule_Custom.js rename to Client/core/modules/AMCModule_Custom.js index 48e690601..56724e51a 100644 --- a/Client/src/modules/AMCModule_Custom.js +++ b/Client/core/modules/AMCModule_Custom.js @@ -41,6 +41,7 @@ class AMCApplicationItem_Custom_Properties extends Common.AMCApplicationItem { super (moduleInstance, itemJSON.uuid, itemJSON.type); this.registerClass ("amcItem_CustomProperties"); + this.usesV2Frontend = true; this.values = {} @@ -59,6 +60,23 @@ class AMCApplicationItem_Custom_Properties extends Common.AMCApplicationItem { this.moduleInstance.callDataHasChanged (); } + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + let values = {}; + for (let key of Object.keys (attrs)) { + if ((key !== "name") && (key !== "caption")) { + values[key] = attrs[key]; + } + } + + this.values = values; + this.moduleInstance.callDataHasChanged (); + return true; + } + } @@ -72,6 +90,7 @@ class AMCApplicationItem_Custom_Event extends Common.AMCApplicationItem { super (moduleInstance, itemJSON.uuid, itemJSON.type); this.registerClass ("amcItem_CustomEvent"); + this.usesV2Frontend = true; this.name = Assert.StringValue (itemJSON.name); @@ -93,6 +112,26 @@ class AMCApplicationItem_Custom_Event extends Common.AMCApplicationItem { } + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.eventname !== undefined) + this.name = attrs.eventname; + + if (Array.isArray (attrs.parameters)) { + this.parameters = attrs.parameters; + this.parameterNameMap = new Map (); + for (let parameter of this.parameters) { + this.parameterNameMap.set (parameter.name, parameter.uuid); + } + } + + this.moduleInstance.rebuildEventMap (); + return true; + } + prepareUIEvent (parameters) { Assert.ObjectValue (parameters); @@ -134,11 +173,13 @@ export default class AMCApplicationModule_Custom extends Common.AMCApplicationMo Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_Custom"); + this.usesV2Frontend = true; Assert.ArrayValue (moduleJSON.items); this.items = []; this.propertiesitem = null; this.eventitems = new Map(); + this.eventitemsByUUID = new Map(); for (let itemJSON of moduleJSON.items) { @@ -152,6 +193,7 @@ export default class AMCApplicationModule_Custom extends Common.AMCApplicationMo if (itemJSON.type === "event") { item = new AMCApplicationItem_Custom_Event (this, itemJSON); this.eventitems.set (item.name, item); + this.eventitemsByUUID.set (item.uuid, item); } @@ -166,6 +208,31 @@ export default class AMCApplicationModule_Custom extends Common.AMCApplicationMo } + + rebuildEventMap () + { + this.eventitems = new Map(); + for (let eventItem of this.eventitemsByUUID.values()) { + this.eventitems.set (eventItem.name, eventItem); + } + } + + updateFromV2Attributes (attrs) + { + if (this.propertiesitem) + this.propertiesitem.updateFromV2Attributes (attrs); + + let v2Entry = this.page.application.getV2Entry (this.uuid); + if (v2Entry && v2Entry.submodules) { + for (let submodule of v2Entry.submodules) { + let eventItem = this.eventitemsByUUID.get (submodule.uuid); + if (eventItem && submodule.attributes) + eventItem.updateFromV2Attributes (submodule.attributes); + } + } + + return true; + } findEvent (name) @@ -179,4 +246,3 @@ export default class AMCApplicationModule_Custom extends Common.AMCApplicationMo } } - diff --git a/Client/core/modules/AMCModule_ExecutionList.js b/Client/core/modules/AMCModule_ExecutionList.js new file mode 100644 index 000000000..d60a3ce2a --- /dev/null +++ b/Client/core/modules/AMCModule_ExecutionList.js @@ -0,0 +1,185 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" +import AMCListDeltaSync, { compareEntriesBy } from "../common/AMCListDeltaSync.js"; + + +export default class AMCApplicationModule_ExecutionList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_ExecutionList"); + + this.usesV2Frontend = true; + this.entries = []; + + this.headers = []; + if (moduleJSON.headers && moduleJSON.headers.length > 0) { + for (let header of moduleJSON.headers) { + this.headers.push({ + text: header.text, + value: header.value, + sortable: header.sortable, + width: header.width, + }); + } + } else { + this.headers = [ + { text: '', value: 'executionThumbnail', sortable: false, width: '96px' }, + { text: 'Execution', value: 'executionName', sortable: true }, + { text: 'Started', value: 'executionStartTimestamp', sortable: true }, + { text: 'Status', value: 'executionStatus', sortable: true, width: '110px' }, + ]; + } + + this.entrybuttons = []; + if (moduleJSON.entrybuttons) { + for (let entrybutton of moduleJSON.entrybuttons) { + this.entrybuttons.push({ + uuid: entrybutton.uuid, + caption: entrybutton.caption, + color: entrybutton.color, + cursor: entrybutton.cursor, + selectevent: entrybutton.selectevent, + }); + } + } + + this.loadingtext = ""; + this.selectevent = ""; + this.selectionvalueuuid = Common.nullUUID (); + this.buttonvalueuuid = Common.nullUUID (); + this.thumbnailaspectratio = 1.8; + this.thumbnailheight = "150pt"; + this.thumbnailwidth = ""; + this.entriesperpage = 25; + this.loaded = false; + this.listSync = new AMCListDeltaSync (this.entries, "executionUUID", compareEntriesBy ("executionStartTimestamp", true), + (sinceHeadID) => this.requestExecutions (sinceHeadID)); + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.selectevent) + this.selectevent = Assert.IdentifierString (updateJSON.selectevent); + if (updateJSON.selectionvalueuuid) + this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); + if (updateJSON.buttonvalueuuid) + this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); + if (updateJSON.entriesperpage) + this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); + + if (!updateJSON.entries) + return; + + let oldEntryCount = this.entries.length; + for (let index = 0; index < oldEntryCount; index++) { + this.entries.pop(); + } + for (let entry of updateJSON.entries) { + this.entries.push(entry); + } + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.selectevent !== undefined) + this.selectevent = attrs.selectevent; + if (attrs.entriesperpage !== undefined) + this.entriesperpage = parseInt(attrs.entriesperpage) || this.entriesperpage; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + if (attrs.executionlistheadid !== undefined) + this.listSync.notifyHeadID (parseInt(attrs.executionlistheadid)); + + return true; + } + + + requestExecutions (sinceHeadID) + { + let url = "/executions"; + if (sinceHeadID !== null) + url += "?since=" + sinceHeadID; + + return this.page.application.axiosGetRequest(url) + .then(resultJSON => { + this.loaded = true; + + let data = resultJSON.data; + if (!data || !Array.isArray(data.executions)) + throw "invalid execution list response"; + + let rows = []; + for (let exec of data.executions) { + rows.push({ + executionUUID: exec.executionuuid || "", + executionName: exec.executionname || "", + executionDescription: exec.executiondescription || "", + executionStartTimestamp: exec.executionstarttimestamp || "", + executionEndTimestamp: exec.executionendtimestamp || "", + executionDuration: exec.executionduration || 0, + executionStatus: exec.executionstatus || "", + executionBuildStatus: exec.executionbuildstatus || "", + executionLayerCount: exec.executionlayercount || 0, + executionJobUUID: exec.jobuuid || "", + executionThumbnail: exec.executionthumbnail || "00000000-0000-0000-0000-000000000000", + }); + } + + return { headID: parseInt(data.executionlistheadid), delta: (data.delta === true), rows: rows, removedKeys: [] }; + }, error => { + this.loaded = true; + throw error; + }); + } + +} diff --git a/Client/core/modules/AMCModule_Form.js b/Client/core/modules/AMCModule_Form.js new file mode 100644 index 000000000..7109401e2 --- /dev/null +++ b/Client/core/modules/AMCModule_Form.js @@ -0,0 +1,309 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +function makeEntityDataObject (entity) { + return { + uuid: entity.uuid, + value: entity.value, + remotevalue: entity.value, + disabled: entity.disabled, + readonly: entity.readonly, + changeevent: entity.changeevent, + validation: entity.validation, + validationmessage: entity.validationmessage, + minvalue: entity.minvalue, + maxvalue: entity.maxvalue, + minlength: entity.minlength, + maxlength: entity.maxlength, + step: entity.step, + unit: entity.unit, + mode: entity.mode, + format: entity.format, + items: entity.items, + // actionbar-specific + submitevent: entity.submitevent, + cancelevent: entity.cancelevent, + validateevent: entity.validateevent, + submitcaption: entity.submitcaption, + cancelcaption: entity.cancelcaption, + optimistic: entity.optimistic, + // section-specific + description: entity.description, + icon: entity.icon, + collapsible: entity.collapsible, + defaultOpen: entity.defaultopen, + isProgrammaticChange: false, + }; +} + + +export default class AMCApplicationModule_Form extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Form"); + + this.usesV2Frontend = true; + + this.entities = Array.isArray(moduleJSON.entities) ? moduleJSON.entities : []; + + // Dirty-state tracking and server-side error map + this.serverErrors = {}; + this.isSubmitting = false; + + this._registerEntities(this.entities); + } + + + _registerEntities (entities) { + for (let entity of entities) { + entity.dataObject = makeEntityDataObject(entity); + this.page.application.AppContent.FormEntityMap.set (entity.uuid, entity); + + // Recursively register children inside sections + if (entity.type === 'section' && Array.isArray(entity.entities)) { + this._registerEntities(entity.entities); + } + } + } + + + _flatEntities () { + const result = []; + const collect = (list) => { + for (let e of list) { + result.push(e); + if (e.type === 'section' && Array.isArray(e.entities)) + collect(e.entities); + } + }; + collect(this.entities); + return result; + } + + + isEntityDirty (entity) { + if (!entity || !entity.dataObject) return false; + return entity.dataObject.value !== entity.dataObject.remotevalue; + } + + + get isFormDirty () { + return this._flatEntities().some(e => this.isEntityDirty(e)); + } + + + resetDirtyFields () { + for (let entity of this._flatEntities()) { + if (entity.dataObject) { + entity.dataObject.isProgrammaticChange = true; + entity.dataObject.value = entity.dataObject.remotevalue; + } + } + this.serverErrors = {}; + } + + + assembleAllFormValues () { + const values = {}; + for (let entity of this._flatEntities()) { + if (entity.dataObject && entity.type !== 'actionbar' && entity.type !== 'section' && entity.type !== 'calculated') { + values[entity.uuid] = entity.dataObject.value; + } + } + return values; + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + this.setVisible(updateJSON.visible); + + if (updateJSON.entities) { + Assert.ArrayValue (updateJSON.entities); + + for (let entityJSON of updateJSON.entities) { + if (!this.page.application.AppContent.FormEntityMap.has (entityJSON.uuid)) { + let newEntity = { + uuid: entityJSON.uuid, + name: entityJSON.name || entityJSON.uuid, + type: entityJSON.type || "edit", + caption: entityJSON.caption || "", + value: entityJSON.value, + disabled: !!entityJSON.disabled, + readonly: !!entityJSON.readonly, + changeevent: entityJSON.changeevent || "", + validation: entityJSON.validation || "", + validationmessage: entityJSON.validationmessage || "", + minvalue: entityJSON.minvalue, + maxvalue: entityJSON.maxvalue, + minlength: entityJSON.minlength, + maxlength: entityJSON.maxlength, + step: entityJSON.step, + unit: entityJSON.unit, + mode: entityJSON.mode, + format: entityJSON.format, + items: entityJSON.items, + }; + newEntity.dataObject = makeEntityDataObject(newEntity); + this.entities.push(newEntity); + this.page.application.AppContent.FormEntityMap.set(newEntity.uuid, newEntity); + } + + let entity = this.page.application.AppContent.FormEntityMap.get (entityJSON.uuid); + let dataObject = entity.dataObject; + + Assert.ObjectValue (dataObject); + + if (dataObject.remotevalue !== entityJSON.value) { + dataObject.value = entityJSON.value; + dataObject.isProgrammaticChange = true; + } else { + dataObject.isProgrammaticChange = false; + } + dataObject.remotevalue = entityJSON.value; + dataObject.prefix = entityJSON.prefix; + dataObject.suffix = entityJSON.suffix; + dataObject.readonly = entityJSON.readonly; + dataObject.disabled = entityJSON.disabled; + dataObject.changeevent = entityJSON.changeevent; + } + } + } + + + updateFromV2Attributes (attrs) + { + let v2Entry = this.page.application.getV2Entry(this.uuid); + if (!v2Entry) + return true; + + if (v2Entry.attributes) { + if (v2Entry.attributes.visible !== undefined) + this.setVisible(v2Entry.attributes.visible === true || v2Entry.attributes.visible === "1" || v2Entry.attributes.visible === "true"); + if (v2Entry.attributes.caption !== undefined) + this.caption = v2Entry.attributes.caption; + } + + // ContentLeaf wraps the Form item as submodules[0]. + // The individual form entities are one level deeper: submodules[0].submodules. + let entitySubmodules = (v2Entry.submodules && v2Entry.submodules.length > 0 && v2Entry.submodules[0].submodules) + ? v2Entry.submodules[0].submodules + : []; + + if (entitySubmodules.length > 0) { + let app = this.page.application; + + for (let sub of entitySubmodules) { + if (!app.AppContent.FormEntityMap.has(sub.uuid)) + continue; + + let entity = app.AppContent.FormEntityMap.get(sub.uuid); + let dataObject = entity.dataObject; + let a = sub.attributes || {}; + + if (a.value !== undefined) { + if (dataObject.remotevalue !== a.value) { + dataObject.value = a.value; + dataObject.isProgrammaticChange = true; + } else { + dataObject.isProgrammaticChange = false; + } + dataObject.remotevalue = a.value; + } + + if (a.caption !== undefined) + entity.caption = a.caption; + if (a.disabled !== undefined) + dataObject.disabled = (a.disabled === true || a.disabled === "1" || a.disabled === "true"); + if (a.readonly !== undefined) + dataObject.readonly = (a.readonly === true || a.readonly === "1" || a.readonly === "true"); + if (a.prefix !== undefined) + dataObject.prefix = a.prefix; + if (a.suffix !== undefined) + dataObject.suffix = a.suffix; + if (a.changeevent !== undefined) + dataObject.changeevent = a.changeevent; + if (a.validation !== undefined) + dataObject.validation = a.validation; + if (a.validationmessage !== undefined) + dataObject.validationmessage = a.validationmessage; + if (a.minvalue !== undefined) + dataObject.minvalue = a.minvalue; + if (a.maxvalue !== undefined) + dataObject.maxvalue = a.maxvalue; + if (a.minlength !== undefined) + dataObject.minlength = a.minlength; + if (a.maxlength !== undefined) + dataObject.maxlength = a.maxlength; + if (a.step !== undefined) + dataObject.step = a.step; + if (a.unit !== undefined) + dataObject.unit = a.unit; + if (a.mode !== undefined) + dataObject.mode = a.mode; + if (a.format !== undefined) + dataObject.format = a.format; + + if ((entity.type === "combobox" || entity.type === "multiselect") && sub.submodules) { + entity.items = sub.submodules.map(item => { + let ia = item.attributes || {}; + return { value: String(ia.value !== undefined ? ia.value : ""), text: ia.text || String(ia.value !== undefined ? ia.value : "") }; + }); + dataObject.items = entity.items; + + // Item values are normalized to strings above; coerce the current + // combobox value to a string too so the selected item resolves on + // first render (a numeric default like value="1" would otherwise + // fail the strict comparison against the string item value). + if (entity.type === "combobox" && dataObject.value !== undefined && dataObject.value !== null) + dataObject.value = String(dataObject.value); + } + } + } + + return true; + } + + + setVisible (flag) { + this.visible = !!flag; + } + +} diff --git a/Client/src/modules/AMCModule_GLScene.js b/Client/core/modules/AMCModule_GLScene.js similarity index 77% rename from Client/src/modules/AMCModule_GLScene.js rename to Client/core/modules/AMCModule_GLScene.js index 9c541ac78..30917b628 100644 --- a/Client/src/modules/AMCModule_GLScene.js +++ b/Client/core/modules/AMCModule_GLScene.js @@ -73,6 +73,7 @@ export default class AMCApplicationModule_GLScene extends Common.AMCApplicationM Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_GLScene"); + this.usesV2Frontend = true; this.scene = null; @@ -81,5 +82,38 @@ export default class AMCApplicationModule_GLScene extends Common.AMCApplicationM } } + + updateFromV2Attributes (attrs) + { + if (attrs) { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + } + + let instances = []; + + if (attrs && Array.isArray (attrs.instances)) { + for (let instanceJSON of attrs.instances) { + instances.push (Object.assign ({}, instanceJSON)); + } + } + + if (!this.scene) { + this.scene = new AMCApplicationItem_GLScene (this, { + uuid: this.uuid, + type: "scene", + instances: instances + }); + } else { + this.scene.updateFromJSON ({ + instances: instances + }); + } + + this.callDataHasChanged (); + return true; + } -} \ No newline at end of file +} diff --git a/Client/src/modules/AMCModule_Graphic.js b/Client/core/modules/AMCModule_Graphic.js similarity index 60% rename from Client/src/modules/AMCModule_Graphic.js rename to Client/core/modules/AMCModule_Graphic.js index 877cb250b..9777bed42 100644 --- a/Client/src/modules/AMCModule_Graphic.js +++ b/Client/core/modules/AMCModule_Graphic.js @@ -41,6 +41,7 @@ class AMCApplicationItem_Graphic_SVGImage extends Common.AMCApplicationItem { super (moduleInstance, itemJSON.uuid, itemJSON.type); this.registerClass ("amcItem_SVGImage"); + this.usesV2Frontend = true; this.name = Assert.IdentifierString (itemJSON.name); this.imageuuid = Assert.OptionalUUIDValue (itemJSON.imageuuid); @@ -63,7 +64,49 @@ class AMCApplicationItem_Graphic_SVGImage extends Common.AMCApplicationItem { this.angle = Assert.NumberValue (updateJSON.angle); this.moduleInstance.callDataHasChanged (); - } + } + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.name !== undefined) + this.name = attrs.name; + if (attrs.x !== undefined) { + let x = parseFloat (attrs.x); + if (!isNaN (x)) + this.x = x; + } + if (attrs.y !== undefined) { + let y = parseFloat (attrs.y); + if (!isNaN (y)) + this.y = y; + } + if (attrs.z !== undefined) { + let z = parseFloat (attrs.z); + if (!isNaN (z)) + this.z = z; + } + if (attrs.scalex !== undefined) { + let scalex = parseFloat (attrs.scalex); + if (!isNaN (scalex)) + this.scalex = scalex; + } + if (attrs.scaley !== undefined) { + let scaley = parseFloat (attrs.scaley); + if (!isNaN (scaley)) + this.scaley = scaley; + } + if (attrs.angle !== undefined) { + let angle = parseFloat (attrs.angle); + if (!isNaN (angle)) + this.angle = angle; + } + + this.moduleInstance.callDataHasChanged (); + return true; + } } @@ -74,6 +117,7 @@ export default class AMCApplicationModule_Graphic extends Common.AMCApplicationM Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_Graphic"); + this.usesV2Frontend = true; this.viewminx = Assert.NumberValue (moduleJSON.viewminx); this.viewminy = Assert.NumberValue (moduleJSON.viewminy); @@ -101,5 +145,49 @@ export default class AMCApplicationModule_Graphic extends Common.AMCApplicationM } } + + updateFromV2Attributes (attrs) + { + if (attrs) { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + if (attrs.viewminx !== undefined) { + let value = parseFloat (attrs.viewminx); + if (!isNaN (value)) + this.viewminx = value; + } + if (attrs.viewminy !== undefined) { + let value = parseFloat (attrs.viewminy); + if (!isNaN (value)) + this.viewminy = value; + } + if (attrs.viewmaxx !== undefined) { + let value = parseFloat (attrs.viewmaxx); + if (!isNaN (value)) + this.viewmaxx = value; + } + if (attrs.viewmaxy !== undefined) { + let value = parseFloat (attrs.viewmaxy); + if (!isNaN (value)) + this.viewmaxy = value; + } + if (attrs.showgrid !== undefined) + this.showgrid = (attrs.showgrid === true || attrs.showgrid === "1" || attrs.showgrid === "true"); + } + + let v2Entry = this.page.application.getV2Entry (this.uuid); + if (v2Entry && v2Entry.submodules) { + for (let submodule of v2Entry.submodules) { + let item = this.items.find(entry => entry.uuid === submodule.uuid); + if (item && submodule.attributes) { + item.updateFromV2Attributes (submodule.attributes); + } + } + } + + return true; + } -} \ No newline at end of file +} diff --git a/Client/src/modules/AMCModule_Grid.js b/Client/core/modules/AMCModule_Grid.js similarity index 88% rename from Client/src/modules/AMCModule_Grid.js rename to Client/core/modules/AMCModule_Grid.js index 2ce8eb728..260065541 100644 --- a/Client/src/modules/AMCModule_Grid.js +++ b/Client/core/modules/AMCModule_Grid.js @@ -41,11 +41,15 @@ export default class AMCApplicationModule_Grid extends Common.AMCApplicationModu Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_Grid"); + this.usesV2Frontend = true; // TODO: check input this.columns = Assert.ArrayValue (moduleJSON.columns); this.rows = Assert.ArrayValue (moduleJSON.rows); + + // Optional inner padding applied to each grid cell, in pixels. + this.padding = parseInt (moduleJSON.padding) || 0; this.sections = [] @@ -86,7 +90,9 @@ export default class AMCApplicationModule_Grid extends Common.AMCApplicationModu overflowtype = "hidden"; } - section.cssstyle = "overflow:" + overflowtype + "; overflow-x:" + overflowtype + "; grid-area:" + section.name + ";" + marginx + marginy; + var paddingStyle = (this.padding > 0) ? ("padding:" + this.padding + "px; box-sizing:border-box;") : ""; + + section.cssstyle = "overflow:" + overflowtype + "; overflow-x:" + overflowtype + "; grid-area:" + section.name + ";" + marginx + marginy + paddingStyle; if (section) { @@ -184,5 +190,18 @@ export default class AMCApplicationModule_Grid extends Common.AMCApplicationModu } + + // Phase 3: v2 frontend – section child modules are independently indexed in + // the frontendLookup and updated via their own updateModule() calls. The + // grid layout itself is static, so we just suppress the legacy poll. + updateFromV2Attributes (attrs) { + if (attrs) { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + } + return true; + } } diff --git a/Client/core/modules/AMCModule_Image.js b/Client/core/modules/AMCModule_Image.js new file mode 100644 index 000000000..cb6315244 --- /dev/null +++ b/Client/core/modules/AMCModule_Image.js @@ -0,0 +1,90 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_Image extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Image"); + + this.usesV2Frontend = true; + + this.imageresource = Common.nullUUID (); + this.aspectratio = 1.0; + this.maxwidth = 0; + this.maxheight = 0; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + if (updateJSON.imageresource) + this.imageresource = Assert.UUIDValue (updateJSON.imageresource); + if (updateJSON.aspectratio !== undefined) + this.aspectratio = Assert.NumberValue (updateJSON.aspectratio); + if (updateJSON.maxwidth) + this.maxwidth = Assert.NumberValue (updateJSON.maxwidth); + if (updateJSON.maxheight) + this.maxheight = Assert.NumberValue (updateJSON.maxheight); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + // v2 backend uses "resource", legacy uses "imageresource" + let resourceUUID = attrs.resource || attrs.imageresource; + if (resourceUUID) + this.imageresource = resourceUUID; + if (attrs.aspectratio !== undefined) + this.aspectratio = parseFloat(attrs.aspectratio) || 1.0; + if (attrs.maxwidth !== undefined) + this.maxwidth = parseFloat(attrs.maxwidth) || 0; + if (attrs.maxheight !== undefined) + this.maxheight = parseFloat(attrs.maxheight) || 0; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/core/modules/AMCModule_JournalHistory.js b/Client/core/modules/AMCModule_JournalHistory.js new file mode 100644 index 000000000..6bcc74667 --- /dev/null +++ b/Client/core/modules/AMCModule_JournalHistory.js @@ -0,0 +1,101 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_JournalHistory extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_JournalHistory"); + + this.usesV2Frontend = true; + + this.title = ""; + this.defaultvariables = ""; + // Presentation options: compact renders a space-filling embedded chart without + // the selector / range controls; livewindow is the default live window in seconds. + this.compact = false; + this.livewindow = 60; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.title !== undefined) + this.title = Assert.StringValue (updateJSON.title); + if (updateJSON.defaultvariables !== undefined) + this.defaultvariables = Assert.StringValue (updateJSON.defaultvariables); + if (updateJSON.compact !== undefined) + this.compact = (updateJSON.compact === true || updateJSON.compact === "1" || updateJSON.compact === "true"); + if (updateJSON.livewindow !== undefined) { + let nWindow = parseInt (updateJSON.livewindow, 10); + if (!isNaN (nWindow) && nWindow > 0) + this.livewindow = nWindow; + } + if (updateJSON.caption !== undefined) + this.caption = Assert.StringValue (updateJSON.caption); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.defaultvariables !== undefined) + this.defaultvariables = attrs.defaultvariables; + if (attrs.compact !== undefined) + this.compact = (attrs.compact === true || attrs.compact === "1" || attrs.compact === "true"); + if (attrs.livewindow !== undefined) { + let nWindow = parseInt (attrs.livewindow, 10); + if (!isNaN (nWindow) && nWindow > 0) + this.livewindow = nWindow; + } + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + + return true; + } + +} diff --git a/Client/core/modules/AMCModule_LayerView.js b/Client/core/modules/AMCModule_LayerView.js new file mode 100644 index 000000000..7bd1edf91 --- /dev/null +++ b/Client/core/modules/AMCModule_LayerView.js @@ -0,0 +1,298 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +class AMCApplicationItem_LayerView_Platform extends Common.AMCApplicationItem { + + constructor (moduleInstance, itemJSON) + { + Assert.ObjectValue (itemJSON); + + super (moduleInstance, itemJSON.uuid, itemJSON.type); + this.registerClass ("amcItem_Platform"); + this.usesV2Frontend = true; + + this.displayed_layer = 0; + this.displayed_build = Common.nullUUID (); + + this.colors = { + background: "#ffffff", grid: "#e0e0e0", + contour: "#00aa88", hatch: "#cc88cc", travel: "#aaaaaa" + }; + this.darkcolors = { + background: "#1a1a2e", grid: "#333344", + contour: "#33ddaa", hatch: "#dd99dd", travel: "#555566" + }; + + this.dark_baseimageresource = ""; + this.highlightpartuuid = Common.nullUUID (); + // Changes whenever parts of the build are disabled or re-enabled; the displayed layer is reloaded then. + this.partstateversion = 0; + this.displayed_partstateversion = 0; + this.paddingx = 0.0; + this.paddingy = 0.0; + this.transformangle = 0.0; + this.rotationcenterx = 0.0; + this.rotationcentery = 0.0; + this.translationx = 0.0; + this.translationy = 0.0; + this.showcoordinatesystem = false; + + this.updateFromJSON (itemJSON); + + this.setRefreshFlag (); + + } + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + this.currentlayer = Assert.IntegerValue (updateJSON.currentlayer); + this.layercount = Assert.OptionalIntegerValue (updateJSON.layercount); + this.builduuid = Assert.OptionalUUIDValue (updateJSON.builduuid); + this.scatterplotuuid = Assert.OptionalUUIDValue (updateJSON.scatterplotuuid); + if (updateJSON.highlightpartuuid !== undefined) + this.highlightpartuuid = Assert.OptionalUUIDValue (updateJSON.highlightpartuuid); + if (updateJSON.partstateversion !== undefined) + this.partstateversion = Assert.IntegerValue (updateJSON.partstateversion); + this.baseimageresource = Assert.OptionalUUIDValue (updateJSON.baseimageresource); + this.sizex = Assert.NumberValue (updateJSON.sizex); + this.sizey = Assert.NumberValue (updateJSON.sizey); + this.originx = Assert.NumberValue (updateJSON.originx); + this.originy = Assert.NumberValue (updateJSON.originy); + if (updateJSON.paddingx !== undefined) + this.paddingx = Assert.NumberValue (updateJSON.paddingx); + if (updateJSON.paddingy !== undefined) + this.paddingy = Assert.NumberValue (updateJSON.paddingy); + if (updateJSON.transformangle !== undefined) + this.transformangle = Assert.NumberValue (updateJSON.transformangle); + if (updateJSON.rotationcenterx !== undefined) + this.rotationcenterx = Assert.NumberValue (updateJSON.rotationcenterx); + if (updateJSON.rotationcentery !== undefined) + this.rotationcentery = Assert.NumberValue (updateJSON.rotationcentery); + if (updateJSON.translationx !== undefined) + this.translationx = Assert.NumberValue (updateJSON.translationx); + if (updateJSON.translationy !== undefined) + this.translationy = Assert.NumberValue (updateJSON.translationy); + if (updateJSON.showcoordinatesystem !== undefined) + this.showcoordinatesystem = (updateJSON.showcoordinatesystem === true || updateJSON.showcoordinatesystem === 1 || updateJSON.showcoordinatesystem === "1" || updateJSON.showcoordinatesystem === "true"); + this.labelvisible = Assert.IntegerValue (updateJSON.labelvisible); + this.labelcaption = Assert.StringValue (updateJSON.labelcaption); + this.labelicon = Assert.StringValue (updateJSON.labelicon); + this.sliderchangeevent = Assert.StringValue (updateJSON.sliderchangeevent); + this.sliderfixed = Assert.IntegerValue (updateJSON.sliderfixed); + + this.moduleInstance.callDataHasChanged (); + } + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.currentlayer !== undefined) { + let currentlayer = parseInt (attrs.currentlayer); + if (!isNaN (currentlayer)) + this.currentlayer = currentlayer; + } + if (attrs.layercount !== undefined) { + let layercount = parseInt (attrs.layercount); + if (!isNaN (layercount)) + this.layercount = layercount; + } + if (attrs.builduuid !== undefined) + this.builduuid = attrs.builduuid; + if (attrs.scatterplotuuid !== undefined) + this.scatterplotuuid = attrs.scatterplotuuid; + if (attrs.highlightpartuuid !== undefined) + this.highlightpartuuid = attrs.highlightpartuuid; + if (attrs.partstateversion !== undefined) { + let partstateversion = parseInt (attrs.partstateversion); + if (!isNaN (partstateversion)) + this.partstateversion = partstateversion; + } + if (attrs.baseimageresource !== undefined) + this.baseimageresource = attrs.baseimageresource; + if (attrs.dark_baseimageresource !== undefined) + this.dark_baseimageresource = attrs.dark_baseimageresource; + if (attrs.sizex !== undefined) { + let sizex = parseFloat (attrs.sizex); + if (!isNaN (sizex)) + this.sizex = sizex; + } + if (attrs.sizey !== undefined) { + let sizey = parseFloat (attrs.sizey); + if (!isNaN (sizey)) + this.sizey = sizey; + } + if (attrs.originx !== undefined) { + let originx = parseFloat (attrs.originx); + if (!isNaN (originx)) + this.originx = originx; + } + if (attrs.originy !== undefined) { + let originy = parseFloat (attrs.originy); + if (!isNaN (originy)) + this.originy = originy; + } + if (attrs.paddingx !== undefined) { + let paddingx = parseFloat (attrs.paddingx); + if (!isNaN (paddingx)) + this.paddingx = paddingx; + } + if (attrs.paddingy !== undefined) { + let paddingy = parseFloat (attrs.paddingy); + if (!isNaN (paddingy)) + this.paddingy = paddingy; + } + if (attrs.transformangle !== undefined) { + let transformangle = parseFloat (attrs.transformangle); + if (!isNaN (transformangle)) + this.transformangle = transformangle; + } + if (attrs.rotationcenterx !== undefined) { + let rotationcenterx = parseFloat (attrs.rotationcenterx); + if (!isNaN (rotationcenterx)) + this.rotationcenterx = rotationcenterx; + } + if (attrs.rotationcentery !== undefined) { + let rotationcentery = parseFloat (attrs.rotationcentery); + if (!isNaN (rotationcentery)) + this.rotationcentery = rotationcentery; + } + if (attrs.translationx !== undefined) { + let translationx = parseFloat (attrs.translationx); + if (!isNaN (translationx)) + this.translationx = translationx; + } + if (attrs.translationy !== undefined) { + let translationy = parseFloat (attrs.translationy); + if (!isNaN (translationy)) + this.translationy = translationy; + } + if (attrs.showcoordinatesystem !== undefined) + this.showcoordinatesystem = (attrs.showcoordinatesystem === true || attrs.showcoordinatesystem === 1 || attrs.showcoordinatesystem === "1" || attrs.showcoordinatesystem === "true"); + if (attrs.labelvisible !== undefined) + this.labelvisible = (attrs.labelvisible === true || attrs.labelvisible === "1" || attrs.labelvisible === "true"); + if (attrs.labelcaption !== undefined) + this.labelcaption = attrs.labelcaption; + if (attrs.labelicon !== undefined) + this.labelicon = attrs.labelicon; + if (attrs.sliderchangeevent !== undefined) + this.sliderchangeevent = attrs.sliderchangeevent; + if (attrs.sliderfixed !== undefined) + this.sliderfixed = (attrs.sliderfixed === true || attrs.sliderfixed === "1" || attrs.sliderfixed === "true"); + + const colorKeys = ["background", "grid", "contour", "hatch", "travel"]; + for (let k of colorKeys) { + if (attrs["color_" + k] !== undefined) + this.colors[k] = attrs["color_" + k]; + if (attrs["darkcolor_" + k] !== undefined) + this.darkcolors[k] = attrs["darkcolor_" + k]; + } + + this.moduleInstance.callDataHasChanged (); + return true; + } + + +} + + + + +export default class AMCApplicationModule_LayerView extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); + this.registerClass ("amcModule_LayerView"); + this.usesV2Frontend = true; + + // Optional card framing (mirrors the "content" module). + this.cardstyle = moduleJSON.cardstyle || "none"; + this.title = moduleJSON.title || ""; + this.subtitle = moduleJSON.subtitle || ""; + + Assert.ArrayValue (moduleJSON.items); + this.items = []; + this.platform = null; + + for (let itemJSON of moduleJSON.items) { + + let item = null; + + if (itemJSON.type === "platform") { + item = new AMCApplicationItem_LayerView_Platform (this, itemJSON); + this.platform = item; + } + + if (item) { + this.items.push (item); + this.page.addItem (item); + } else { + throw "Item type not found: " + itemJSON.type; + } + + } + + + } + + updateFromV2Attributes (attrs) + { + if (attrs) { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + if (attrs.cardstyle !== undefined) + this.cardstyle = attrs.cardstyle; + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.subtitle !== undefined) + this.subtitle = attrs.subtitle; + } + + // The module-level attributes carry all platform data, including the per-session + // build, layer and part state values; the platform item has no entry of its own. + if (this.platform) + this.platform.updateFromV2Attributes (attrs); + + return true; + } + +} diff --git a/Client/src/modules/AMCModule_Logs.js b/Client/core/modules/AMCModule_Logs.js similarity index 55% rename from Client/src/modules/AMCModule_Logs.js rename to Client/core/modules/AMCModule_Logs.js index d1302ebff..0ed2edd05 100644 --- a/Client/src/modules/AMCModule_Logs.js +++ b/Client/core/modules/AMCModule_Logs.js @@ -40,6 +40,7 @@ class AMCApplicationModule_LogItem extends Common.AMCApplicationItem { super (moduleInstance, itemUUID, "logitem"); this.registerClass ("amcItem_LogItem"); this.stateid = 1; + this.usesV2Frontend = true; this.updateFromJSON ({}); @@ -57,7 +58,7 @@ class AMCApplicationModule_LogItem extends Common.AMCApplicationItem { let timeStampObject = DateTime.fromISO(timeStampInput, {zone: 'utc'}); let timeStampStr = timeStampObject.toFormat('HH:mm:ss.SSS'); - this.moduleInstance.DisplayItems.unshift ({ + this.moduleInstance.DisplayItems.push ({ logIndex: logentry.id, logSubsystem: logentry.subsystem, logTime: timeStampStr, @@ -69,8 +70,15 @@ class AMCApplicationModule_LogItem extends Common.AMCApplicationItem { } } + + this.moduleInstance.trimDisplayItems (); } } + + updateFromV2Attributes () + { + return true; + } } @@ -82,8 +90,15 @@ export default class AMCApplicationModule_Logs extends Common.AMCApplicationModu Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_Logs"); + this.usesV2Frontend = true; - this.currentReceiveIndex = 0; + this.logStartID = 1; + this.lastKnownHeadID = -1; + this.logFetchInFlight = false; + this.defaultCount = 200; + this.showToolbar = true; + this.maxDisplayItems = 2000; + this.downloadPrefix = "log"; this.items = []; @@ -97,7 +112,80 @@ export default class AMCApplicationModule_Logs extends Common.AMCApplicationModu } - + + trimDisplayItems () + { + if (this.DisplayItems.length > this.maxDisplayItems) { + this.DisplayItems.splice (0, this.DisplayItems.length - this.maxDisplayItems); + } + } + + updateFromV2Attributes (attrs) + { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + if (attrs.defaultcount !== undefined) + this.defaultCount = parseInt (attrs.defaultcount) || 200; + if (attrs.showtoolbar !== undefined) + this.showToolbar = (attrs.showtoolbar === true || attrs.showtoolbar === "1" || attrs.showtoolbar === "true"); + if (attrs.maxcliententries !== undefined) + this.maxDisplayItems = parseInt (attrs.maxcliententries) || 2000; + if (attrs.downloadprefix !== undefined) + this.downloadPrefix = attrs.downloadprefix || "log"; + + if (attrs.logheadid === undefined) + return true; + + let headID = parseInt (attrs.logheadid); + if (headID <= this.lastKnownHeadID) + return true; + + this.lastKnownHeadID = headID; + + if (this.logFetchInFlight) + return true; + + let app = this.page.application; + let url = "/logs"; + if (this.logStartID > 0) + url += "/" + this.logStartID; + + this.logFetchInFlight = true; + + app.axiosGetRequest (url) + .then (resultJSON => { + this.logFetchInFlight = false; + + if (resultJSON.data && resultJSON.data.logentries) { + for (let logentry of resultJSON.data.logentries) { + + let timeStampInput = logentry.timestamp.replace ("Z UTC", "").trim (); + let timeStampObject = DateTime.fromISO (timeStampInput, { zone: 'utc' }); + let timeStampStr = timeStampObject.toFormat ('HH:mm:ss.SSS'); + + this.DisplayItems.push ({ + logIndex: logentry.id, + logSubsystem: logentry.subsystem, + logTime: timeStampStr, + logText: logentry.message + }); + + if (logentry.id >= this.logStartID) + this.logStartID = logentry.id + 1; + } + + this.trimDisplayItems (); + } + }) + .catch (err => { + this.logFetchInFlight = false; + console.warn('[AMC Logs] fetch failed:', err); + }); + + return true; + } updateFromJSON (updateJSON) { diff --git a/Client/src/modules/AMCModule_ContentItem_ParameterList.js b/Client/core/modules/AMCModule_Paragraph.js similarity index 60% rename from Client/src/modules/AMCModule_ContentItem_ParameterList.js rename to Client/core/modules/AMCModule_Paragraph.js index 4326a2614..e95836204 100644 --- a/Client/src/modules/AMCModule_ContentItem_ParameterList.js +++ b/Client/core/modules/AMCModule_Paragraph.js @@ -33,50 +33,46 @@ import * as Assert from "../common/AMCAsserts.js"; import * as Common from "../common/AMCCommon.js" -export default class AMCApplicationItem_Content_ParameterList extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) +export default class AMCApplicationModule_Paragraph extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_ParameterList"); - - this.entries = []; - - // TODO: check validity - this.headers = itemJSON.headers; - - this.stateid = 1; - - this.loadingtext = ""; - this.entriesperpage = 25; - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Paragraph"); + + this.usesV2Frontend = true; + + this.text = moduleJSON.text || ""; + this.variant = moduleJSON.variant || "body"; } - - + + updateFromJSON (updateJSON) { Assert.ObjectValue (updateJSON); - Assert.ArrayValue (updateJSON.entries); - - if (updateJSON.loadingtext) - this.loadingtext = Assert.StringValue (updateJSON.loadingtext); - if (updateJSON.entriesperpage) - this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); - - let oldEntryCount = this.entries.length; - for (let index = 0; index < oldEntryCount; index++) { - this.entries.pop(); - } - - for (let entry of updateJSON.entries) { - this.entries.push(entry); - } - + if (updateJSON.text !== undefined) + this.text = updateJSON.text; + if (updateJSON.variant !== undefined) + this.variant = updateJSON.variant; + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); } - -} \ No newline at end of file + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.text !== undefined) + this.text = attrs.text; + if (attrs.variant !== undefined) + this.variant = attrs.variant; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/core/modules/AMCModule_ParameterList.js b/Client/core/modules/AMCModule_ParameterList.js new file mode 100644 index 000000000..e992134cc --- /dev/null +++ b/Client/core/modules/AMCModule_ParameterList.js @@ -0,0 +1,777 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_ParameterList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_ParameterList"); + + this.usesV2Frontend = true; + + this.entries = []; + + // Per-column configuration (identifier -> {visible, width, sizeable}). + // Defaults: all visible, flexible width, not resizable. Overridable via + // subnodes in config.xml. + this.columns = this.defaultColumns (); + + this.headers = []; + this.rebuildHeaders (); + + this.stateid = 1; + this.loadingtext = ""; + this.entriesperpage = 25; + this.editevent = ""; + + // Stable per-list key (server provided via v2 attribute "preferencekey"). + // Used together with the page name to scope persisted view preferences. + this.preferenceKey = ""; + + // Client-side view state. This is applied on top of the raw server entries + // by applyView() and persisted per-user through the preferences API. + this.favorites = []; // array of rowKey strings, insertion ordered + this.showOnlyFavorites = false; + this.sort = { column: "", direction: "asc" }; // column is a header "value" key + this.filters = { groups: [], systems: [] }; // empty array = no restriction + this.presets = {}; // presetName -> preference document + this.activePreset = ""; + + // Persistence bookkeeping. preferencesLoaded guards against saving before the + // initial load has completed. onPreferencesChanged is an optional hook the + // frontend can set to react to state mutations (e.g. trigger a redraw). + // _loadTriggered ensures the one-time restore only fires once it is safe + // (stable key present, application available and session authenticated). + this.preferencesLoaded = false; + this._loadTriggered = false; + this.onPreferencesChanged = null; + this._saveTimer = null; + + this.PREFERENCE_DOMAIN = "parameterlist"; + + // Rows and values come from /frontend/parameterlist/{uuid}: the static row definitions + // are fetched once (definitionHash), afterwards only the values are polled (valuesHash). + this.definitionHash = ""; + this.valuesHash = ""; + this.parameterFetchInFlight = false; + this.onEntriesChanged = null; + + // A frontend that reports its display state (setDisplayed) only gets values while the + // list is actually shown, e.g. not while it sits in an inactive tab. Frontends that never + // report it are treated as always displaying the list while its page is active. + this.displayTracked = false; + this.displayed = false; + + this.updateFromJSON (moduleJSON); + } + + + // Coerces a server flag (boolean or "1"/"0"/"true"/"false") to a boolean. + parseFlag (value, fallback) + { + if (value === undefined || value === null) + return fallback; + return (value === true || value === "1" || value === "true"); + } + + + // The canonical column set in fixed order, all visible and flexible. + defaultColumns () + { + return [ + { identifier: 'parameter', value: 'paramDescription', text: 'Parameter', visible: true, width: '', sizeable: false }, + { identifier: 'value', value: 'paramValue', text: 'Value', visible: true, width: '', sizeable: false }, + { identifier: 'group', value: 'paramGroup', text: 'Group', visible: true, width: '', sizeable: false }, + { identifier: 'system', value: 'paramSystem', text: 'System', visible: true, width: '', sizeable: false }, + ]; + } + + + // Replaces this.columns from a server-provided column array (if any). Unknown + // or missing entries fall back to the canonical defaults, preserving order. + applyColumns (incoming) + { + if (!Array.isArray (incoming) || incoming.length === 0) + return; + + const byIdentifier = {}; + for (let column of incoming) { + if (column && column.identifier) + byIdentifier[column.identifier] = column; + } + + this.columns = this.defaultColumns ().map ((base) => { + const override = byIdentifier[base.identifier]; + if (!override) + return base; + return { + identifier: base.identifier, + value: base.value, + text: (override.text !== undefined && override.text !== null && override.text !== '') ? override.text : base.text, + visible: this.parseFlag (override.visible, true), + width: (override.width !== undefined && override.width !== null) ? String (override.width) : '', + sizeable: this.parseFlag (override.sizeable, false), + }; + }); + } + + + // Assembles the visible headers, carrying width and resize flags to clients. + rebuildHeaders () + { + const visibleColumns = this.columns + .filter ((column) => column.visible) + .map ((column) => ({ text: column.text, value: column.value, width: column.width, sizeable: column.sizeable })); + + while (this.headers.length > 0) this.headers.pop (); + for (let column of visibleColumns) this.headers.push (column); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (!updateJSON.entries) + return; + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.entriesperpage) + this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); + if (updateJSON.editevent !== undefined) + this.editevent = Assert.StringValue (updateJSON.editevent); + + this.applyColumns (updateJSON.columns); + this.rebuildHeaders (); + + let oldEntryCount = this.entries.length; + for (let index = 0; index < oldEntryCount; index++) { + this.entries.pop(); + } + for (let entry of updateJSON.entries) { + this.entries.push(entry); + } + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.entriesperpage !== undefined) + this.entriesperpage = attrs.entriesperpage; + if (attrs.editevent !== undefined) + this.editevent = attrs.editevent; + if (attrs.preferencekey !== undefined) + this.preferenceKey = String (attrs.preferencekey); + + this.applyColumns (attrs.columns); + this.rebuildHeaders (); + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + // The stable key and the authentication token both arrive asynchronously + // with the polled frontend state, so drive the one-time preference restore + // from here. maybeLoadPreferences() is guarded and only fires once ready. + this.maybeLoadPreferences (); + + // Called once per frontend poll while the page is active, and on every pushed change. + this.refreshParameters (); + } + + + // ----------------------------------------------------------------------- + // Parameter data (definition + values) via the parameter list endpoint + // ----------------------------------------------------------------------- + + setDisplayed (flag) + { + this.displayTracked = true; + this.displayed = !!flag; + if (this.displayed) + this.refreshParameters (); + } + + isDisplayed () + { + return (!this.displayTracked) || this.displayed; + } + + // The values are not part of the frontend status, so the application calls this periodically + // while the status is pushed instead of polled. + refreshLiveData () + { + this.maybeLoadPreferences (); + this.refreshParameters (); + } + + // Comma separated row indices/ranges of the rows that pass the active filters, or "" + // if no filter is active (= all rows). Returns null if no row passes the filters. + requestedRows () + { + if (!this.hasActiveFilters ()) + return ""; + + const ranges = []; + let rangeStart = -1; + let rangeEnd = -1; + this.entries.forEach ((row, index) => { + if (!this.rowPassesFilters (row)) + return; + if (rangeStart >= 0 && index === rangeEnd + 1) { + rangeEnd = index; + return; + } + if (rangeStart >= 0) + ranges.push ((rangeStart === rangeEnd) ? `${rangeStart}` : `${rangeStart}-${rangeEnd}`); + rangeStart = index; + rangeEnd = index; + }); + if (rangeStart >= 0) + ranges.push ((rangeStart === rangeEnd) ? `${rangeStart}` : `${rangeStart}-${rangeEnd}`); + + return (ranges.length > 0) ? ranges.join (",") : null; + } + + refreshParameters () + { + if (this.parameterFetchInFlight || !this.isActive () || !this.isDisplayed ()) + return; + + if (!this.definitionHash) { + this.fetchDefinition (); + return; + } + + const rows = this.requestedRows (); + if (rows === null) + return; + + this.fetchValues (rows, this.valuesHash); + } + + fetchDefinition () + { + const app = this.getApplication (); + if (!app) + return Promise.resolve (); + + this.parameterFetchInFlight = true; + return app.axiosGetRequest ("/frontend/parameterlist/" + this.uuid) + .then (resultJSON => { + this.parameterFetchInFlight = false; + const data = resultJSON.data || {}; + const definitions = Array.isArray (data.entries) ? data.entries : []; + const values = Array.isArray (data.values) ? data.values : []; + + const newEntries = definitions.map ((definition, index) => + Object.assign ({}, definition, { paramValue: (index < values.length) ? values[index] : "" })); + this.entries.splice (0, this.entries.length, ...newEntries); + + this.definitionHash = data.definitionhash || ""; + this.valuesHash = ""; + this.notifyEntriesChanged (); + }) + .catch (() => { + this.parameterFetchInFlight = false; + }); + } + + fetchValues (rows, knownValuesHash) + { + const app = this.getApplication (); + if (!app) + return Promise.resolve (); + + const params = { definitionhash: this.definitionHash }; + if (rows) + params.rows = rows; + if (knownValuesHash) + params.valueshash = knownValuesHash; + + this.parameterFetchInFlight = true; + return app.axiosGetRequest ("/frontend/parameterlist/" + this.uuid + "/values", { params: params }) + .then (resultJSON => { + this.parameterFetchInFlight = false; + const data = resultJSON.data || {}; + + if (data.definitionchanged) { + this.definitionHash = ""; + return this.fetchDefinition (); + } + + this.valuesHash = data.valueshash || ""; + if (data.unchanged || !Array.isArray (data.values)) + return; + + const indices = rows ? this.expandRows (rows) : this.entries.map ((row, index) => index); + let changed = false; + indices.forEach ((entryIndex, valueIndex) => { + const row = this.entries[entryIndex]; + const value = data.values[valueIndex]; + if (row && value !== undefined && row.paramValue !== value) { + // Replace instead of mutating so frontends that compare row identity re-render the row. + this.entries[entryIndex] = Object.assign ({}, row, { paramValue: value }); + changed = true; + } + }); + if (changed) + this.notifyEntriesChanged (); + }) + .catch (() => { + this.parameterFetchInFlight = false; + }); + } + + // Refreshes the values of all rows regardless of filters, e.g. before an export. + loadAllValues () + { + if (!this.definitionHash) + return this.fetchDefinition (); + return this.fetchValues ("", ""); + } + + expandRows (rows) + { + const indices = []; + for (let token of rows.split (",")) { + const bounds = token.split ("-").map ((part) => parseInt (part, 10)); + const last = (bounds.length > 1) ? bounds[1] : bounds[0]; + for (let index = bounds[0]; index <= last; index++) + indices.push (index); + } + return indices; + } + + notifyEntriesChanged () + { + if (typeof this.onEntriesChanged === "function") + this.onEntriesChanged (); + } + + + // ----------------------------------------------------------------------- + // View state: identity, sorting, filtering, favorites + // ----------------------------------------------------------------------- + + // Stable identity of a parameter row, matching the frontend rowKey(). + rowKey (row) + { + if (!row) + return ""; + return `${row.paramInstance ?? ''}.${row.paramGroupName ?? ''}.${row.paramName ?? ''}`; + } + + // Fully-qualified preference scope key for this list, combining the page and + // the server-provided stable list key. Returns "" if no stable key exists. + preferenceScopeKey () + { + if (!this.preferenceKey) + return ""; + const pageName = (this.page && this.page.name) ? this.page.name : ""; + return `${pageName}.${this.preferenceKey}`; + } + + isFavorite (row) + { + return this.favorites.indexOf (this.rowKey (row)) >= 0; + } + + toggleFavorite (row) + { + const key = this.rowKey (row); + const index = this.favorites.indexOf (key); + if (index >= 0) + this.favorites.splice (index, 1); + else + this.favorites.push (key); + this.markPreferencesDirty (); + } + + setShowOnlyFavorites (flag) + { + this.showOnlyFavorites = !!flag; + this.markPreferencesDirty (); + } + + // Toggles the sort on a column value key: unsorted -> asc -> desc -> unsorted. + toggleSort (columnValue) + { + if (this.sort.column !== columnValue) { + this.sort = { column: columnValue, direction: "asc" }; + } else if (this.sort.direction === "asc") { + this.sort = { column: columnValue, direction: "desc" }; + } else { + this.sort = { column: "", direction: "asc" }; + } + this.markPreferencesDirty (); + } + + setSort (columnValue, direction) + { + this.sort = { column: columnValue || "", direction: (direction === "desc") ? "desc" : "asc" }; + this.markPreferencesDirty (); + } + + // Distinct group descriptions present in the current entries (for the filter UI). + distinctGroups () + { + return this.distinctValues ("paramGroup"); + } + + // Distinct system descriptions present in the current entries (for the filter UI). + distinctSystems () + { + return this.distinctValues ("paramSystem"); + } + + distinctValues (field) + { + const seen = {}; + const result = []; + for (let row of this.entries) { + const value = row ? row[field] : undefined; + if (value !== undefined && value !== null && value !== "" && !seen[value]) { + seen[value] = true; + result.push (value); + } + } + return result; + } + + setGroupFilter (groups) + { + this.filters.groups = Array.isArray (groups) ? groups.slice () : []; + this.markPreferencesDirty (); + } + + setSystemFilter (systems) + { + this.filters.systems = Array.isArray (systems) ? systems.slice () : []; + this.markPreferencesDirty (); + } + + clearFilters () + { + this.filters = { groups: [], systems: [] }; + this.markPreferencesDirty (); + } + + // Applies favorites-first ordering, category filters, favorite-only visibility + // and column sorting to a raw entries array, returning a new array. The input + // is never mutated. + hasActiveFilters () + { + return ((this.filters.groups || []).length > 0) || ((this.filters.systems || []).length > 0) || this.showOnlyFavorites; + } + + // Category filters (AND across facets, OR within a facet) and favorites-only visibility. + rowPassesFilters (row) + { + const groupFilter = this.filters.groups || []; + const systemFilter = this.filters.systems || []; + if (groupFilter.length > 0 && groupFilter.indexOf (row.paramGroup) < 0) + return false; + if (systemFilter.length > 0 && systemFilter.indexOf (row.paramSystem) < 0) + return false; + if (this.showOnlyFavorites && !this.isFavorite (row)) + return false; + return true; + } + + applyView (rows) + { + let result = Array.isArray (rows) ? rows.slice () : []; + + if (this.hasActiveFilters ()) + result = result.filter ((row) => this.rowPassesFilters (row)); + + // Sorting. A stable sort keeps insertion order for equal keys. Favorites + // are always floated to the top regardless of the active column sort. + const sortColumn = this.sort.column; + const sortDir = (this.sort.direction === "desc") ? -1 : 1; + result = result + .map ((row, index) => ({ row, index })) + .sort ((a, b) => { + const aFav = this.isFavorite (a.row) ? 0 : 1; + const bFav = this.isFavorite (b.row) ? 0 : 1; + if (aFav !== bFav) + return aFav - bFav; + + if (sortColumn) { + const aValue = a.row[sortColumn]; + const bValue = b.row[sortColumn]; + const comparison = this.compareValues (aValue, bValue); + if (comparison !== 0) + return comparison * sortDir; + } + + return a.index - b.index; + }) + .map ((entry) => entry.row); + + return result; + } + + // Compares two cell values numerically when both look numeric, otherwise + // case-insensitively as strings. + compareValues (a, b) + { + const aStr = (a === undefined || a === null) ? "" : String (a); + const bStr = (b === undefined || b === null) ? "" : String (b); + + const aNum = parseFloat (aStr); + const bNum = parseFloat (bStr); + const bothNumeric = !isNaN (aNum) && !isNaN (bNum) && + aStr.trim () !== "" && bStr.trim () !== ""; + if (bothNumeric) { + if (aNum < bNum) return -1; + if (aNum > bNum) return 1; + return 0; + } + + return aStr.toLowerCase ().localeCompare (bStr.toLowerCase ()); + } + + + // ----------------------------------------------------------------------- + // Presets + // ----------------------------------------------------------------------- + + // The current active view collapsed into a plain, serializable object. + currentViewSnapshot () + { + return { + favorites: this.favorites.slice (), + showOnlyFavorites: this.showOnlyFavorites, + sort: { column: this.sort.column, direction: this.sort.direction }, + filters: { + groups: (this.filters.groups || []).slice (), + systems: (this.filters.systems || []).slice () + } + }; + } + + applyViewSnapshot (snapshot) + { + if (!snapshot) + return; + if (Array.isArray (snapshot.favorites)) + this.favorites = snapshot.favorites.slice (); + if (snapshot.showOnlyFavorites !== undefined) + this.showOnlyFavorites = !!snapshot.showOnlyFavorites; + if (snapshot.sort) { + this.sort = { + column: snapshot.sort.column || "", + direction: (snapshot.sort.direction === "desc") ? "desc" : "asc" + }; + } + if (snapshot.filters) { + this.filters = { + groups: Array.isArray (snapshot.filters.groups) ? snapshot.filters.groups.slice () : [], + systems: Array.isArray (snapshot.filters.systems) ? snapshot.filters.systems.slice () : [] + }; + } + } + + listPresets () + { + return Object.keys (this.presets).sort ((a, b) => a.toLowerCase ().localeCompare (b.toLowerCase ())); + } + + savePreset (name) + { + const trimmed = (name || "").trim (); + if (trimmed.length === 0) + return false; + this.presets[trimmed] = this.currentViewSnapshot (); + this.activePreset = trimmed; + this.markPreferencesDirty (); + return true; + } + + loadPreset (name) + { + const preset = this.presets[name]; + if (!preset) + return false; + this.applyViewSnapshot (preset); + this.activePreset = name; + this.markPreferencesDirty (); + return true; + } + + deletePreset (name) + { + if (!Object.prototype.hasOwnProperty.call (this.presets, name)) + return false; + delete this.presets[name]; + if (this.activePreset === name) + this.activePreset = ""; + this.markPreferencesDirty (); + return true; + } + + + // ----------------------------------------------------------------------- + // Persistence (serialization + REST via the owning application) + // ----------------------------------------------------------------------- + + // The complete preference document persisted for this list. + serializePreferences () + { + const snapshot = this.currentViewSnapshot (); + return { + version: 1, + favorites: snapshot.favorites, + showOnlyFavorites: snapshot.showOnlyFavorites, + sort: snapshot.sort, + filters: snapshot.filters, + activePreset: this.activePreset, + presets: this.presets + }; + } + + // Applies a persisted preference document to the live view state. + applyPreferenceDocument (doc) + { + if (!doc || typeof doc !== "object") + return; + this.applyViewSnapshot (doc); + this.presets = (doc.presets && typeof doc.presets === "object") ? doc.presets : {}; + this.activePreset = (typeof doc.activePreset === "string") ? doc.activePreset : ""; + } + + getApplication () + { + return (this.page && this.page.application) ? this.page.application : null; + } + + // Returns true once it is safe to talk to the preferences backend: a stable + // scope key exists, the owning application is available and the session is + // authenticated (the token arrives asynchronously after login). + preferencesReady () + { + const scopeKey = this.preferenceScopeKey (); + const app = this.getApplication (); + if (!scopeKey || !app || typeof app.getUserPreference !== "function") + return false; + if (app.API && typeof Common.nullToken === "function" && app.API.authToken === Common.nullToken ()) + return false; + return true; + } + + // Triggers the one-time preference restore as soon as the prerequisites are + // met. Called repeatedly from updateFromV2Attributes (once per poll) and + // refreshLiveData so it waits for the stable key and authentication to become available. + maybeLoadPreferences () + { + if (this._loadTriggered) + return; + if (!this.preferencesReady ()) + return; + this._loadTriggered = true; + this.loadPreferences (); + } + + // Loads persisted preferences for this list from the backend. Safe to call + // when no stable key or application is available (resolves to false). + async loadPreferences () + { + const scopeKey = this.preferenceScopeKey (); + const app = this.getApplication (); + if (!scopeKey || !app || typeof app.getUserPreference !== "function") { + this.preferencesLoaded = true; + return false; + } + + try { + const doc = await app.getUserPreference (this.PREFERENCE_DOMAIN, scopeKey); + if (doc) + this.applyPreferenceDocument (doc); + } catch (loadError) { + // Non-fatal: fall back to defaults if preferences cannot be loaded. + } + + this.preferencesLoaded = true; + if (typeof this.onPreferencesChanged === "function") + this.onPreferencesChanged (); + return true; + } + + // Flags the preference state as changed. Notifies any listener and schedules a + // debounced persist so rapid UI interactions collapse into a single request. + markPreferencesDirty () + { + if (typeof this.onPreferencesChanged === "function") + this.onPreferencesChanged (); + this.schedulePersist (); + + // Rows that just became visible through a filter change may carry outdated values. + this.refreshParameters (); + } + + schedulePersist (delayMs) + { + if (!this.preferencesLoaded) + return; + const scopeKey = this.preferenceScopeKey (); + const app = this.getApplication (); + if (!scopeKey || !app || typeof app.storeUserPreference !== "function") + return; + + if (this._saveTimer) + clearTimeout (this._saveTimer); + + this._saveTimer = setTimeout (() => { + this._saveTimer = null; + try { + app.storeUserPreference (this.PREFERENCE_DOMAIN, scopeKey, this.serializePreferences ()) + .catch (() => { /* transient persist failures are non-fatal */ }); + } catch (persistError) { + // Ignore synchronous persist errors; state remains in memory. + } + }, (delayMs === undefined) ? 400 : delayMs); + } + +} diff --git a/Client/core/modules/AMCModule_PartList.js b/Client/core/modules/AMCModule_PartList.js new file mode 100644 index 000000000..84a81efdd --- /dev/null +++ b/Client/core/modules/AMCModule_PartList.js @@ -0,0 +1,188 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_PartList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_PartList"); + + this.usesV2Frontend = true; + + this.builduuid = Common.nullUUID (); + this.loadingtext = "Loading build details..."; + this.showdetails = true; + this.selectevent = ""; + this.selectionvalueuuid = ""; + + // Changes whenever parts of the build are disabled or re-enabled; triggers a re-fetch. + this.partstateversion = 0; + + // Build details (fetched from api/build/) and derived part list. The fetch happens + // in this model class so both the Svelte and the Vue2 frontends share the same logic. + this.details = null; + this.parts = []; + this.loading = false; + this.errorMessage = ""; + + this.fetchedUUID = ""; + this.fetchedVersion = 0; + this.fetchInFlight = false; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.loadingtext) + this.loadingtext = Assert.StringValue (updateJSON.loadingtext); + if (updateJSON.builduuid) + this.builduuid = updateJSON.builduuid; + if (updateJSON.selectevent !== undefined) + this.selectevent = Assert.StringValue (updateJSON.selectevent); + if (updateJSON.selectionvalueuuid !== undefined) + this.selectionvalueuuid = Assert.StringValue (updateJSON.selectionvalueuuid); + if (updateJSON.partstateversion !== undefined) + this.partstateversion = Number (updateJSON.partstateversion) || 0; + + this.maybeFetchDetails (); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.showdetails !== undefined) + this.showdetails = !(attrs.showdetails === false || attrs.showdetails === "0" || attrs.showdetails === "false"); + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + if (attrs.builduuid !== undefined) + this.builduuid = attrs.builduuid; + if (attrs.selectevent !== undefined) + this.selectevent = attrs.selectevent; + if (attrs.selectionvalueuuid !== undefined) + this.selectionvalueuuid = attrs.selectionvalueuuid; + if (attrs.partstateversion !== undefined) + this.partstateversion = Number (attrs.partstateversion) || 0; + + this.maybeFetchDetails (); + + return true; + } + + + // Fetches the build details (name, layer count, thickness, size, thumbnail and part list) + // whenever the selected build or its part state version changes. A null/empty UUID clears + // the current details. A version-only change refreshes silently without a loading state. + maybeFetchDetails () + { + let uuid = this.builduuid || ""; + let nullUUID = Common.nullUUID (); + + if (!uuid || uuid === nullUUID) { + this.details = null; + this.parts = []; + this.errorMessage = ""; + this.fetchedUUID = ""; + this.fetchedVersion = 0; + return; + } + + let version = this.partstateversion; + if ((uuid === this.fetchedUUID) && (version === this.fetchedVersion)) + return; + if (this.fetchInFlight) + return; + + let isNewBuild = (uuid !== this.fetchedUUID); + + this.fetchedUUID = uuid; + this.fetchedVersion = version; + this.fetchInFlight = true; + if (isNewBuild) { + this.loading = true; + this.errorMessage = ""; + } + + let app = this.page.application; + + app.axiosGetRequest ("/build/" + uuid) + .then (resultJSON => { + this.fetchInFlight = false; + this.loading = false; + + // Ignore stale responses if the selection changed while loading. + if (this.fetchedUUID === uuid) { + let data = (resultJSON && resultJSON.data) ? resultJSON.data : null; + this.details = data; + this.errorMessage = ""; + + let newParts = (data && Array.isArray (data.parts)) ? data.parts : []; + let oldCount = this.parts.length; + for (let i = 0; i < oldCount; i++) this.parts.pop (); + for (let part of newParts) this.parts.push (part); + } + + // Catch up with selection or version changes that arrived while loading. + this.maybeFetchDetails (); + }) + .catch (err => { + this.fetchInFlight = false; + this.loading = false; + if (this.fetchedUUID !== uuid) { + this.maybeFetchDetails (); + return; + } + console.warn ("[PartList] build details load error:", (err && err.response) || err); + this.details = null; + let oldCount = this.parts.length; + for (let i = 0; i < oldCount; i++) this.parts.pop (); + this.errorMessage = "Could not load build details."; + this.maybeFetchDetails (); + }); + } + +} diff --git a/Client/core/modules/AMCModule_Separator.js b/Client/core/modules/AMCModule_Separator.js new file mode 100644 index 000000000..70bcf5743 --- /dev/null +++ b/Client/core/modules/AMCModule_Separator.js @@ -0,0 +1,72 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_Separator extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Separator"); + + this.usesV2Frontend = true; + + this.orientation = moduleJSON.orientation || "horizontal"; + this.variant = moduleJSON.variant || "light"; + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.orientation !== undefined) + this.orientation = attrs.orientation; + if (attrs.variant !== undefined) + this.variant = attrs.variant; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/src/modules/AMCModule_ContentItem_Image.js b/Client/core/modules/AMCModule_StateMachineGraph.js similarity index 55% rename from Client/src/modules/AMCModule_ContentItem_Image.js rename to Client/core/modules/AMCModule_StateMachineGraph.js index 072c6ebed..934609362 100644 --- a/Client/src/modules/AMCModule_ContentItem_Image.js +++ b/Client/core/modules/AMCModule_StateMachineGraph.js @@ -1,6 +1,6 @@ /*++ -Copyright (C) 2021 Autodesk Inc. +Copyright (C) 2026 Autodesk Inc. All rights reserved. @@ -33,29 +33,49 @@ import * as Assert from "../common/AMCAsserts.js"; import * as Common from "../common/AMCCommon.js" -export default class AMCApplicationItem_Content_Image extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) +export default class AMCApplicationModule_StateMachineGraph extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) { - Assert.ObjectValue (itemJSON); - - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Image"); - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_StateMachineGraph"); + + this.usesV2Frontend = true; + + this.statemachine = ""; + this.activestate = ""; + this.nodepositions = ""; + + this.updateFromJSON (moduleJSON); } - + + updateFromJSON (updateJSON) - { - this.imageresource = Assert.UUIDValue (updateJSON.imageresource); - this.aspectratio = Assert.NumberValue (updateJSON.aspectratio); - if (updateJSON.maxwidth) - this.maxwidth = Assert.NumberValue (updateJSON.maxwidth); - if (updateJSON.maxheight) - this.maxheight = Assert.NumberValue (updateJSON.maxheight); - + { + if (updateJSON.statemachine !== undefined) + this.statemachine = updateJSON.statemachine; + if (updateJSON.activestate !== undefined) + this.activestate = updateJSON.activestate; + if (updateJSON.nodepositions !== undefined) + this.nodepositions = updateJSON.nodepositions; } - + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.statemachine !== undefined) + this.statemachine = attrs.statemachine; + if (attrs.activestate !== undefined) + this.activestate = attrs.activestate; + if (attrs.nodepositions !== undefined) + this.nodepositions = attrs.nodepositions; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + } diff --git a/Client/core/modules/AMCModule_StatusBanner.js b/Client/core/modules/AMCModule_StatusBanner.js new file mode 100644 index 000000000..ae1e59d95 --- /dev/null +++ b/Client/core/modules/AMCModule_StatusBanner.js @@ -0,0 +1,81 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_StatusBanner extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_StatusBanner"); + + this.usesV2Frontend = true; + + this.severity = moduleJSON.severity || "ok"; + this.title = moduleJSON.title || ""; + this.description = moduleJSON.description || ""; + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + if (updateJSON.severity !== undefined) + this.severity = updateJSON.severity; + if (updateJSON.title !== undefined) + this.title = updateJSON.title; + if (updateJSON.description !== undefined) + this.description = updateJSON.description; + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.severity !== undefined) + this.severity = attrs.severity; + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.description !== undefined) + this.description = attrs.description; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/core/modules/AMCModule_StatusList.js b/Client/core/modules/AMCModule_StatusList.js new file mode 100644 index 000000000..3a19ad472 --- /dev/null +++ b/Client/core/modules/AMCModule_StatusList.js @@ -0,0 +1,93 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_StatusList extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_StatusList"); + + this.usesV2Frontend = true; + + this.title = moduleJSON.title || ""; + this.loadingtext = moduleJSON.loadingtext || ""; + this.rows = []; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.title !== undefined) + this.title = updateJSON.title; + if (updateJSON.loadingtext !== undefined) + this.loadingtext = updateJSON.loadingtext; + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); + + if (!updateJSON.rows) + return; + + while (this.rows.length > 0) this.rows.pop(); + for (let row of updateJSON.rows) this.rows.push(row); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.loadingtext !== undefined) + this.loadingtext = attrs.loadingtext; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + const incoming = Array.isArray(attrs.rows) ? attrs.rows : []; + while (this.rows.length > 0) this.rows.pop(); + for (let row of incoming) this.rows.push(row); + + return true; + } + +} diff --git a/Client/core/modules/AMCModule_TableUtils.js b/Client/core/modules/AMCModule_TableUtils.js new file mode 100644 index 000000000..b112e0e15 --- /dev/null +++ b/Client/core/modules/AMCModule_TableUtils.js @@ -0,0 +1,158 @@ +/*++ + +Copyright (C) 2020 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + +/** + * Shared table utility helpers for list modules (AlertList, BuildList, + * ExecutionList, ParameterList, ConfigurationList). + */ + + +const NULL_UUID = '00000000-0000-0000-0000-000000000000'; + +/** Badge class maps */ +export const SEVERITY_CLASSES = { + error: 'badge--red', + critical: 'badge--red', + fatal: 'badge--red', + warning: 'badge--yellow', + warn: 'badge--yellow', + info: 'badge--blue', + debug: 'badge--slate', + ok: 'badge--green', + success: 'badge--green', +}; + +export const STATUS_CLASSES = { + running: 'badge--blue', + active: 'badge--blue', + finished: 'badge--green', + completed: 'badge--green', + succeeded: 'badge--green', + failed: 'badge--red', + error: 'badge--red', + aborted: 'badge--yellow', + cancelled: 'badge--yellow', + pending: 'badge--slate', + queued: 'badge--slate', + paused: 'badge--purple', +}; + +/** + * Format an ISO timestamp to a short date+time string. + * @param {string} isoString + * @returns {string} + */ +export function formatTime (isoString) { + if (!isoString) return ''; + const date = new Date(isoString); + if (isNaN(date.getTime())) return isoString; + return new Intl.DateTimeFormat('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }).format(date); +} + +/** + * Format an ISO timestamp to a full date+time string including year. + * @param {string} isoString + * @returns {string} + */ +export function formatDateTime (isoString) { + if (!isoString) return ''; + const date = new Date(isoString); + if (isNaN(date.getTime())) return isoString; + return new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + }).format(date); +} + +/** + * Format a duration given in seconds (or null) to hh:mm:ss. + * @param {number|null} durationInSeconds + * @returns {string} + */ +export function formatDuration (durationInSeconds) { + if (durationInSeconds == null) return ''; + const s = Math.round(durationInSeconds); + const h = Math.floor(s / 3600); + const m = Math.floor((s % 3600) / 60); + const sec = s % 60; + return [h, m, sec].map(n => String(n).padStart(2, '0')).join(':'); +} + +/** + * Return true when the given UUID is not the null UUID and not empty. + * @param {string} uuid + * @returns {boolean} + */ +export function isValidUUID (uuid) { + return !!uuid && uuid !== NULL_UUID; +} + +/** + * Trigger a row-selection UI event. + * @param {object} app - AMCApplication instance + * @param {object} module - module with selectevent / selectionvalueuuid + * @param {string} itemUUID - UUID of the selected item + */ +export function triggerSelectEvent (app, module, itemUUID) { + if (!app || !module || !module.selectevent) return; + const formvalues = {}; + if (module.selectionvalueuuid && itemUUID) + formvalues[module.selectionvalueuuid] = itemUUID; + app.triggerUIEvent(module.selectevent, module.uuid, formvalues); +} + +/** + * Trigger an entry-button UI event. + * @param {object} app - AMCApplication instance + * @param {object} module - module with selectionvalueuuid / buttonvalueuuid + * @param {object} button - entry button definition with selectevent / uuid + * @param {string} itemUUID - UUID of the row item + */ +export function triggerButtonEvent (app, module, button, itemUUID) { + if (!app || !module || !button || !button.selectevent) return; + const formvalues = {}; + if (module.selectionvalueuuid && itemUUID) + formvalues[module.selectionvalueuuid] = itemUUID; + if (module.buttonvalueuuid && button.uuid) + formvalues[module.buttonvalueuuid] = button.uuid; + app.triggerUIEvent(button.selectevent, module.uuid, formvalues); +} diff --git a/Client/src/modules/AMCModule_Tabs.js b/Client/core/modules/AMCModule_Tabs.js similarity index 62% rename from Client/src/modules/AMCModule_Tabs.js rename to Client/core/modules/AMCModule_Tabs.js index 94ba8461e..75766dbf4 100644 --- a/Client/src/modules/AMCModule_Tabs.js +++ b/Client/core/modules/AMCModule_Tabs.js @@ -40,6 +40,12 @@ export default class AMCApplicationModule_Tabs extends Common.AMCApplicationModu Assert.ObjectValue (moduleJSON); super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); this.registerClass ("amcModule_Tabs"); + this.usesV2Frontend = true; + + // Optional card framing (mirrors the "content" module). + this.cardstyle = moduleJSON.cardstyle || "none"; + this.title = moduleJSON.title || ""; + this.subtitle = moduleJSON.subtitle || ""; this.tabs = []; @@ -73,4 +79,38 @@ export default class AMCApplicationModule_Tabs extends Common.AMCApplicationModu } } } + + // Phase 3: v2 frontend – propagate "visible" and "caption" from v2 + // submodules to child tabs, mirroring the legacy updateFromJSON behaviour. + // Modules that do not register a "visible" attribute on the backend + // (e.g. Logs, GLScene) keep the base-class default of true. + updateFromV2Attributes (attrs) { + if (attrs) { + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === true || attrs.visible === "1" || attrs.visible === "true"); + if (attrs.cardstyle !== undefined) + this.cardstyle = attrs.cardstyle; + if (attrs.title !== undefined) + this.title = attrs.title; + if (attrs.subtitle !== undefined) + this.subtitle = attrs.subtitle; + } + + let v2Entry = this.page.application.getV2Entry(this.uuid); + if (v2Entry && v2Entry.submodules) { + for (let submod of v2Entry.submodules) { + let tab = this.tabs.find(t => t.uuid === submod.uuid); + if (tab && submod.attributes) { + if (submod.attributes.visible !== undefined) + tab.visible = (submod.attributes.visible === "1" || submod.attributes.visible === true || submod.attributes.visible === "true"); + if (submod.attributes.caption !== undefined) + tab.caption = submod.attributes.caption; + } + } + } + return true; + } + } diff --git a/Client/core/modules/AMCModule_TogglePanel.js b/Client/core/modules/AMCModule_TogglePanel.js new file mode 100644 index 000000000..bb5b1ad5f --- /dev/null +++ b/Client/core/modules/AMCModule_TogglePanel.js @@ -0,0 +1,88 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_TogglePanel extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_TogglePanel"); + + this.usesV2Frontend = true; + + this.columns = moduleJSON.columns || 3; + this.toggles = []; + + this.updateFromJSON (moduleJSON); + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + + if (updateJSON.columns !== undefined) + this.columns = updateJSON.columns; + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); + + if (!updateJSON.toggles) + return; + + while (this.toggles.length > 0) this.toggles.pop(); + for (let toggle of updateJSON.toggles) this.toggles.push(toggle); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + + if (attrs.columns !== undefined) + this.columns = attrs.columns; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + + const incoming = Array.isArray(attrs.toggles) ? attrs.toggles : []; + while (this.toggles.length > 0) this.toggles.pop(); + for (let toggle of incoming) this.toggles.push(toggle); + + return true; + } + +} diff --git a/Client/core/modules/AMCModule_Upload.js b/Client/core/modules/AMCModule_Upload.js new file mode 100644 index 000000000..1ab112e9b --- /dev/null +++ b/Client/core/modules/AMCModule_Upload.js @@ -0,0 +1,87 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + +import AMCUploadState from "../common/AMCImplementation_UploadState.js" + + +export default class AMCApplicationModule_Upload extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Upload"); + + this.usesV2Frontend = true; + + this.uploadclass = Assert.OptionalIdentifierString (moduleJSON.uploadclass) || "build"; + this.uploadsuccessevent = Assert.OptionalIdentifierString (moduleJSON.uploadsuccessevent); + this.uploadfailureevent = Assert.OptionalIdentifierString (moduleJSON.uploadfailureevent); + this.uploadcaption = moduleJSON.uploadcaption || ""; + this.uploadfilename = ""; + this.uploadisinitial = 1; + this.uploadissaving = 0; + this.acceptedtypes = moduleJSON.acceptedtypes || ""; + + if (!this.acceptedtypes) { + if (this.uploadclass === "build") this.acceptedtypes = ".3mf"; + if (this.uploadclass === "image") this.acceptedtypes = ".png,.jpg"; + } + + this.state = new AMCUploadState (this.uuid); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.uploadclass !== undefined) + this.uploadclass = attrs.uploadclass; + if (attrs.uploadcaption !== undefined) + this.uploadcaption = attrs.uploadcaption; + if (attrs.successevent !== undefined) + this.uploadsuccessevent = attrs.successevent; + if (attrs.failureevent !== undefined) + this.uploadfailureevent = attrs.failureevent; + if (attrs.acceptedtypes !== undefined) + this.acceptedtypes = attrs.acceptedtypes; + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + +} diff --git a/Client/src/modules/AMCModule_ContentItem_AlertList.js b/Client/core/modules/AMCModule_VideoStream.js similarity index 50% rename from Client/src/modules/AMCModule_ContentItem_AlertList.js rename to Client/core/modules/AMCModule_VideoStream.js index 6e8204219..64cd8cd1e 100644 --- a/Client/src/modules/AMCModule_ContentItem_AlertList.js +++ b/Client/core/modules/AMCModule_VideoStream.js @@ -33,56 +33,55 @@ import * as Assert from "../common/AMCAsserts.js"; import * as Common from "../common/AMCCommon.js" -export default class AMCApplicationItem_Content_AlertList extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) +export default class AMCApplicationModule_VideoStream extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_AlertList"); - - this.entries = []; - - // TODO: check validity - this.headers = itemJSON.headers; - this.loadingtext = ""; - this.selectevent = ""; - this.selectionvalueuuid = Common.nullUUID (); - this.entriesperpage = 25; - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_VideoStream"); + + this.usesV2Frontend = true; + + this.streamresource = Common.nullUUID (); + this.aspectratio = 1.0; + this.maxwidth = 0; + this.maxheight = 0; + + this.updateFromJSON (moduleJSON); } - - + + updateFromJSON (updateJSON) { - Assert.ObjectValue (updateJSON); - Assert.ArrayValue (updateJSON.entries); - - if (updateJSON.loadingtext) - this.loadingtext = Assert.StringValue (updateJSON.loadingtext); - if (updateJSON.selectevent) - this.selectevent = Assert.IdentifierString (updateJSON.selectevent); - if (updateJSON.selectionvalueuuid) - this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); - if (updateJSON.entriesperpage) - this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); - - let oldEntryCount = this.entries.length; - for (let index = 0; index < oldEntryCount; index++) { - this.entries.pop(); - } - - for (let entry of updateJSON.entries) { - this.entries.push(entry); - } - + if (updateJSON.streamresource) + this.streamresource = Assert.UUIDValue (updateJSON.streamresource); + if (updateJSON.aspectratio !== undefined) + this.aspectratio = Assert.NumberValue (updateJSON.aspectratio); + if (updateJSON.maxwidth !== undefined) + this.maxwidth = Assert.NumberValue (updateJSON.maxwidth); + if (updateJSON.maxheight !== undefined) + this.maxheight = Assert.NumberValue (updateJSON.maxheight); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.streamresource !== undefined) + this.streamresource = attrs.streamresource; + if (attrs.aspectratio !== undefined) + this.aspectratio = parseFloat(attrs.aspectratio); + if (attrs.maxwidth !== undefined) + this.maxwidth = parseFloat(attrs.maxwidth); + if (attrs.maxheight !== undefined) + this.maxheight = parseFloat(attrs.maxheight); + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; } - - - -} \ No newline at end of file +} diff --git a/Client/core/modules/AMCModule_Workflow.js b/Client/core/modules/AMCModule_Workflow.js new file mode 100644 index 000000000..469e9ce24 --- /dev/null +++ b/Client/core/modules/AMCModule_Workflow.js @@ -0,0 +1,154 @@ +/*++ + +Copyright (C) 2021 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + */ + + +import * as Assert from "../common/AMCAsserts.js"; +import * as Common from "../common/AMCCommon.js" + + +export default class AMCApplicationModule_Workflow extends Common.AMCApplicationModule { + + constructor (page, moduleJSON) + { + Assert.ObjectValue (moduleJSON); + super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name || moduleJSON.uuid, moduleJSON.caption || ""); + this.registerClass ("amcModule_Workflow"); + + this.usesV2Frontend = true; + + this.workflowData = moduleJSON.workflowdata || null; + this.catalogData = moduleJSON.catalogdata || null; + } + + + updateFromJSON (updateJSON) + { + Assert.ObjectValue (updateJSON); + if (updateJSON.workflowdata !== undefined) + this.workflowData = updateJSON.workflowdata; + if (updateJSON.catalogdata !== undefined) + this.catalogData = updateJSON.catalogdata; + if (updateJSON.visible !== undefined) + this.visible = Assert.BoolValue (updateJSON.visible); + } + + + updateFromV2Attributes (attrs) + { + if (!attrs) + return true; + if (attrs.workflowdata !== undefined) + this.workflowData = attrs.workflowdata; + if (attrs.catalogdata !== undefined) + this.catalogData = attrs.catalogdata; + if (attrs.catalog !== undefined) + this.catalogData = this._normalizeCatalog(attrs.catalog); + if (attrs.caption !== undefined) + this.caption = attrs.caption; + if (attrs.visible !== undefined) + this.visible = (attrs.visible === "1" || attrs.visible === true || attrs.visible === "true"); + return true; + } + + _normalizeCatalog (rawCatalog) + { + if (!Array.isArray(rawCatalog)) + return null; + return rawCatalog.map(entry => { + const normalized = { + id: entry.id, + label: entry.label || entry.id, + category: entry.category || "functionblock", + color: entry.color || "blue" + }; + if (entry.params && Array.isArray(entry.params)) { + normalized.params = entry.params.map(p => { + const param = { + name: p.name, + type: p.type || "string" + }; + if (p.unit) param.unit = p.unit; + if (p.default !== undefined && p.default !== "") { + if (p.type === "int") param.default = parseInt(p.default, 10); + else if (p.type === "float") param.default = parseFloat(p.default); + else if (p.type === "bool") param.default = (p.default === "true" || p.default === "1"); + else param.default = p.default; + } + return param; + }); + } + return normalized; + }); + } + + getDefaultWorkflow () + { + return { + uuid: "mock-workflow-001", + name: "Example Production", + sequence: [ + { id: "s1", stepRef: "exposure", params: {} }, + { id: "s2", stepRef: "delay", params: { duration: 3000 } }, + { id: "s3", stepRef: "beschichter_lr", params: {} }, + { + id: "g1", + type: "parallel", + branches: [ + [ + { id: "s4a", stepRef: "dosierung_r", params: {} }, + { id: "s5a", stepRef: "delay", params: { duration: 2000 } } + ], + [ + { id: "s4b", stepRef: "heatup_layer", params: {} }, + { id: "s5b", stepRef: "hold_temp", params: {} } + ] + ] + }, + { id: "s6", stepRef: "exposure", params: {} } + ] + }; + } + + getDefaultCatalog () + { + return [ + { id: "exposure", label: "Exposure", category: "functionblock", color: "blue" }, + { id: "delay", label: "Delay", category: "functionblock", color: "blue", + params: [{ name: "duration", type: "int", unit: "ms", default: 1000 }] }, + { id: "beschichter_lr", label: "Beschichter L→R", category: "template", color: "amber" }, + { id: "beschichter_rl", label: "Beschichter R→L", category: "template", color: "amber" }, + { id: "dosierung_r", label: "Dosierung R", category: "template", color: "amber" }, + { id: "dosierung_l", label: "Dosierung L", category: "template", color: "amber" }, + { id: "heatup_layer", label: "Heatup Layer", category: "template", color: "amber" }, + { id: "hold_temp", label: "Hold Temperature",category: "template", color: "amber" } + ]; + } + +} diff --git a/Client/core/theme/themeLoader.js b/Client/core/theme/themeLoader.js new file mode 100644 index 000000000..43d08cbeb --- /dev/null +++ b/Client/core/theme/themeLoader.js @@ -0,0 +1,215 @@ +/*++ + +Copyright (C) 2026 Autodesk Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Autodesk Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/** + * Loads a JSON theme file and injects token overrides as CSS custom properties + * on the document root element. + * + * Theme JSON format: + * { + * "name": "My Theme", + * "tokens": { + * "--amcf-color-primary": "#1a73e8", + * "--amcf-color-bg": "#f0f2f5" + * } + * } + * + * Only tokens present in the JSON are overridden; all others retain their + * default values from tokens.css. + */ + +const THEME_STORAGE_KEY = "amcf-theme-overrides"; + +/** + * Apply a set of token overrides to the document root. + * @param {Object} tokens key-value pairs of CSS custom property names to values + */ +export function applyTokens (tokens) +{ + if (!tokens || typeof tokens !== "object") + return; + + const root = document.documentElement; + for (const [prop, value] of Object.entries (tokens)) { + if (typeof prop === "string" && prop.startsWith ("--amcf-")) + root.style.setProperty (prop, value); + } +} + +/** + * Load a theme from a URL (typically `/api/theme`) and apply its tokens. + * Falls back silently to the default tokens.css values on any error. + * + * @param {string} url The URL to fetch the theme JSON from + * @returns {Promise} The parsed theme object, or null on failure + */ +export async function loadThemeFromURL (url) +{ + try { + const resp = await fetch (url); + if (!resp.ok) + return null; + + const theme = await resp.json (); + if (theme && theme.tokens) + applyTokens (theme.tokens); + + return theme; + + } catch (e) { + console.warn ("[AMCF Theme] Could not load theme from", url, e); + return null; + } +} + +/** + * Load a theme from a JSON object and apply its tokens. + * Useful for embedding a theme directly in the application configuration. + * + * @param {Object} themeJSON The theme object with a "tokens" property + */ +export function loadThemeFromJSON (themeJSON) +{ + if (themeJSON && themeJSON.tokens) + applyTokens (themeJSON.tokens); +} + +/** + * Toggle the high-contrast accessibility mode. + * Adds or removes the `amcf-high-contrast` class on the root element and + * persists the preference in localStorage. + * + * @param {boolean} [enable] Force on/off; omit to toggle + * @returns {boolean} The new high-contrast state + */ +export function toggleHighContrast (enable) +{ + const root = document.documentElement; + const isOn = root.classList.contains ("amcf-high-contrast"); + const next = (enable !== undefined) ? enable : !isOn; + + if (next) { + root.classList.add ("amcf-high-contrast"); + try { localStorage.setItem ("amcf-high-contrast", "1"); } catch (_) { /* noop */ } + } else { + root.classList.remove ("amcf-high-contrast"); + try { localStorage.removeItem ("amcf-high-contrast"); } catch (_) { /* noop */ } + } + + return next; +} + +/** + * Restore high-contrast preference from localStorage on startup. + */ +export function restoreHighContrastPreference () +{ + try { + if (localStorage.getItem ("amcf-high-contrast") === "1") + document.documentElement.classList.add ("amcf-high-contrast"); + } catch (_) { + /* localStorage unavailable */ + } +} + +/** + * Toggle dark mode on or off. + * Adds or removes the `dark` class on the root element and + * persists the preference in localStorage. + * + * @param {boolean} [enable] Force on/off; omit to toggle + * @returns {boolean} The new dark-mode state + */ +export function toggleDarkMode (enable) +{ + const root = document.documentElement; + const isOn = root.classList.contains ("dark"); + const next = (enable !== undefined) ? enable : !isOn; + + if (next) { + root.classList.add ("dark"); + try { localStorage.setItem ("amcf-dark-mode", "1"); } catch (_) { /* noop */ } + } else { + root.classList.remove ("dark"); + try { localStorage.setItem ("amcf-dark-mode", "0"); } catch (_) { /* noop */ } + } + + return next; +} + +/** + * Restore dark-mode preference from localStorage on startup. + * Priority: (1) localStorage, (2) OS prefers-color-scheme, (3) server default. + * + * @param {string} [serverDefault] "dark", "light", or "system" (default: "system") + * @returns {boolean} Whether dark mode was activated + */ +export function restoreDarkModePreference (serverDefault) +{ + try { + const stored = localStorage.getItem ("amcf-dark-mode"); + if (stored !== null) { + const wantDark = stored === "1"; + if (wantDark) + document.documentElement.classList.add ("dark"); + else + document.documentElement.classList.remove ("dark"); + return wantDark; + } + } catch (_) { + /* localStorage unavailable */ + } + + const sd = (serverDefault || "system").toLowerCase (); + let wantDark; + if (sd === "dark") { + wantDark = true; + } else if (sd === "light") { + wantDark = false; + } else { + wantDark = window.matchMedia && window.matchMedia ("(prefers-color-scheme: dark)").matches; + } + + if (wantDark) + document.documentElement.classList.add ("dark"); + else + document.documentElement.classList.remove ("dark"); + return wantDark; +} + +/** + * Check whether dark mode is currently active. + * + * @returns {boolean} + */ +export function isDarkMode () +{ + return document.documentElement.classList.contains ("dark"); +} diff --git a/Client/core/theme/themes/scanlab-light.json b/Client/core/theme/themes/scanlab-light.json new file mode 100644 index 000000000..5d7ffe872 --- /dev/null +++ b/Client/core/theme/themes/scanlab-light.json @@ -0,0 +1,23 @@ +{ + "name": "ScanLab Corporate Light", + "description": "Light industrial theme following the ScanLab corporate style guide. Light gray backgrounds, ScanLab red accent, clean typography.", + "tokens": { + "--amcf-color-bg": "#E0E3E7", + "--amcf-color-surface": "#FFFFFF", + "--amcf-color-surface-raised": "#F5F6F8", + "--amcf-color-surface-inset": "#D8DBDF", + "--amcf-color-surface-hover": "#ECEEF0", + "--amcf-color-primary": "#C8102E", + "--amcf-color-primary-hover": "#A00D24", + "--amcf-color-ok": "#43A047", + "--amcf-color-warn": "#F9A825", + "--amcf-color-error": "#C8102E", + "--amcf-color-info": "#2979FF", + "--amcf-color-text": "#1E1E1E", + "--amcf-color-text-muted": "#5F6368", + "--amcf-color-text-dim": "#90A4AE", + "--amcf-color-border": "#C8CCD0", + "--amcf-color-border-strong": "#9BA3AB", + "--amcf-font-family": "\"Segoe UI\", \"Inter\", \"Helvetica Neue\", Arial, sans-serif" + } +} diff --git a/Client/core/theme/tokens.css b/Client/core/theme/tokens.css new file mode 100644 index 000000000..dc2bf4548 --- /dev/null +++ b/Client/core/theme/tokens.css @@ -0,0 +1,147 @@ +/* + * AMCF Design Tokens + * + * Default theme following the ScanLab corporate style guide. + * Light backgrounds, ScanLab red accent, clean industrial aesthetic. + * Every widget must consume these tokens exclusively — no hardcoded colors. + * Override any token via a JSON theme file loaded by themeLoader.js. + * + * Copyright (C) 2026 Autodesk Inc. All rights reserved. + * BSD-3-Clause — see LICENSE for details. + */ + +:root { + + /* ── Surface colors (light industrial) ────────────────────────── */ + --amcf-color-bg: #E0E3E7; + --amcf-color-surface: #FFFFFF; + --amcf-color-surface-raised: #F5F6F8; + --amcf-color-surface-inset: #D8DBDF; + --amcf-color-surface-hover: #ECEEF0; + + /* ── Brand / accent — ScanLab red ────────────────────────────── */ + --amcf-color-primary: #C8102E; + --amcf-color-primary-hover: #A00D24; + --amcf-color-primary-bg: rgba(200, 16, 46, 0.06); + + /* ── Status colors ────────────────────────────────────────────── */ + --amcf-color-ok: #43A047; + --amcf-color-ok-bg: rgba(67, 160, 71, 0.08); + --amcf-color-ok-border: rgba(67, 160, 71, 0.22); + + --amcf-color-warn: #F9A825; + --amcf-color-warn-bg: rgba(249, 168, 37, 0.08); + --amcf-color-warn-border: rgba(249, 168, 37, 0.22); + + --amcf-color-error: #C8102E; + --amcf-color-error-bg: rgba(200, 16, 46, 0.06); + --amcf-color-error-border: rgba(200, 16, 46, 0.18); + + --amcf-color-info: #2979FF; + --amcf-color-info-bg: rgba(41, 121, 255, 0.06); + + --amcf-color-archive: #90A4AE; + + /* ── Status pill tokens (semantic badges: on/off/yes/no/map) ───── */ + /* Consumed by the statuslist pills in both clients. Light defaults + here; dark overrides in the .dark / .theme--dark block below. + Override any of these via a server/JSON theme (they are --amcf-*). */ + --amcf-status-success-bg: rgba(67, 160, 71, 0.14); + --amcf-status-success-fg: #2E7D32; + --amcf-status-warning-bg: rgba(249, 168, 37, 0.16); + --amcf-status-warning-fg: #E65100; + --amcf-status-error-bg: rgba(200, 16, 46, 0.12); + --amcf-status-error-fg: #C8102E; + --amcf-status-info-bg: rgba(41, 121, 255, 0.12); + --amcf-status-info-fg: #1565C0; + --amcf-status-neutral-bg: rgba(140, 150, 165, 0.18); + --amcf-status-neutral-fg: #607D8B; + + /* ── Text colors ──────────────────────────────────────────────── */ + --amcf-color-text: #1E1E1E; + --amcf-color-text-muted: #5F6368; + --amcf-color-text-dim: #90A4AE; + --amcf-color-text-inverse: #FFFFFF; + + /* ── Borders ──────────────────────────────────────────────────── */ + --amcf-color-border: #C8CCD0; + --amcf-color-border-strong: #9BA3AB; + + /* ── Typography ───────────────────────────────────────────────── */ + --amcf-font-family: "Segoe UI", "Inter", "Helvetica Neue", Arial, sans-serif; + --amcf-font-family-mono: "Cascadia Code", "Fira Code", Consolas, monospace; + + --amcf-typo-h1-size: 24px; + --amcf-typo-h1-weight: 700; + --amcf-typo-h2-size: 16px; + --amcf-typo-h2-weight: 600; + --amcf-typo-body-size: 14px; + --amcf-typo-body-weight: 400; + --amcf-typo-label-size: 12px; + --amcf-typo-label-weight: 600; + --amcf-typo-subtext-size: 12px; + --amcf-typo-subtext-weight: 400; + --amcf-typo-code-size: 12px; + + /* ── Spacing scale ────────────────────────────────────────────── */ + --amcf-space-1: 4px; + --amcf-space-2: 8px; + --amcf-space-3: 12px; + --amcf-space-4: 16px; + --amcf-space-5: 20px; + --amcf-space-6: 24px; + --amcf-space-8: 32px; + --amcf-space-10: 40px; + + /* ── Border radius ────────────────────────────────────────────── */ + --amcf-radius-sm: 2px; + --amcf-radius-md: 4px; + --amcf-radius-lg: 6px; + --amcf-radius-xl: 8px; + --amcf-radius-pill: 999px; + + /* ── Elevation / shadow (softer for light theme) ──────────────── */ + --amcf-shadow-0: none; + --amcf-shadow-1: 0 1px 3px rgba(0, 0, 0, 0.08); + --amcf-shadow-2: 0 2px 6px rgba(0, 0, 0, 0.10); + --amcf-shadow-3: 0 4px 12px rgba(0, 0, 0, 0.12); + --amcf-shadow-4: 0 8px 24px rgba(0, 0, 0, 0.15); + + /* ── Button tokens ────────────────────────────────────────────── */ + --amcf-btn-primary-bg: var(--amcf-color-primary); + --amcf-btn-primary-text: #FFFFFF; + --amcf-btn-secondary-bg: transparent; + --amcf-btn-secondary-border: var(--amcf-color-border-strong); + --amcf-btn-secondary-text: var(--amcf-color-text); + --amcf-btn-tertiary-text: var(--amcf-color-primary); + --amcf-btn-danger-bg: var(--amcf-color-error); + --amcf-btn-danger-text: #FFFFFF; + --amcf-btn-disabled-opacity: 0.4; + + /* ── Interactive targets ──────────────────────────────────────── */ + --amcf-target-min-size: 44px; + + /* ── Transition ───────────────────────────────────────────────── */ + --amcf-transition-fast: 0.15s ease; +} + +/* + * Dark-mode overrides for the status pill tokens. + * `.dark` covers the Svelte client (class-based dark mode), `.theme--dark` + * covers the Vuetify-based Vue2 client. Only the semantic status colors are + * re-tinted here so pills stay legible on dark surfaces; everything else keeps + * inheriting the light values unless a server theme overrides them. + */ +.dark, +.theme--dark { + --amcf-status-success-bg: rgba(34, 197, 94, 0.18); + --amcf-status-success-fg: #86EFAC; + --amcf-status-warning-bg: rgba(245, 158, 11, 0.18); + --amcf-status-warning-fg: #FCD34D; + --amcf-status-error-bg: rgba(239, 68, 68, 0.20); + --amcf-status-error-fg: #FCA5A5; + --amcf-status-info-bg: rgba(59, 130, 246, 0.20); + --amcf-status-info-fg: #93C5FD; + --amcf-status-neutral-bg: rgba(148, 163, 184, 0.18); + --amcf-status-neutral-fg: #CBD5E1; +} diff --git a/Client/src/common/AMCApplication.js b/Client/src/common/AMCApplication.js deleted file mode 100644 index 5a03c4700..000000000 --- a/Client/src/common/AMCApplication.js +++ /dev/null @@ -1,1111 +0,0 @@ -/*++ - -Copyright (C) 2020 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - -import * as Axios from "axios"; -import * as asmCrypto from "asmcrypto-lite"; - -import * as Assert from "./AMCAsserts.js"; -import * as Common from "./AMCCommon.js" -import * as GitHash from "./AMCGitHash.js" - -import AMCApplicationModule_Content from "../modules/AMCModule_Content.js" -import AMCApplicationModule_GLScene from "../modules/AMCModule_GLScene.js" -import AMCApplicationModule_Graphic from "../modules/AMCModule_Graphic.js" -import AMCApplicationModule_Grid from "../modules/AMCModule_Grid.js" -import AMCApplicationModule_Tabs from "../modules/AMCModule_Tabs.js" -import AMCApplicationModule_Logs from "../modules/AMCModule_Logs.js" -import AMCApplicationModule_LayerView from "../modules/AMCModule_LayerView.js" -import AMCApplicationModule_Custom from "../modules/AMCModule_Custom.js" - -import AMCApplicationPage from "./AMCPage.js" -import AMCApplicationCustomPage from "./AMCCustomPage.js" -import AMCUpload from "./AMCImplementation_Upload.js" - -import AMCApplicationDialog from "./AMCDialog.js" - -export default class AMCApplication extends Common.AMCObject { - - - constructor(apiBaseURL, uiResizeEvent) { - - super (); - this.registerClass ("amcApplication"); - - console.log ("AMC Client git hash: " + GitHash.getClientGitHash ()); - - this.API = { - baseURL: apiBaseURL, - authToken: Common.nullToken (), - unsuccessfulUpdateCounter: 0, - userUUID: Common.nullUUID (), - userLogin: "", - userDescription: "", - userRole: "", - userLanguage: "", - userPermissions: new Set () - } - - this.AppState = { - currentStatus: "initial", // one of "initial" / "login" / "ready" / "error", - currentError: "", - activePage: "", - appResizeEvent: uiResizeEvent, - WebGLInstances: new Map() - } - - this.AppDefinition = { - TextApplicationName: "", - ToolbarLogoUUID: "", - TextCopyRight: "", - MainPage: "", - LogoUUID: "", - LogoAspectRatio: 1.0, - LoginBackgroundImageUUID: "", - LoginWelcomeMessage: "", - FirstLaunchMode: false, - Colors: {} - } - - this.AppContent = { - MenuItems: [], - ToolbarItems: [], - Pages: [], - CustomPages: [], - Dialogs: [], - PageMap: new Map(), - CustomPageMap: new Map(), - DialogMap: new Map(), - ModuleMap: new Map(), - ItemMap: new Map(), - FormEntityMap: new Map() - } - - this.SnackBar = { - Visible: false, - Timeout: -1, - Text: "", - Color: "secondary", - FontColor: "white" - } - - } - - setStatus(newStatus) { - this.AppState.currentStatus = newStatus; - this.AppState.currentError = ""; - if (this.AppState.appResizeEvent) - this.AppState.appResizeEvent (); - } - - setStatusToError(message) { - this.AppState.currentStatus = "error"; - this.AppState.currentError = message; - this.closeAllDialogs(); - } - - axiosGetRequest(subURL) { - let headers = {} - let authToken = this.API.authToken; - - if (authToken != Common.nullToken ()) - headers.Authorization = "Bearer " + authToken; - - return Axios({ - method: "GET", - "headers": headers, - url: this.API.baseURL + subURL - }); - } - - axiosGetArrayBufferRequest(subURL) { - let headers = {} - let authToken = this.API.authToken; - - if (authToken != Common.nullToken ()) - headers.Authorization = "Bearer " + authToken; - - return Axios({ - method: "GET", - "headers": headers, - "responseType": "arraybuffer", - url: this.API.baseURL + subURL - }); - } - - - axiosPostRequest(subURL, data) { - let headers = {} - let authToken = this.API.authToken; - - if (authToken != Common.nullToken ()) - headers.Authorization = "Bearer " + authToken; - - return Axios({ - "method": "POST", - "url": this.API.baseURL + subURL, - "headers": headers, - "data": data - }); - } - - axiosPostFormData(subURL, formData) { - let headers = { - "Content-Type": "multipart/form-data" - } - let authToken = this.API.authToken; - - if (authToken != Common.nullToken ()) - headers.Authorization = "Bearer " + authToken; - - return Axios({ - "method": "POST", - "url": this.API.baseURL + subURL, - "headers": headers, - "data": formData - }); - } - - retrieveConfiguration(vuetifythemes) { - this.axiosGetRequest("/ui/config") - .then(resultJSON => { - this.AppDefinition.TextApplicationName = resultJSON.data.appname; - this.AppDefinition.TextCopyRight = resultJSON.data.copyright; - this.AppDefinition.MainPage = resultJSON.data.mainpage; - this.AppDefinition.LogoUUID = resultJSON.data.logouuid; - this.AppDefinition.LoginBackgroundImageUUID = resultJSON.data.loginbackgrounduuid; - this.AppDefinition.ToolbarLogoUUID = resultJSON.data.toolbarlogouuid; - this.AppDefinition.LoginWelcomeMessage = resultJSON.data.loginwelcomemessage; - - this.AppDefinition.LogoAspectRatio = resultJSON.data.logoaspectratio; - if (resultJSON.data.colors) { - this.AppDefinition.Colors = resultJSON.data.colors; - } else { - this.AppDefinition.Colors = {}; - } - this.setStatus("login"); - - document.title = this.AppDefinition.TextApplicationName; - - if (vuetifythemes) { - if (this.AppDefinition.Colors.primary) - vuetifythemes.light.primary = this.AppDefinition.Colors.primary; - if (this.AppDefinition.Colors.secondary) - vuetifythemes.light.secondary = this.AppDefinition.Colors.secondary; - if (this.AppDefinition.Colors.accent) - vuetifythemes.light.accent = this.AppDefinition.Colors.accent; - if (this.AppDefinition.Colors.error) - vuetifythemes.light.error = this.AppDefinition.Colors.error; - } - - this.changePage(this.AppDefinition.MainPage); - }) - .catch(err => { - this.setStatusToError(err.response.data.message); - }); - } - - performLogout() { - this.API.authToken = Common.nullToken (); - this.API.unsuccessfulUpdateCounter = 0; - this.API.userUUID = Common.nullUUID (); - this.API.userLogin = ""; - this.API.userDescription = ""; - this.API.userRole = ""; - this.API.userLanguage = ""; - this.API.userPermissions = new Set (); - } - - requestLogin(userName, userPassword) { - - this.performLogout (); - - this.axiosPostRequest("/auth/", { - "username": userName - }) - .then(resultCreateSession => { - - let sessionuuid = resultCreateSession.data.sessionuuid; - let sessionkey = resultCreateSession.data.sessionkey; - let loginsalt = resultCreateSession.data.loginsalt; - let clientkey = sessionkey; - - let saltedpassword = asmCrypto.SHA256.hex(loginsalt + userPassword); - let clientkeyhash = asmCrypto.SHA256.hex(clientkey + saltedpassword); - let sessionkeyhash = asmCrypto.SHA256.hex(sessionkey + clientkeyhash); - - this.axiosPostRequest("/auth/" + sessionuuid, { - "clientkey": clientkey, - "password": sessionkeyhash - }) - - .then(resultAuthenticate => { - this.API.authToken = Assert.SHA256Value (resultAuthenticate.data.token); - this.API.userUUID = Assert.UUIDValue (resultAuthenticate.data.useruuid); - this.API.userLogin = Assert.IdentifierString (resultAuthenticate.data.userlogin); - this.API.userDescription = Assert.StringValue (resultAuthenticate.data.userdescription); - this.API.userRole = Assert.IdentifierString (resultAuthenticate.data.userrole); - //this.API.userLanguage = Assert.IdentifierString (resultAuthenticate.data.userlanguage); - this.API.userPermissions = new Set (); - - let permissionArray = Assert.ArrayValue (resultAuthenticate.data.userpermissions); - for (let permission of permissionArray) { - this.API.userPermissions.add (permission); - } - - this.setStatus("ready"); - - this.retrieveStateUpdate(); - - }) - .catch(err => { - if (err.response) { - this.setStatusToError(err.response.data.message.toString ()); - } else { - this.setStatusToError(err.toString ()); - } - }); - - }) - .catch(err => { - if (err.response) { - this.setStatusToError(err.response.data.message.toString ()); - } else { - this.setStatusToError(err.toString ()); - } - }); - - } - - - createModuleInstance (page, moduleDefinitionJSON) - { - Assert.ObjectValue (moduleDefinitionJSON); - Assert.ObjectInstance (page, "amcPage"); - - if (moduleDefinitionJSON.type === "content") - return new AMCApplicationModule_Content (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "glscene") - return new AMCApplicationModule_GLScene (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "graphic") - return new AMCApplicationModule_Graphic (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "grid") - return new AMCApplicationModule_Grid (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "tabs") - return new AMCApplicationModule_Tabs (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "logs") - return new AMCApplicationModule_Logs (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "layerview") - return new AMCApplicationModule_LayerView (page, moduleDefinitionJSON); - - if (moduleDefinitionJSON.type === "custom") - return new AMCApplicationModule_Custom (page, moduleDefinitionJSON); - - return null; - - } - - - addModule (moduleInstance) { - if (moduleInstance && moduleInstance.uuid) { - this.AppContent.ModuleMap.set (moduleInstance.uuid, moduleInstance); - - } - } - - addItem (item) { - if (item && item.uuid) { - this.AppContent.ItemMap.set (item.uuid, item); - } - } - - - retrieveStateUpdate() { - - this.axiosGetRequest("/ui/state") - - .then(resultJSON => { - - this.AppContent.Pages = []; - this.AppContent.CustomPages = []; - this.AppContent.Dialogs = []; - this.AppContent.PageMap.clear (); - this.AppContent.CustomPageMap.clear (); - this.AppContent.DialogMap.clear (); - this.AppContent.ModuleMap.clear (); - this.AppContent.ItemMap.clear (); - - this.AppContent.MenuItems = resultJSON.data.menuitems; - this.AppContent.ToolbarItems = resultJSON.data.toolbaritems; - - for (let pageJSON of resultJSON.data.pages) { - - let page = new AMCApplicationPage (this, pageJSON); - this.AppContent.Pages.push (page); - this.AppContent.PageMap.set(page.name, page); - } - - if (resultJSON.data.custompages) { - for (let customPageJSON of resultJSON.data.custompages) { - - let custompage = new AMCApplicationCustomPage (this, customPageJSON); - - //alert (custompage.component); - - this.AppContent.CustomPages.push (custompage); - this.AppContent.CustomPageMap.set(custompage.name, custompage); - - } - } - - - for (let dialogJSON of resultJSON.data.dialogs) { - let dialog = new AMCApplicationDialog (this, dialogJSON); - this.AppContent.Dialogs.push (dialog); - this.AppContent.DialogMap.set(dialog.name, dialog); - - } - - }) - .catch(err => { - if (err.response) { - this.setStatusToError(err.response.data.message.toString ()); - } else { - this.setStatusToError(err.toString ()); - } - }); - } - - - - updateContentItem(item) { - - if (!item) - return; - - item.refresh = false; - - if (item.isActive ()) { - - let headers = {} - let authToken = this.API.authToken; - - if (authToken != Common.nullToken ()) - headers.Authorization = "Bearer " + authToken; - - let stateidstring = ""; - if (item.stateid > 0) - stateidstring = "/" + item.stateid; - - let url = this.API.baseURL + "/ui/contentitem/" + Assert.UUIDValue (item.uuid) + stateidstring; - Axios({ - method: "GET", - "headers": headers, - url: url - }) - .then(resultJSON => { - - if (resultJSON.data) { - if (resultJSON.data.content) { - item.updateFromJSON (resultJSON.data.content); - } - } - - this.unsuccessfulUpdateCounter = 0; - item.setRefreshFlag (); - - }) - .catch(err => { - - this.unsuccessfulUpdateCounter = this.unsuccessfulUpdateCounter + 1; - if (this.unsuccessfulUpdateCounter > 5) { - this.setStatusToError(err.message); - } else { - item.setRefreshFlag (); - } - - }); - - } - - } - - - updateContentItems() { - - let uuid, item; - - if (this.AppContent.ItemMap) { - - for ([uuid, item] of this.AppContent.ItemMap) { - - uuid; - this.updateContentItem(item); - } - - } - - } - - updateModule(module) { - - // Early return if module is invalid - if (!module) - return; - - // Reset refresh flag before attempting update - module.refresh = false; - - if (module.isActive()) { - - // Prepare authorization headers (same policy as for content items) - let headers = {}; - let authToken = this.API.authToken; - - if (authToken != Common.nullToken()) - headers.Authorization = "Bearer " + authToken; - - // Optional state segment - let stateidstring = ""; - if (module.stateid > 0) - stateidstring = "/" + module.stateid; - - // Build request URL for modules - let url = this.API.baseURL + "/ui/module/" + Assert.UUIDValue(module.uuid) + stateidstring; - - Axios({ - method: "GET", - "headers": headers, - url: url - }) - .then(resultJSON => { - - // Update module from server payload (if present) - if (resultJSON.data) { - if (resultJSON.data.content) { - if (module && typeof module.updateFromJSON === "function") { - module.updateFromJSON(resultJSON.data.content); - } - } - } - - // Reset failure counter on success - this.unsuccessfulUpdateCounter = 0; - }) - .catch(err => { - - // Increment failure counter and react accordingly - this.unsuccessfulUpdateCounter = this.unsuccessfulUpdateCounter + 1; - if (this.unsuccessfulUpdateCounter > 5) { - this.setStatusToError(err.message); - } - }); - } - } - - updateModules() { - - let uuid, module; - if (this.AppContent.ModuleMap) { - for ([uuid, module] of this.AppContent.ModuleMap) { - uuid; - this.updateModule(module); - } - } - } - - onJobUploadChunkSuccess (application, uploadObject, chunkData, uploadOffset) { - - Assert.ObjectInstance (application, "amcApplication"); - Assert.ObjectInstance (uploadObject, "amcUpload"); - Assert.IntegerValue (uploadOffset); - - if (!uploadObject.checkIfUploadIsActive()) - return; - - uploadObject.setStateMessageToProgress (); - - const formData = new FormData(); - formData.append("size", chunkData.byteLength); - formData.append("offset", uploadOffset); - formData.append("data", new Blob([chunkData], { - type: "application/3mf" - }), uploadObject.getFileName ()); - - application.axiosPostFormData("/upload/" + uploadObject.streamuuid, formData) - .then(resultUploadHandle => { - - if (!uploadObject.checkIfUploadIsActive()) - return; - - resultUploadHandle; - if (!uploadObject.readChunk (application, application.onJobUploadChunkSuccess)) { - - let checkSum = uploadObject.calculateChecksum (); - - uploadObject.setStateMessageToWaiting (); - - application.axiosPostRequest("/upload/" + uploadObject.streamuuid + "/finish", { - "streamuuid": uploadObject.streamuuid, - "context": "build", - "sha256": checkSum - }) - .then(resultUploadFinish => { - - uploadObject.clearUploadState (); - - if (uploadObject.hasSuccessEvent ()) { - - let contextuuid = Assert.UUIDValue (resultUploadFinish.data.contextuuid); - - let itemuuid = uploadObject.getItemUUID (); - let eventValues = {} - eventValues[itemuuid] = contextuuid; - - application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); - } - - /*uploadObject.setStateMessageToPreparing (); - - application.axiosPostRequest("/build/prepare", { - "builduuid": uploadObject.contextuuid, - }) - .then(resultBuildPrepare => { - - if (!uploadObject.checkIfUploadIsActive()) - return; - - resultBuildPrepare; - uploadObject.clearUploadState (); - - if (uploadObject.hasSuccessEvent ()) { - - let itemuuid = uploadObject.getItemUUID (); - let eventValues = {} - eventValues[itemuuid] = contextuuid; - - application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); - } - - }) - .catch(err => { - err; -// if (failureevent) - //this.triggerUIEvent(failureevent, itemuuid, {}); - }); */ - }) - - - } - }) - .catch(err => { - err; - }); - - - } - - - performJobUpload(itemState, successEventName, failureEventName) { - - Assert.ObjectInstance (itemState, "amcUploadState"); - - let chosenfile = itemState.getChosenFile (); - - this.axiosPostRequest("/upload/", { - "context": "build", - "name": chosenfile.name, - "size": chosenfile.size, - "mimetype": itemState.getMimeType (), - }) - - .then(resultUploadInit => { - - Assert.ObjectValue (resultUploadInit); - Assert.ObjectValue (resultUploadInit.data); - let streamuuid = Assert.UUIDValue (resultUploadInit.data.streamuuid); - - let currentUpload = new AMCUpload (itemState, streamuuid); - currentUpload.setSuccessEvent (successEventName); - currentUpload.setFailureEvent (failureEventName); - - currentUpload.readChunk (this, this.onJobUploadChunkSuccess); - - - }) - .catch(err => { - err; -/* if (failureeventname) - this.triggerUIEvent(failureeventname, itemuuid, {}); */ - }); - - } - - - onImageUploadChunkSuccess (application, uploadObject, chunkData, uploadOffset) { - - Assert.ObjectInstance (application, "amcApplication"); - Assert.ObjectInstance (uploadObject, "amcUpload"); - Assert.IntegerValue (uploadOffset); - - if (!uploadObject.checkIfUploadIsActive()) - return; - - uploadObject.setStateMessageToProgress (); - - const formData = new FormData(); - formData.append("size", chunkData.byteLength); - formData.append("offset", uploadOffset); - formData.append("data", new Blob([chunkData], { - type: "application/3mf" - }), uploadObject.getFileName ()); - - application.axiosPostFormData("/upload/" + uploadObject.streamuuid, formData) - .then(resultUploadHandle => { - - if (!uploadObject.checkIfUploadIsActive()) - return; - - resultUploadHandle; - if (!uploadObject.readChunk (application, application.onImageUploadChunkSuccess)) { - - let checkSum = uploadObject.calculateChecksum (); - - uploadObject.setStateMessageToWaiting (); - - application.axiosPostRequest("/upload/finish", { - "streamuuid": uploadObject.streamuuid, - "context": "image", - "sha256": checkSum - }) - .then(resultUploadFinish => { - - uploadObject.clearUploadState (); - - if (uploadObject.hasSuccessEvent ()) { - - let contextuuid = Assert.UUIDValue (resultUploadFinish.data.contextuuid); - - let itemuuid = uploadObject.getItemUUID (); - let eventValues = {} - eventValues[itemuuid] = contextuuid; - - application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); - } - - - /*uploadObject.setStateMessageToPreparing (); - - application.axiosPostRequest("/build/prepare", { - "builduuid": uploadObject.contextuuid, - }) - .then(resultBuildPrepare => { - - if (!uploadObject.checkIfUploadIsActive()) - return; - - resultBuildPrepare; - uploadObject.clearUploadState (); - - if (uploadObject.hasSuccessEvent ()) { - - let itemuuid = uploadObject.getItemUUID (); - let eventValues = {} - eventValues[itemuuid] = uploadObject.contextuuid; - - application.triggerUIEvent(uploadObject.getSuccessEvent (), itemuuid, eventValues); - } - - }) - .catch(err => { - err; -// if (failureevent) - //this.triggerUIEvent(failureevent, itemuuid, {}); - }); */ - }) - - - } - }) - .catch(err => { - err; - }); - - - } - - - - performImageUpload(itemState, successEventName, failureEventName) { - - Assert.ObjectInstance (itemState, "amcUploadState"); - - let chosenfile = itemState.getChosenFile (); - - this.axiosPostRequest("/upload/", { - "context": "build", - "name": chosenfile.name, - "size": chosenfile.size, - "mimetype": itemState.getMimeType (), - }) - - .then(resultUploadInit => { - - Assert.ObjectValue (resultUploadInit); - Assert.ObjectValue (resultUploadInit.data); - let streamuuid = Assert.UUIDValue (resultUploadInit.data.streamuuid); - - let currentUpload = new AMCUpload (itemState, streamuuid); - currentUpload.setSuccessEvent (successEventName); - currentUpload.setFailureEvent (failureEventName); - - //let reader = new FileReader(); - currentUpload.readChunk (this, this.onImageUploadChunkSuccess); - - - }) - .catch(err => { - err; -/* if (failureeventname) - this.triggerUIEvent(failureeventname, itemuuid, {}); */ - }); - - - } - - - changePage(page) { - - let pageString = String(page); - this.AppState.activePage = pageString; - - let pageObject = this.AppContent.PageMap.get(pageString); - if(pageObject) { - pageObject.setActive(); - } - - if (this.AppState.appResizeEvent) - this.AppState.appResizeEvent (); - - this.updateContentItems (); - - } - - closeAllDialogs() { - let dialog; - for (dialog of this.AppContent.Dialogs) { - dialog.dialogIsActive = false; - } - } - - showDialog(dialog) { - - this.closeAllDialogs(); - - if (dialog) { - - if (this.AppContent.DialogMap.has(dialog)) { - let dialogObject = this.AppContent.DialogMap.get(dialog); - dialogObject.dialogIsActive = true; - } - } - - if (this.AppState.appResizeEvent) - this.AppState.appResizeEvent (); - - this.updateContentItems (); - - } - - streamDownload (downloadticketuuid) - { - - - /*// Start download in Browser - const a = document.createElement('a'); - a.href = this.getDownloadURL (downloadticketuuid); - a.download = downloadfilename; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); */ - - window.open (this.getDownloadURL (downloadticketuuid), "_blank"); - - } - - getImageURL(uuid) { - return this.API.baseURL + '/ui/image/' + uuid; - } - - getChartURL(uuid) { - return this.API.baseURL + '/ui/chart/' + uuid; - } - - getDownloadURL(uuid) { - return this.API.baseURL + '/ui/download/' + uuid; - } - - triggerUIEvent(eventname, senderuuid, eventValues, executionCallback) { - - this.axiosPostRequest("/ui/event", { - "eventname": eventname, - "senderuuid": senderuuid, - "formvalues": eventValues - }) - .then(resultHandleEvent => { - - if (resultHandleEvent.data.actions) { - if (Array.isArray(resultHandleEvent.data.actions)) { - let action; - for (action of resultHandleEvent.data.actions) { - if (action.action === "activatemodaldialog") { - this.showDialog(action.dialogname); - } - if (action.action === "activatepage") { - this.changePage(action.pagename); - } - if (action.action === "closemodaldialog") { - this.closeAllDialogs(); - } - if (action.action === "streamdownload") { - this.streamDownload(action.downloadticket); - } - - //this.updateContentItemResult(item.uuid, item); - } - } - } - - if (executionCallback) { - executionCallback (); - } - - }) - .catch(err => { - console.log(err); - }); - } - - triggerWidgetRequest (widgetuuid, requestType, requestJSON, executionCallback) { - - - this.axiosPostRequest("/ui/widget/" + Assert.UUIDValue (widgetuuid) + "/" + Assert.StringValue (requestType), Assert.ObjectValue (requestJSON)) - .then(resultHandleWidgetRequest => { - - if (resultHandleWidgetRequest.data.actions) { - if (Array.isArray(resultHandleWidgetRequest.data.actions)) { - let action; - for (action of resultHandleWidgetRequest.data.actions) { - if (action.action === "activatemodaldialog") { - this.showDialog(action.dialogname); - } - if (action.action === "activatepage") { - this.changePage(action.pagename); - } - if (action.action === "closemodaldialog") { - this.closeAllDialogs(); - } - if (action.action === "streamdownload") { - this.streamDownload(action.downloadticket); - } - - //this.updateContentItemResult(item.uuid, item); - } - } - } - - if (executionCallback) { - executionCallback (); - } - - }) - .catch(err => { - console.log(err); - }); - } - - assembleFormValues(formValueUUIDList) { - - - Assert.ArrayValue (formValueUUIDList); - - let resultObject = {} - for (let entityUUID of formValueUUIDList) { - - if (this.AppContent.FormEntityMap.has (entityUUID)) { - let entity = this.AppContent.FormEntityMap.get (entityUUID); - if (entity.dataObject) { - let formValue = entity.dataObject.value; - resultObject[entityUUID] = formValue; - } - } - } - - return resultObject; - - } - - retrieveWebGLInstance(uuid) { - return this.AppState.WebGLInstances[uuid]; - } - - storeWebGLInstance(uuid, instance) { - this.AppState.WebGLInstances[uuid] = instance; - } - - findPage (pageName) { - - if (this.PageMap.has (pageName)) - return this.PageMap.get (pageName); - - return null; - - } - - findCustomPage (pageName) { - - if (this.CustomPageMap.has (pageName)) - return this.CustomPageMap.get (pageName); - - return null; - - } - - userIsLoggedIn () - { - return (this.API.authToken !== Common.nullToken ()); - } - - userUUID () - { - if (!this.userIsLoggedIn ()) - throw "could not get user UUID: user is not logged in"; - - return this.API.userUUID; - } - - userLogin () - { - if (!this.userIsLoggedIn ()) - throw "could not get user login: user is not logged in"; - - return this.API.userLogin; - } - - userDescription () - { - if (!this.userIsLoggedIn ()) - throw "could not get user description: user is not logged in"; - - return this.API.userDescription; - } - - userRole () - { - if (!this.userIsLoggedIn ()) - throw "could not get user role: user is not logged in"; - - return this.API.userRole; - } - - userLanguage () - { - if (!this.userIsLoggedIn ()) - throw "could not get user language: user is not logged in"; - - return this.API.userLanguage; - } - - userPermissions () - { - if (!this.userIsLoggedIn ()) - throw "could not get user permissions: user is not logged in"; - - return new Set(this.API.userPermissions); - } - - checkPermission (permissionIdentifier) - { - if (!this.userIsLoggedIn ()) - return false; - - return this.API.userPermissions.has (Assert.IdentifierString (permissionIdentifier)); - } - - generateUserPassword (clearTextPassword) - { - if (!clearTextPassword.isString ()) - throw "could not set user password: invalid input string"; - - let trimmedPassword = clearTextPassword.trim (); - - if (trimmedPassword.length < Common.minimumPasswordLength ()) - throw "could not set user password: invalid user password length"; - - if (!this.userIsLoggedIn ()) - throw "could not get user permissions: user is not logged in"; - - const randomArray = new Uint32Array(1024); - asmCrypto.random.getValues( randomArray ); - - let randomString = this.API.authToken; - for (let value in randomArray) - randomString = randomString + value.toString (); - - let passwordSalt = asmCrypto.SHA256.hex(randomString); - let passwordHash = asmCrypto.SHA256.hex(passwordSalt + trimmedPassword); - - return { - "salt": passwordSalt, - "hash": passwordHash - } - - } - - pageIsActive (page) - { - if (page) { - - if (page.isAlwaysActive) - return true; - - return page.name === this.AppState.activePage; - } - - return false; - } - - -} diff --git a/Client/src/dialogs/Dialog_Login.vue b/Client/src/dialogs/Dialog_Login.vue deleted file mode 100644 index 59895830d..000000000 --- a/Client/src/dialogs/Dialog_Login.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_Content.js b/Client/src/modules/AMCModule_Content.js deleted file mode 100644 index ab7fb66d0..000000000 --- a/Client/src/modules/AMCModule_Content.js +++ /dev/null @@ -1,126 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -import AMCApplicationItem_Content_AlertList from "./AMCModule_ContentItem_AlertList.js" -import AMCApplicationItem_Content_BuildList from "./AMCModule_ContentItem_BuildList.js" -import AMCApplicationItem_Content_ButtonGroup from "./AMCModule_ContentItem_ButtonGroup.js" -import AMCApplicationItem_Content_Chart from "./AMCModule_ContentItem_Chart.js" -import AMCApplicationItem_Content_ExecutionList from "./AMCModule_ContentItem_ExecutionList.js" -import AMCApplicationItem_Content_Form from "./AMCModule_ContentItem_Form.js" -import AMCApplicationItem_Content_Image from "./AMCModule_ContentItem_Image.js" -import AMCApplicationItem_Content_Paragraph from "./AMCModule_ContentItem_Paragraph.js" -import AMCApplicationItem_Content_ParameterList from "./AMCModule_ContentItem_ParameterList.js" -import AMCApplicationItem_Content_Upload from "./AMCModule_ContentItem_Upload.js" -import AMCApplicationItem_Content_ConfigurationList from "./AMCModule_ContentItem_ConfigurationList.js" - - - -export default class AMCApplicationModule_Content extends Common.AMCApplicationModule { - - constructor (page, moduleJSON) - { - Assert.ObjectValue (moduleJSON); - Assert.ArrayValue (moduleJSON.items); - - super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); - this.registerClass ("amcModule_Content"); - - this.headline = Assert.StringValue (moduleJSON.headline); - this.title = Assert.StringValue (moduleJSON.title); - this.subtitle = Assert.StringValue (moduleJSON.subtitle); - - this.visible = Assert.BoolValue (moduleJSON.visible); - - this.items = []; - - - for (let itemJSON of moduleJSON.items) { - - let item = null; - - if (itemJSON.type === "parameterlist") - item = new AMCApplicationItem_Content_ParameterList (this, itemJSON); - - if (itemJSON.type === "upload") - item = new AMCApplicationItem_Content_Upload (this, itemJSON); - - if (itemJSON.type === "buildlist") - item = new AMCApplicationItem_Content_BuildList (this, itemJSON); - - if (itemJSON.type === "executionlist") - item = new AMCApplicationItem_Content_ExecutionList (this, itemJSON); - - if (itemJSON.type === "alertlist") - item = new AMCApplicationItem_Content_AlertList (this, itemJSON); - - if (itemJSON.type === "buttongroup") - item = new AMCApplicationItem_Content_ButtonGroup (this, itemJSON); - - if (itemJSON.type === "paragraph") - item = new AMCApplicationItem_Content_Paragraph (this, itemJSON); - - if (itemJSON.type === "image") - item = new AMCApplicationItem_Content_Image (this, itemJSON); - - if (itemJSON.type === "chart") - item = new AMCApplicationItem_Content_Chart (this, itemJSON); - - if (itemJSON.type === "form") - item = new AMCApplicationItem_Content_Form (this, itemJSON); - - if (itemJSON.type === "configurationlist") - item = new AMCApplicationItem_Content_ConfigurationList (this, itemJSON); - - if (item) { - this.items.push (item); - this.page.addItem (item); - } else { - throw "Item type not found: " + itemJSON.type; - } - - } - - } - - updateFromJSON(updateJSON) { - - Assert.ObjectValue(updateJSON); - - if(updateJSON.visible !== undefined) - this.visible = Assert.BoolValue(updateJSON.visible); - } - -} - diff --git a/Client/src/modules/AMCModule_Content.vue b/Client/src/modules/AMCModule_Content.vue deleted file mode 100644 index 3fe1c27e1..000000000 --- a/Client/src/modules/AMCModule_Content.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_BuildList.js b/Client/src/modules/AMCModule_ContentItem_BuildList.js deleted file mode 100644 index afd62bfea..000000000 --- a/Client/src/modules/AMCModule_ContentItem_BuildList.js +++ /dev/null @@ -1,139 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_BuildList extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_BuildList"); - - this.entries = []; - - this.headers = []; - for (let header of itemJSON.headers) { - let checkedHeader = { - "text": header.text, - "value": header.value, - "sortable": header.sortable, - "width": header.width - } - - this.headers.push(checkedHeader); - } - - this.entrybuttons = []; - if (itemJSON.entrybuttons) { - for (let entrybutton of itemJSON.entrybuttons) { - - let checkedEntryButton = { - "uuid": entrybutton.uuid, - "caption": entrybutton.caption, - "color": entrybutton.color, - "cursor": entrybutton.cursor, - "selectevent": entrybutton.selectevent - } - - this.entrybuttons.push(checkedEntryButton); - } - } - - - this.loadingtext = ""; - this.selectevent = ""; - this.selectionvalueuuid = Common.nullUUID (); - this.buttonvalueuuid = Common.nullUUID (); - this.thumbnailaspectratio = 1.8; - this.thumbnailheight = "150pt"; - this.thumbnailwidth = ""; - this.entriesperpage = 25; - - /* this.entrybuttons = [ - { - uuid: "123", - caption: "Details", - color: "primary", - cursor: "cursor-pointer", - selectionvalueuuid: Common.nullUUID (), - selectevent: "12324353", - - }, - { - uuid: "234", - caption: "History", - color: "primary", - cursor: "cursor-pointer", - selectionvalueuuid: Common.nullUUID (), - selectevent: "12324353", - } - ]; */ - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - - } - - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - Assert.ArrayValue (updateJSON.entries); - - if (updateJSON.loadingtext) - this.loadingtext = Assert.StringValue (updateJSON.loadingtext); - if (updateJSON.selectevent) - this.selectevent = Assert.IdentifierString (updateJSON.selectevent); - if (updateJSON.selectionvalueuuid) - this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); - if (updateJSON.buttonvalueuuid) - this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); - if (updateJSON.entriesperpage) - this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); - - let oldEntryCount = this.entries.length; - for (let index = 0; index < oldEntryCount; index++) { - this.entries.pop(); - } - - for (let entry of updateJSON.entries) { - this.entries.push(entry); - } - - } - - -} diff --git a/Client/src/modules/AMCModule_ContentItem_BuildList.vue b/Client/src/modules/AMCModule_ContentItem_BuildList.vue deleted file mode 100644 index 5d2896617..000000000 --- a/Client/src/modules/AMCModule_ContentItem_BuildList.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_ButtonGroup.js b/Client/src/modules/AMCModule_ContentItem_ButtonGroup.js deleted file mode 100644 index c187e2f1d..000000000 --- a/Client/src/modules/AMCModule_ContentItem_ButtonGroup.js +++ /dev/null @@ -1,90 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_ButtonGroup extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_ButtonGroup"); - - Assert.ArrayValue (itemJSON.buttons); - // TODO: parse input - this.buttons = itemJSON.buttons; - - this.buttoncssstyle = ""; - this.cssstyle = ""; - - if (itemJSON.buttondistribution == "rightaligned") { - this.cssstyle = this.cssstyle + "text-align: right;"; - } - - if (itemJSON.buttondistribution == "leftaligned") { - this.cssstyle = this.cssstyle + "text-align: left;"; - } - - if (itemJSON.buttondistribution == "centered") { - this.cssstyle = this.cssstyle + "text-align: centered;"; - } - - if (itemJSON.buttondistribution == "equal") { - - let buttoncount = this.buttons.length; - if (buttoncount > 0) { - this.buttoncssstyle = this.buttoncssstyle + "min-width: calc(" + (100.0 / buttoncount) + "% - 10px);"; - } - - this.cssstyle = this.cssstyle + "text-align: center;"; - } - - this.setRefreshFlag (); - - - } - - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - - if (updateJSON.buttons) { - // TODO: parse input - this.buttons = updateJSON.buttons; - } - - } - -} diff --git a/Client/src/modules/AMCModule_ContentItem_Chart.js b/Client/src/modules/AMCModule_ContentItem_Chart.js deleted file mode 100644 index 435d20ca6..000000000 --- a/Client/src/modules/AMCModule_ContentItem_Chart.js +++ /dev/null @@ -1,114 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default - -class AMCApplicationItem_Content_Chart extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Chart"); - - this.dataseries = Common.nullUUID (); - this.version = 0; - this.loadeddataseries = Common.nullUUID (); - this.loadedversion = 0; - - this.onChartDataUpdated = null; - this.chartData = []; - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - } - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - - this.dataseries = Assert.UUIDValue (updateJSON.dataseries); - if (updateJSON.version) { - this.version = Assert.IntegerValue (updateJSON.version); - } else { - this.version = 0; - } - - if ((this.loadeddataseries != this.dataseries) || (this.loadedversion != this.version)) { - this.loadeddataseries = this.dataseries; - this.loadedversion = this.version; - this.refreshChartData (); - } - - } - - - refreshChartData () - { - let application = this.getApplication (); - let normalizedUUID = this.dataseries; - - application.axiosGetArrayBufferRequest("/ui/chart/" + normalizedUUID) - .then(responseData => { - var floatView = new Float32Array(responseData.data); - let dataLength = floatView.length; - let pointCount = dataLength / 2; - - this.chartData = []; - for (let index = 0; index < pointCount; index++) { - let xvalue = floatView[index * 2]; - let yvalue = floatView[index * 2 + 1]; - this.chartData.push ([xvalue, yvalue]); - } - - if (this.onChartDataUpdated) - this.onChartDataUpdated (); - - }) - .catch(err => { - this.loadeddataseries = Common.nullUUID (); - - if (err.response) { - console.log (err.response); - } else { - console.log ("fatal error while retrieving chart data " + normalizedUUID); - } - }); - - } - -} \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_ConfigurationList.js b/Client/src/modules/AMCModule_ContentItem_ConfigurationList.js deleted file mode 100644 index 7185250ea..000000000 --- a/Client/src/modules/AMCModule_ContentItem_ConfigurationList.js +++ /dev/null @@ -1,140 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_ConfigurationList extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_ConfigurationList"); - - this.entries = []; - - this.headers = []; - for (let header of itemJSON.headers) { - let checkedHeader = { - "text": header.text, - "value": header.value, - "sortable": header.sortable, - "width": header.width, - "align": header.align - } - - this.headers.push(checkedHeader); - } - - this.entrybuttons = []; - if (itemJSON.entrybuttons) { - for (let entrybutton of itemJSON.entrybuttons) { - - let checkedEntryButton = { - "uuid": entrybutton.uuid, - "caption": entrybutton.caption, - "color": entrybutton.color, - "cursor": entrybutton.cursor, - "selectevent": entrybutton.selectevent - } - - this.entrybuttons.push(checkedEntryButton); - } - } - - - this.loadingtext = ""; - this.selectevent = ""; - this.selectionvalueuuid = Common.nullUUID (); - this.buttonvalueuuid = Common.nullUUID (); - this.thumbnailaspectratio = 1.8; - this.thumbnailheight = "150pt"; - this.thumbnailwidth = ""; - this.entriesperpage = 5; - - /* this.entrybuttons = [ - { - uuid: "123", - caption: "Details", - color: "primary", - cursor: "cursor-pointer", - selectionvalueuuid: Common.nullUUID (), - selectevent: "12324353", - - }, - { - uuid: "234", - caption: "History", - color: "primary", - cursor: "cursor-pointer", - selectionvalueuuid: Common.nullUUID (), - selectevent: "12324353", - } - ]; */ - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - - } - - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - Assert.ArrayValue (updateJSON.entries); - - if (updateJSON.loadingtext) - this.loadingtext = Assert.StringValue (updateJSON.loadingtext); - if (updateJSON.selectevent) - this.selectevent = Assert.IdentifierString (updateJSON.selectevent); - if (updateJSON.selectionvalueuuid) - this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); - if (updateJSON.buttonvalueuuid) - this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); - if (updateJSON.entriesperpage) - this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); - - let oldEntryCount = this.entries.length; - for (let index = 0; index < oldEntryCount; index++) { - this.entries.pop(); - } - - for (let entry of updateJSON.entries) { - this.entries.push(entry); - } - - } - - -} diff --git a/Client/src/modules/AMCModule_ContentItem_ConfigurationList.vue b/Client/src/modules/AMCModule_ContentItem_ConfigurationList.vue deleted file mode 100644 index 2e2219947..000000000 --- a/Client/src/modules/AMCModule_ContentItem_ConfigurationList.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_ExecutionList.js b/Client/src/modules/AMCModule_ContentItem_ExecutionList.js deleted file mode 100644 index add414862..000000000 --- a/Client/src/modules/AMCModule_ContentItem_ExecutionList.js +++ /dev/null @@ -1,119 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_ExecutionList extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_ExecutionList"); - - this.entries = []; - - this.headers = []; - for (let header of itemJSON.headers) { - let checkedHeader = { - "text": header.text, - "value": header.value, - "sortable": header.sortable, - "width": header.width - } - - this.headers.push(checkedHeader); - } - - this.entrybuttons = []; - if (itemJSON.entrybuttons) { - for (let entrybutton of itemJSON.entrybuttons) { - - let checkedEntryButton = { - "uuid": entrybutton.uuid, - "caption": entrybutton.caption, - "color": entrybutton.color, - "cursor": entrybutton.cursor, - "selectevent": entrybutton.selectevent - } - - this.entrybuttons.push(checkedEntryButton); - } - } - - - this.loadingtext = ""; - this.selectevent = ""; - this.selectionvalueuuid = Common.nullUUID (); - this.buttonvalueuuid = Common.nullUUID (); - this.thumbnailaspectratio = 1.8; - this.thumbnailheight = "150pt"; - this.thumbnailwidth = ""; - this.entriesperpage = 25; - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - - } - - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - Assert.ArrayValue (updateJSON.entries); - - if (updateJSON.loadingtext) - this.loadingtext = Assert.StringValue (updateJSON.loadingtext); - if (updateJSON.selectevent) - this.selectevent = Assert.IdentifierString (updateJSON.selectevent); - if (updateJSON.selectionvalueuuid) - this.selectionvalueuuid = Assert.IdentifierString (updateJSON.selectionvalueuuid); - if (updateJSON.buttonvalueuuid) - this.buttonvalueuuid = Assert.IdentifierString (updateJSON.buttonvalueuuid); - if (updateJSON.entriesperpage) - this.entriesperpage = Assert.IntegerValue (updateJSON.entriesperpage); - - let oldEntryCount = this.entries.length; - for (let index = 0; index < oldEntryCount; index++) { - this.entries.pop(); - } - - for (let entry of updateJSON.entries) { - this.entries.push(entry); - } - - } - - -} diff --git a/Client/src/modules/AMCModule_ContentItem_ExecutionList.vue b/Client/src/modules/AMCModule_ContentItem_ExecutionList.vue deleted file mode 100644 index 65c61e251..000000000 --- a/Client/src/modules/AMCModule_ContentItem_ExecutionList.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_Form.js b/Client/src/modules/AMCModule_ContentItem_Form.js deleted file mode 100644 index 6a03f6225..000000000 --- a/Client/src/modules/AMCModule_ContentItem_Form.js +++ /dev/null @@ -1,115 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_Form extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Form"); - - this.visible = true; - - Assert.ArrayValue (itemJSON.entities); - // TODO: parse input - this.entities = itemJSON.entities; - - for (let entity of this.entities) { - - entity.dataObject = { - uuid: entity.uuid, - value: entity.value, - remotevalue: entity.value, - disabled: entity.disabled, - readonly: entity.readonly, - changeevent: entity.changeevent, - validation: entity.validation, - validationmessage: entity.validationmessage, - minvalue: entity.minvalue, - maxvalue: entity.maxvalue, - isProgrammaticChange: false - - }; - - this.moduleInstance.page.application.AppContent.FormEntityMap.set (entity.uuid, entity); - } - - this.setRefreshFlag (); - - } - - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - - this.setVisible(updateJSON.visible); - - if (updateJSON.entities) { - Assert.ArrayValue (updateJSON.entities); - - for (let entityJSON of updateJSON.entities) { - if (this.moduleInstance.page.application.AppContent.FormEntityMap.has (entityJSON.uuid)) { - let entity = this.moduleInstance.page.application.AppContent.FormEntityMap.get (entityJSON.uuid); - let dataObject = entity.dataObject; - - Assert.ObjectValue (dataObject); - - if (dataObject.remotevalue != entityJSON.value) { - dataObject.value = entityJSON.value; - dataObject.isProgrammaticChange = true; - } else { - dataObject.isProgrammaticChange = false; - } - dataObject.remotevalue = entityJSON.value; - dataObject.prefix = entityJSON.prefix; - dataObject.suffix = entityJSON.suffix; - dataObject.readonly = entityJSON.readonly; - dataObject.disabled = entityJSON.disabled; - dataObject.changeevent = entityJSON.changeevent; - - } - - } - } - - - } - - setVisible(flag) { - this.visible = !!flag; - } -} \ No newline at end of file diff --git a/Client/src/modules/AMCModule_ContentItem_Form.vue b/Client/src/modules/AMCModule_ContentItem_Form.vue deleted file mode 100644 index e45b81185..000000000 --- a/Client/src/modules/AMCModule_ContentItem_Form.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - diff --git a/Client/src/modules/AMCModule_ContentItem_Paragraph.js b/Client/src/modules/AMCModule_ContentItem_Paragraph.js deleted file mode 100644 index 2b61a2052..000000000 --- a/Client/src/modules/AMCModule_ContentItem_Paragraph.js +++ /dev/null @@ -1,48 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -export default class AMCApplicationItem_Content_Paragraph extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Paragraph"); - - this.text = itemJSON.text; - - } - -} diff --git a/Client/src/modules/AMCModule_ContentItem_Upload.js b/Client/src/modules/AMCModule_ContentItem_Upload.js deleted file mode 100644 index f11ff789a..000000000 --- a/Client/src/modules/AMCModule_ContentItem_Upload.js +++ /dev/null @@ -1,69 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -import AMCUploadState from "../common/AMCImplementation_UploadState.js" - -export default class AMCApplicationItem_Content_Upload extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Upload"); - - this.uploadclass = Assert.IdentifierString (itemJSON.uploadclass); - this.uploadsuccessevent = Assert.OptionalIdentifierString (itemJSON.uploadsuccessevent); - this.uploadfailureevent = Assert.OptionalIdentifierString (itemJSON.uploadfailureevent); - this.uploadcaption = Assert.StringValue (itemJSON.uploadcaption); - this.uploadfilename = ""; - this.uploadisinitial = 1; - this.uploadissaving = 0; - this.acceptedtypes = ""; - - if (this.uploadclass == "build") { - this.acceptedtypes = ".3mf"; - } - - if (this.uploadclass == "image") { - this.acceptedtypes = ".png,.jpg"; - } - - this.state = new AMCUploadState (this.uuid); - - this.setRefreshFlag (); - - } - -} \ No newline at end of file diff --git a/Client/src/modules/AMCModule_Grid.vue b/Client/src/modules/AMCModule_Grid.vue deleted file mode 100644 index 88341834b..000000000 --- a/Client/src/modules/AMCModule_Grid.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Client/src/modules/AMCModule_LayerView.js b/Client/src/modules/AMCModule_LayerView.js deleted file mode 100644 index 80ead29e8..000000000 --- a/Client/src/modules/AMCModule_LayerView.js +++ /dev/null @@ -1,116 +0,0 @@ -/*++ - -Copyright (C) 2021 Autodesk Inc. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - * Neither the name of the Autodesk Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL AUTODESK INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ - - -import * as Assert from "../common/AMCAsserts.js"; -import * as Common from "../common/AMCCommon.js" - - -class AMCApplicationItem_LayerView_Platform extends Common.AMCApplicationItem { - - constructor (moduleInstance, itemJSON) - { - Assert.ObjectValue (itemJSON); - - super (moduleInstance, itemJSON.uuid, itemJSON.type); - this.registerClass ("amcItem_Platform"); - - this.displayed_layer = 0; - this.displayed_build = Common.nullUUID (); - - this.updateFromJSON (itemJSON); - - this.setRefreshFlag (); - - } - - updateFromJSON (updateJSON) - { - Assert.ObjectValue (updateJSON); - - this.currentlayer = Assert.IntegerValue (updateJSON.currentlayer); - this.layercount = Assert.IntegerValue (updateJSON.layercount); - this.builduuid = Assert.OptionalUUIDValue (updateJSON.builduuid); - this.scatterplotuuid = Assert.OptionalUUIDValue (updateJSON.scatterplotuuid); - this.baseimageresource = Assert.OptionalUUIDValue (updateJSON.baseimageresource); - this.sizex = Assert.NumberValue (updateJSON.sizex); - this.sizey = Assert.NumberValue (updateJSON.sizey); - this.originx = Assert.NumberValue (updateJSON.originx); - this.originy = Assert.NumberValue (updateJSON.originy); - this.labelvisible = Assert.IntegerValue (updateJSON.labelvisible); - this.labelcaption = Assert.StringValue (updateJSON.labelcaption); - this.labelicon = Assert.StringValue (updateJSON.labelicon); - this.sliderchangeevent = Assert.StringValue (updateJSON.sliderchangeevent); - this.sliderfixed = Assert.IntegerValue (updateJSON.sliderfixed); - - this.moduleInstance.callDataHasChanged (); - } - - -} - - - - -export default class AMCApplicationModule_LayerView extends Common.AMCApplicationModule { - - constructor (page, moduleJSON) - { - Assert.ObjectValue (moduleJSON); - super (page, moduleJSON.uuid, moduleJSON.type, moduleJSON.name, moduleJSON.caption); - this.registerClass ("amcModule_LayerView"); - - Assert.ArrayValue (moduleJSON.items); - this.items = []; - this.platform = null; - - for (let itemJSON of moduleJSON.items) { - - let item = null; - - if (itemJSON.type === "platform") { - item = new AMCApplicationItem_LayerView_Platform (this, itemJSON); - this.platform = item; - } - - if (item) { - this.items.push (item); - this.page.addItem (item); - } else { - throw "Item type not found: " + itemJSON.type; - } - - } - - - } - -} - diff --git a/Client/svelte/.gitignore b/Client/svelte/.gitignore new file mode 100644 index 000000000..3b462cb0c --- /dev/null +++ b/Client/svelte/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/Client/svelte/.npmrc b/Client/svelte/.npmrc new file mode 100644 index 000000000..b6f27f135 --- /dev/null +++ b/Client/svelte/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/Client/svelte/.vscode/settings.json b/Client/svelte/.vscode/settings.json new file mode 100644 index 000000000..bc31e1553 --- /dev/null +++ b/Client/svelte/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.css": "tailwindcss" + } +} diff --git a/Client/svelte/README.md b/Client/svelte/README.md new file mode 100644 index 000000000..e41d13601 --- /dev/null +++ b/Client/svelte/README.md @@ -0,0 +1,42 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project +npx sv create my-app +``` + +To recreate this project with the same configuration: + +```sh +# recreate this project +npx sv create --template minimal --types ts --add tailwindcss="plugins:none" --install npm svelte +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/Client/svelte/components.json b/Client/svelte/components.json new file mode 100644 index 000000000..e786169db --- /dev/null +++ b/Client/svelte/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src\\routes\\layout.css", + "baseColor": "neutral" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" +} diff --git a/Client/svelte/package-lock.json b/Client/svelte/package-lock.json new file mode 100644 index 000000000..5dfee7c09 --- /dev/null +++ b/Client/svelte/package-lock.json @@ -0,0 +1,2730 @@ +{ + "name": "svelte", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "svelte", + "version": "0.0.1", + "dependencies": { + "axios": "^1.13.6", + "bits-ui": "^2.16.2", + "luxon": "^3.7.2", + "svelte-dnd-action": "^0.9.69", + "three": "^0.183.2", + "uplot": "^1.6.32" + }, + "devDependencies": { + "@internationalized/date": "^3.11.0", + "@lucide/svelte": "^0.561.0", + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.50.2", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@tailwindcss/vite": "^4.1.18", + "clsx": "^2.1.1", + "svelte": "^5.51.0", + "svelte-check": "^4.3.6", + "tailwind-merge": "^3.5.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.18", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", + "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", + "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.4", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@internationalized/date": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.11.0.tgz", + "integrity": "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lucide/svelte": { + "version": "0.561.0", + "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-0.561.0.tgz", + "integrity": "sha512-vofKV2UFVrKE6I4ewKJ3dfCXSV6iP6nWVmiM83MLjsU91EeJcEg7LoWUABLp/aOTxj1HQNbJD1f3g3L0JQgH9A==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "svelte": "^5" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz", + "integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.3.tgz", + "integrity": "sha512-tshOeBUid2v5LAblUpatIdFm5Cyykbw2EiKWOunAAX0A/oJaR7DOdC9wLR5Qqh9zUf3QUISA2m9A3suBdQSYQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.3", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", + "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bits-ui": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.16.2.tgz", + "integrity": "sha512-bgEpRRF7Ck9nRP1pbuKVxpaSMrz+8Pm0y+dmuvlkrSe+uUwIQECef29y6eslFHM6pCAubUh7STrsTLUUp8fzFQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/dom": "^1.7.1", + "esm-env": "^1.1.2", + "runed": "^0.35.1", + "svelte-toolbelt": "^0.10.6", + "tabbable": "^6.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/huntabyte" + }, + "peerDependencies": { + "@internationalized/date": "^3.8.1", + "svelte": "^5.33.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "devOptional": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/runed": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz", + "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==", + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "esm-env": "^1.0.0", + "lz-string": "^1.5.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.21.0", + "svelte": "^5.7.0" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + } + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz", + "integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svelte": { + "version": "5.53.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.5.tgz", + "integrity": "sha512-YkqERnF05g8KLdDZwZrF8/i1eSbj6Eoat8Jjr2IfruZz9StLuBqo8sfCSzjosNKd+ZrQ8DkKZDjpO5y3ht1Pow==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.3", + "esm-env": "^1.2.1", + "esrap": "^2.2.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.4.tgz", + "integrity": "sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-dnd-action": { + "version": "0.9.69", + "resolved": "https://registry.npmjs.org/svelte-dnd-action/-/svelte-dnd-action-0.9.69.tgz", + "integrity": "sha512-NAmSOH7htJoYraTQvr+q5whlIuVoq88vEuHr4NcFgscDRUxfWPPxgie2OoxepBCQCikrXZV4pqV86aun60wVyw==", + "license": "MIT", + "peerDependencies": { + "svelte": ">=3.23.0 || ^5.0.0-next.0" + } + }, + "node_modules/svelte-toolbelt": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz", + "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==", + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.35.1", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.30.2" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/three": { + "version": "0.183.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz", + "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uplot": { + "version": "1.6.32", + "resolved": "https://registry.npmjs.org/uplot/-/uplot-1.6.32.tgz", + "integrity": "sha512-KIMVnG68zvu5XXUbC4LQEPnhwOxBuLyW1AHtpm6IKTXImkbLgkMy+jabjLgSLMasNuGGzQm/ep3tOkyTxpiQIw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "devOptional": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + } + } +} diff --git a/Client/svelte/package.json b/Client/svelte/package.json new file mode 100644 index 000000000..f08f85819 --- /dev/null +++ b/Client/svelte/package.json @@ -0,0 +1,40 @@ +{ + "name": "svelte", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@internationalized/date": "^3.11.0", + "@lucide/svelte": "^0.561.0", + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.50.2", + "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@tailwindcss/vite": "^4.1.18", + "clsx": "^2.1.1", + "svelte": "^5.51.0", + "svelte-check": "^4.3.6", + "tailwind-merge": "^3.5.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.18", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "vite": "^7.3.1" + }, + "dependencies": { + "axios": "^1.13.6", + "bits-ui": "^2.16.2", + "luxon": "^3.7.2", + "svelte-dnd-action": "^0.9.69", + "three": "^0.183.2", + "uplot": "^1.6.32" + } +} diff --git a/Client/svelte/src/app.d.ts b/Client/svelte/src/app.d.ts new file mode 100644 index 000000000..da08e6da5 --- /dev/null +++ b/Client/svelte/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/Client/svelte/src/app.html b/Client/svelte/src/app.html new file mode 100644 index 000000000..f273cc58f --- /dev/null +++ b/Client/svelte/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/Client/svelte/src/lib/amcf/DisplayScope.svelte b/Client/svelte/src/lib/amcf/DisplayScope.svelte new file mode 100644 index 000000000..e3de74264 --- /dev/null +++ b/Client/svelte/src/lib/amcf/DisplayScope.svelte @@ -0,0 +1,11 @@ + + +{@render children()} diff --git a/Client/svelte/src/lib/amcf/LoginPage.svelte b/Client/svelte/src/lib/amcf/LoginPage.svelte new file mode 100644 index 000000000..2d8629148 --- /dev/null +++ b/Client/svelte/src/lib/amcf/LoginPage.svelte @@ -0,0 +1,271 @@ + + + + + + +{#if loginStyle === 'classic' || !['industrial', 'luminous', 'split'].includes(loginStyle)} +
+
+
+
+
+
+ {#if logoURL} + Logo + {/if} +

{appName}

+ {#if subtitle}

{subtitle}

{/if} + {#if welcomeMsg}

{welcomeMsg}

{/if} +
+
+
+ + e.key === 'Enter' && onEnter()} /> +
+
+ + e.key === 'Enter' && onEnter()} /> +
+ +
+
+
+ {#if app?.AppDefinition?.TextCopyRight} +

{app.AppDefinition.TextCopyRight}

+ {/if} +
+
+ + +{:else if loginStyle === 'industrial'} +
+
+
+
+
+
+ {#if logoURL} + Logo + {/if} +

{appName}

+ {#if subtitle}

{subtitle}

{/if} + {#if welcomeMsg}

{welcomeMsg}

{/if} +
+
+
+ + e.key === 'Enter' && onEnter()} /> +
+
+ + e.key === 'Enter' && onEnter()} /> +
+ +
+
+
+ {#if app?.AppDefinition?.TextCopyRight} +

{app.AppDefinition.TextCopyRight}

+ {/if} +
+
+ + +{:else if loginStyle === 'luminous'} +
+
+
+
+
+
+ {#if logoURL} + Logo + {/if} +

{appName}

+ {#if subtitle}

{subtitle}

{/if} + {#if welcomeMsg}

{welcomeMsg}

{/if} +
+
+
+ + e.key === 'Enter' && onEnter()} /> +
+
+ + e.key === 'Enter' && onEnter()} /> +
+ +
+
+
+ {#if app?.AppDefinition?.TextCopyRight} +

{app.AppDefinition.TextCopyRight}

+ {/if} +
+
+ + +{:else if loginStyle === 'split'} +
+ +
+
+ {#if logoURL} + Logo + {/if} +

Sign In

+

Enter your credentials to continue

+
+
+ + e.key === 'Enter' && onEnter()} /> +
+
+ + e.key === 'Enter' && onEnter()} /> +
+ +
+
+
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/MdiIcon.svelte b/Client/svelte/src/lib/amcf/MdiIcon.svelte new file mode 100644 index 000000000..dc9e724b8 --- /dev/null +++ b/Client/svelte/src/lib/amcf/MdiIcon.svelte @@ -0,0 +1,188 @@ + + +{#if Icon} + {@const ResolvedIcon = Icon} + +{:else if icon} + +{/if} diff --git a/Client/svelte/src/lib/amcf/ModuleFactory.svelte b/Client/svelte/src/lib/amcf/ModuleFactory.svelte new file mode 100644 index 000000000..1a07e3578 --- /dev/null +++ b/Client/svelte/src/lib/amcf/ModuleFactory.svelte @@ -0,0 +1,68 @@ + + +{#if module} + +{/if} diff --git a/Client/svelte/src/lib/amcf/Snackbar.svelte b/Client/svelte/src/lib/amcf/Snackbar.svelte new file mode 100644 index 000000000..f0c36939f --- /dev/null +++ b/Client/svelte/src/lib/amcf/Snackbar.svelte @@ -0,0 +1,58 @@ + + +{#if show} +
+
+ {text} + +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/application.ts b/Client/svelte/src/lib/amcf/application.ts new file mode 100644 index 000000000..2c37baddc --- /dev/null +++ b/Client/svelte/src/lib/amcf/application.ts @@ -0,0 +1,41 @@ +/** + * Reactive wrapper around the shared AMCF core application. + * + * The core AMCApplication class (Client/core) is framework-agnostic JS. + * This module wraps it in a Svelte 5 reactive store so that any component + * reading `app` will re-render when the underlying state changes. + */ + +// @ts-ignore — core JS module has no type declarations yet +import AMCApplication from '@core/common/AMCApplication.js'; + +let _app = $state(null); +let _tick = $state(0); + +export function getApp () { return _app; } +export function getTick () { return _tick; } + +export function initApp () { + if (_app) return _app; + + let baseURL = '/api'; + if (import.meta.env.DEV) { + baseURL = 'http://localhost:8869/api'; + } + + _app = new AMCApplication(baseURL, () => { _tick++; }); + // The core pushes frontend updates after login (event stream, or polling as fallback). + _app.setFrontendChangeListener(() => { _tick++; }); + + _app.retrieveConfiguration(null); + + return _app; +} + +export function destroyApp () { + if (_app) { + _app.setFrontendChangeListener(null); + _app.stopFrontendUpdates(); + } + _app = null; +} diff --git a/Client/svelte/src/lib/amcf/display.ts b/Client/svelte/src/lib/amcf/display.ts new file mode 100644 index 000000000..65a3c05f5 --- /dev/null +++ b/Client/svelte/src/lib/amcf/display.ts @@ -0,0 +1,15 @@ +import { getContext, setContext } from 'svelte'; + +const DISPLAYED_KEY = Symbol('amcf-displayed'); + +// Reactive getter telling a module whether it is actually shown, e.g. false inside an +// inactive tab. Containers that hide mounted content provide a narrower getter. +export type DisplayedGetter = () => boolean; + +export function provideDisplayed (getter: DisplayedGetter): void { + setContext(DISPLAYED_KEY, getter); +} + +export function useDisplayed (): DisplayedGetter { + return getContext(DISPLAYED_KEY) ?? (() => true); +} diff --git a/Client/svelte/src/lib/amcf/journalApi.ts b/Client/svelte/src/lib/amcf/journalApi.ts new file mode 100644 index 000000000..1b224f89e --- /dev/null +++ b/Client/svelte/src/lib/amcf/journalApi.ts @@ -0,0 +1,100 @@ +// Service layer for the AMCF process-parameter journal history REST API (/api/journal/*). +// +// All requests go through the shared AMCApplication axios wrapper so that the +// bearer token and base URL handling stay consistent with the rest of the client. + +export interface JournalInfo { + startTime: string; + lifetimeInMicroseconds: number; + currentTime: number; +} + +export interface JournalVariable { + name: string; + type: string; + units: number; +} + +export interface EnvelopeBucket { + t: number; // microseconds, relative to journal start + min: number; + max: number; + avg: number; + last: number; +} + +export interface EnvelopeSeries { + name: string; + available: boolean; + buckets: EnvelopeBucket[]; +} + +export interface EnvelopeResult { + startTimeStamp: number; + endTimeStamp: number; + series: EnvelopeSeries[]; +} + +// Retrieves metadata about the current live journal session. +export async function getJournalInfo (app: any): Promise { + const response = await app.axiosGetRequest('/journal/current'); + const data = response.data || {}; + return { + startTime: data.starttime || '', + lifetimeInMicroseconds: Number(data.lifetimeinmicroseconds || 0), + currentTime: Number(data.currenttime || 0) + }; +} + +// Retrieves the list of variables recorded in the current live journal. +export async function getVariables (app: any): Promise { + const response = await app.axiosGetRequest('/journal/variables'); + const variables = (response.data && response.data.variables) || []; + return variables.map((entry: any) => ({ + name: String(entry.name), + type: String(entry.type), + units: Number(entry.units || 0) + })); +} + +// Retrieves downsampled min/max/avg envelopes for one or more variables over a +// time range. `count` should be roughly the pixel width of the chart so that the +// server produces exactly the resolution needed (multi-scale). +export async function getEnvelope ( + app: any, + variables: string[], + startTimeStamp: number, + endTimeStamp: number, + count: number +): Promise { + if (variables.length === 0) + return { startTimeStamp, endTimeStamp, series: [] }; + + const encodedVariables = variables.map((name) => encodeURIComponent(name)).join(','); + const query = + `/journal/envelope?variables=${encodedVariables}` + + `&starttimestamp=${Math.floor(startTimeStamp)}` + + `&endtimestamp=${Math.floor(endTimeStamp)}` + + `&count=${Math.floor(count)}`; + + const response = await app.axiosGetRequest(query); + const data = response.data || {}; + + const series: EnvelopeSeries[] = ((data.series as any[]) || []).map((entry) => ({ + name: String(entry.name), + available: entry.available !== false, + buckets: ((entry.buckets as any[]) || []).map((bucket) => ({ + t: Number(bucket.t), + min: Number(bucket.min), + max: Number(bucket.max), + avg: Number(bucket.avg), + last: Number(bucket.last) + })) + })); + + return { + startTimeStamp: Number(data.starttimestamp || startTimeStamp), + endTimeStamp: Number(data.endtimestamp || endTimeStamp), + series + }; +} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleAlertList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleAlertList.svelte new file mode 100644 index 000000000..629cf5927 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleAlertList.svelte @@ -0,0 +1,97 @@ + + +{#if visible} +
+ + + + + Time + Alert + Level + Active + + + + {#if entries.length === 0} + + + No alerts. + + + {:else} + {#each entries as alert, idx (alert.alertuuid || idx)} + acknowledge(alert)} + > + + {formatTimestamp(alert.alerttimestamp)} + + +
{alert.alertcaption}
+ {#if alert.alertcontext} +
{alert.alertcontext}
+ {/if} +
+ + + {alert.severity || alert.alertlevel || 'info'} + + + + {#if alert.alertactive} + + {:else} + + {/if} + +
+ {/each} + {/if} +
+
+
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleBuildList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleBuildList.svelte new file mode 100644 index 000000000..328d58add --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleBuildList.svelte @@ -0,0 +1,156 @@ + + +{#if visible} +
+ + + + + + Build + Layers + Date + {#if entrybuttons.length > 0} + Actions + {/if} + + + + {#if entries.length === 0} + + 0 ? 5 : 4} class="text-center py-8 text-muted-foreground text-sm"> + {loaded ? 'No builds available.' : (module.loadingtext || 'Loading…')} + + + {:else} + {#each entries as build, idx (build.buildUUID || idx)} + { if (entrybuttons.length > 0) { detailItem = build; } else { selectBuild(build); } }} + > + + {#if thumbnailURL(build.buildThumbnail)} + + {:else} +
+ +
+ {/if} +
+ +
{build.buildName}
+
{build.buildUser}
+
+ {build.buildLayers} + {formatDate(build.buildTimestamp)} + {#if entrybuttons.length > 0} + +
+ {#each entrybuttons as btn (btn.uuid)} + + {/each} +
+
+ {/if} +
+ {/each} + {/if} +
+
+
+
+ + + { if (!v) detailItem = null; }}> + + + {detailItem?.buildName || 'Build Details'} + Build file details and actions + + {#if detailItem} +
+ {#if thumbnailURL(detailItem.buildThumbnail)} +
+ +
+ {/if} + Name{detailItem.buildName} + Layers{detailItem.buildLayers} + User{detailItem.buildUser} + Date{formatDate(detailItem.buildTimestamp)} + Executions{detailItem.buildExecutionCount} + UUID{detailItem.buildUUID} +
+ {/if} + + + {#each entrybuttons as btn (btn.uuid)} + {#if btn.selectevent} + + {/if} + {/each} + +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleButtonGroup.svelte b/Client/svelte/src/lib/amcf/modules/ModuleButtonGroup.svelte new file mode 100644 index 000000000..1b77aa18c --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleButtonGroup.svelte @@ -0,0 +1,79 @@ + + +{#if visible} +
+ {#each buttons as btn (btn.uuid)} + {#if btn.kind === 'spring'} +
+ {:else if btn.kind === 'spacer'} +
+ {:else} + {@const hasIcon = !!(btn.icon || btn.iconresource)} + + {/if} + {/each} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleChart.svelte b/Client/svelte/src/lib/amcf/modules/ModuleChart.svelte new file mode 100644 index 000000000..c37c5c480 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleChart.svelte @@ -0,0 +1,35 @@ + + +{#if visible} +
+ {#if !hasData} +
+ No chart data available. +
+ {:else} + + {/if} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleConfigurationList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleConfigurationList.svelte new file mode 100644 index 000000000..acc3896a8 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleConfigurationList.svelte @@ -0,0 +1,102 @@ + + +{#if visible} +
+ + + + + Active + Version + Name + Upload Time + User + Actions + + + + {#if entries.length === 0} + + + {module.loadingtext || 'No configurations available.'} + + + {:else} + {#each entries as config, idx (config.configurationUUID || idx)} + + + {#if config.configurationActive} + + {/if} + + {config.configurationVersion} + {config.configurationName} + {formatDate(config.configurationTimestamp)} + {config.userName} + +
+ {#each getActions(config) as action (action.uuid)} + + {/each} +
+
+
+ {/each} + {/if} +
+
+
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleContent.svelte b/Client/svelte/src/lib/amcf/modules/ModuleContent.svelte new file mode 100644 index 000000000..4b025986e --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleContent.svelte @@ -0,0 +1,66 @@ + + +{#if visible && isGroupbox} +
+ {#if title} + {title} + {/if} + {#if subtitle} +

{subtitle}

+ {/if} +
+ {#each modules as child (child.uuid)} + + {/each} +
+
+{:else if visible && isCard} + + {#if title} + + {title} + {#if subtitle} + {subtitle} + {/if} + + {/if} + + {#each modules as child (child.uuid)} + + {/each} + + +{:else if visible} +
+ {#if title} +

{title}

+ {/if} + {#if subtitle} +

{subtitle}

+ {/if} +
+ {#each modules as child (child.uuid)} + + {/each} +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleExecutionList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleExecutionList.svelte new file mode 100644 index 000000000..7eca6a71e --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleExecutionList.svelte @@ -0,0 +1,172 @@ + + +{#if visible} +
+ + + + + + Execution + Started + Status + {#if entrybuttons.length > 0} + Actions + {/if} + + + + {#if entries.length === 0} + + 0 ? 5 : 4} class="text-center py-8 text-muted-foreground text-sm"> + {loaded ? 'No executions available.' : (module.loadingtext || 'Loading…')} + + + {:else} + {#each entries as exec, idx (exec.executionUUID || idx)} + { detailItem = exec; }} + > + + {#if thumbnailURL(exec.executionThumbnail)} + + {:else} +
+ +
+ {/if} +
+ +
{exec.executionName}
+ {#if exec.executionDescription} +
{exec.executionDescription}
+ {/if} +
+ {formatDate(exec.executionStartTimestamp)} + + {exec.executionStatus || 'unknown'} + + {#if entrybuttons.length > 0} + +
+ {#each entrybuttons as btn (btn.uuid)} + + {/each} +
+
+ {/if} +
+ {/each} + {/if} +
+
+
+
+ + + { if (!v) detailItem = null; }}> + + + {detailItem?.executionName || 'Execution Details'} + Execution details and history + + {#if detailItem} +
+ {#if thumbnailURL(detailItem.executionThumbnail)} +
+ +
+ {/if} + Name{detailItem.executionName} + Status{detailItem.executionStatus} + Started{formatDate(detailItem.executionStartTimestamp)} + {#if detailItem.executionEndTimestamp} + Ended{formatDate(detailItem.executionEndTimestamp)} + {/if} + Duration{formatDuration(detailItem.executionDuration)} + Layers{detailItem.executionLayerCount} + UUID{detailItem.executionUUID} +
+ {/if} + + + +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleFallback.svelte b/Client/svelte/src/lib/amcf/modules/ModuleFallback.svelte new file mode 100644 index 000000000..61f97d5ba --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleFallback.svelte @@ -0,0 +1,7 @@ + + +
+ {module.type} — not yet implemented +
diff --git a/Client/svelte/src/lib/amcf/modules/ModuleForm.svelte b/Client/svelte/src/lib/amcf/modules/ModuleForm.svelte new file mode 100644 index 000000000..8c45b32ec --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleForm.svelte @@ -0,0 +1,325 @@ + + +{#snippet formField(entity: any)} + + {#if entity.type === 'edit'} +
+ +
+ {#if d(entity).prefix} + {d(entity).prefix} + {/if} + onEditBlur(entity)} + onkeydown={(e: KeyboardEvent) => onEditEnter(entity, e)} + oninput={(e: Event) => { entity.dataObject.value = (e.target as HTMLInputElement).value; }} + /> + {#if d(entity).suffix} + {d(entity).suffix} + {/if} +
+
+ + + {:else if entity.type === 'switch'} +
+ +
+ onSwitchChange(entity, v)} + disabled={d(entity).disabled} + aria-readonly={d(entity).readonly} + class={d(entity).readonly ? 'pointer-events-none' : ''} + /> + {toBool(d(entity).value) ? 'On' : 'Off'} +
+
+ + + {:else if entity.type === 'memo'} +
+ + +
+ + + {:else if entity.type === 'combobox'} +
+ + onComboChange(entity, v)} + disabled={d(entity).disabled} + > + + {@const selectedItem = (d(entity).items || []).find((i: any) => String(typeof i === 'string' ? i : i.value) === String(d(entity).value ?? ''))} + {selectedItem ? (typeof selectedItem === 'string' ? selectedItem : selectedItem.text || selectedItem.value) : (d(entity).value != null && d(entity).value !== '' ? String(d(entity).value) : 'Select...')} + + + {#each (d(entity).items || entity.items || []) as item (typeof item === 'string' ? item : item.value)} + + {typeof item === 'string' ? item : item.text || item.value} + + {/each} + + +
+ + + {:else if entity.type === 'number'} +
+ +
+ onEditBlur(entity)} + onkeydown={(e: KeyboardEvent) => onEditEnter(entity, e)} + oninput={(e: Event) => { entity.dataObject.value = (e.target as HTMLInputElement).value; }} + /> + {#if d(entity).unit} + {d(entity).unit} + {/if} +
+
+ + + {:else if entity.type === 'slider'} +
+ +
+
+ { entity.dataObject.value = (e.target as HTMLInputElement).value; }} + onchange={() => onEditBlur(entity)} + /> + +
+ { entity.dataObject.value = (e.target as HTMLInputElement).value; }} + onblur={() => onEditBlur(entity)} + onkeydown={(e: KeyboardEvent) => onEditEnter(entity, e)} + /> + {#if d(entity).unit} + {d(entity).unit} + {/if} +
+
+
+
+ + + {:else if entity.type === 'datetime'} +
+ + { entity.dataObject.value = (e.target as HTMLInputElement).value; fireChangeEvent(entity); }} + /> +
+ + + {:else if entity.type === 'multiselect'} +
+ +
+ {#each (d(entity).items || entity.items || []) as item} + {@const val = typeof item === 'string' ? item : item.value} + {@const selected = (() => { try { const arr = JSON.parse(d(entity).value || '[]'); return Array.isArray(arr) && arr.includes(val); } catch { return false; } })()} + + {/each} +
+
+ + + {:else if entity.type === 'calculated'} +
+ + + {d(entity).value || ''} + {#if d(entity).unit} + {d(entity).unit} + {/if} + +
+ + + {:else if entity.type === 'section'} + {@const collapsible = d(entity).collapsible !== false} + {@const defaultOpen = d(entity).defaultOpen !== false} + {@const open = isSectionOpen(entity.uuid, defaultOpen)} +
+ {#if collapsible} + + {:else} +
+ {entity.caption} +
+ {/if} + {#if !collapsible || open} +
+ {#each (entity.entities || []) as child (child.uuid)} + {@render formField(child)} + {/each} +
+ {/if} +
+ + + {:else if entity.type === 'actionbar'} +
+ {#if d(entity).cancelevent} + + {/if} + {#if d(entity).submitevent} + + {/if} +
+ {/if} +{/snippet} + +{#if visible} +
+ {#each entities as entity (entity.uuid)} + {@render formField(entity)} + {/each} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleGLScene.svelte b/Client/svelte/src/lib/amcf/modules/ModuleGLScene.svelte new file mode 100644 index 000000000..ce8ae0bd9 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleGLScene.svelte @@ -0,0 +1,115 @@ + + +{#if visible} +
+
+ {#if !initialized} +
+ Initializing scene... +
+ {/if} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleGraphic.svelte b/Client/svelte/src/lib/amcf/modules/ModuleGraphic.svelte new file mode 100644 index 000000000..62719dca6 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleGraphic.svelte @@ -0,0 +1,77 @@ + + +{#if visible} +
+
+ {#if !initialized} +
+ Graphic view requires WebGL. +
+ {/if} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleGrid.svelte b/Client/svelte/src/lib/amcf/modules/ModuleGrid.svelte new file mode 100644 index 000000000..87c2389b6 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleGrid.svelte @@ -0,0 +1,21 @@ + + +{#if visible} +
+ {#each sections as section (section.uuid)} +
+ +
+ {/each} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleHistoryBrowser.svelte b/Client/svelte/src/lib/amcf/modules/ModuleHistoryBrowser.svelte new file mode 100644 index 000000000..e71d58092 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleHistoryBrowser.svelte @@ -0,0 +1,330 @@ + + +{#if visible && compact} + +
+ {#if errorMsg} +
{errorMsg}
+ {/if} + +
+ {#if selected.length === 0} +
+ No variables configured. +
+ {:else if xValues.length === 0} +
+ Waiting for recorded data… +
+ {:else} + + {/if} +
+ +
+ {#each traces as trace (trace.label)} + + + {trace.label} + {legendValue(trace)} + + {/each} +
+
+{:else if visible} + + +
+ {title} +
+ + {#if mode === 'custom'} + + {/if} +
+
+
+ + + + +
+ {#if errorMsg} +
{errorMsg}
+ {/if} + +
+ {#if selected.length === 0} +
+ Select one or more variables to plot their history. +
+ {:else if xValues.length === 0} +
+ No recorded data in this time range yet. +
+ {:else} + + {/if} +
+ +
+ Window: {windowLabel()} + {#each traces as trace (trace.label)} + + + {trace.label} + {legendValue(trace)} + + {/each} +
+
+
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleImage.svelte b/Client/svelte/src/lib/amcf/modules/ModuleImage.svelte new file mode 100644 index 000000000..6da0a4440 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleImage.svelte @@ -0,0 +1,27 @@ + + +{#if visible && imageURL} +
+ +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleLayerView.svelte b/Client/svelte/src/lib/amcf/modules/ModuleLayerView.svelte new file mode 100644 index 000000000..4bc57a140 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleLayerView.svelte @@ -0,0 +1,1100 @@ + + + + +{#snippet layerViewBody()} +
+ + + + {#if partOverlays.length > 0} + + {/if} + + {#if zoomRect} +
+ {/if} + + +
+ + + + + + +
+ + + {#if layerCount > 0} + {#if layerJumpOpen} +
+ + (layerJumpOpen = false)} + {@attach focusAndSelect} + /> + / {layerCount} +
+ {:else} + + {/if} + {/if} + + {#if coordinateSystemVisible} + + + + + X + + + + Y + + + {/if} + + + {#if mousePosition} +
+ X: {mousePosition.x.toFixed(2)} · Y: {mousePosition.y.toFixed(2)} mm +
+ {/if} + + + {#if propertiesMode && hoverSegment} +
+ {#if hoverSegment.profilename} +
{hoverSegment.profilename}
+ {/if} +
+
Laser power
+
{Number(hoverSegment.laserpower ?? 0).toLocaleString()} W
+
Laser speed
+
{Number(hoverSegment.laserspeed ?? 0).toLocaleString()} mm/s
+ {#if hoverSegment.type} +
Type
+
{hoverSegment.type}
+ {/if} + {#if hoverSegment.laserindex !== undefined && hoverSegment.laserindex !== null} +
Laser
+
#{hoverSegment.laserindex}
+ {/if} + {#if hoverSegment.partname} +
Part
+
{hoverSegment.partname}{hoverSegment.partdisabled ? ' (disabled)' : ''}
+ {/if} + {#if hoverSegment.partid !== undefined && hoverSegment.partid !== null} +
Part ID
+
{hoverSegment.partid}
+ {/if} +
+
+ {/if} + + + {#if layerCount > 0} +
+ +
+ {/if} +
+{/snippet} + +{#if visible} + {#if isCard} + + {#if cardTitle} + + {cardTitle} + {#if cardSubtitle} + {cardSubtitle} + {/if} + + {/if} + + {@render layerViewBody()} + + + {:else} + {@render layerViewBody()} + {/if} +{/if} + + diff --git a/Client/svelte/src/lib/amcf/modules/ModuleLogs.svelte b/Client/svelte/src/lib/amcf/modules/ModuleLogs.svelte new file mode 100644 index 000000000..d86276a97 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleLogs.svelte @@ -0,0 +1,116 @@ + + +{#if visible} +
+
+ + {items.length} entries + +
+ + +
+
+ +
+ + + + Time + Subsystem + Message + + + + {#if items.length === 0} + + + No log entries yet. + + + {:else} + {#each items as entry (entry.logIndex)} + + {entry.logTime} + {entry.logSubsystem} + {entry.logText} + + {/each} + {/if} + + +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleParagraph.svelte b/Client/svelte/src/lib/amcf/modules/ModuleParagraph.svelte new file mode 100644 index 000000000..9c99334f2 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleParagraph.svelte @@ -0,0 +1,25 @@ + + +{#if visible} +

{text}

+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleParameterList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleParameterList.svelte new file mode 100644 index 000000000..2f15e97ba --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleParameterList.svelte @@ -0,0 +1,501 @@ + + +{#if visible} +
+
+ {#if hasPreferences && (showOnlyFavorites || activeGroups.length > 0 || activeSystems.length > 0)} + + {#if showOnlyFavorites}Favorites only{/if} + {#if activeGroups.length > 0}{showOnlyFavorites ? ' · ' : ''}{activeGroups.length} group filter(s){/if} + {#if activeSystems.length > 0}{(showOnlyFavorites || activeGroups.length > 0) ? ' · ' : ''}{activeSystems.length} system filter(s){/if} + + {/if} + + {#if hasPreferences} + + + {#snippet child({ props })} + + {/snippet} + + + Sort by + {#each headers as h (h.value)} + sortBy(h)}> + {h.text} + {#if sortState.column === h.value} + {#if sortState.direction === 'asc'} + + {:else} + + {/if} + {/if} + + {/each} + + + setShowOnlyFavorites(v)} + > + Show only favorites + + setShowOnlyFavorites(false)}> + Show everything + + + {#if groupOptions.length > 0} + + + Filter by group + + {#each groupOptions as group (group)} + toggleGroupFilter(group)} + > + {group} + + {/each} + + + {/if} + + {#if systemOptions.length > 0} + + Filter by system + + {#each systemOptions as system (system)} + toggleSystemFilter(system)} + > + {system} + + {/each} + + + {/if} + + {#if activeGroups.length > 0 || activeSystems.length > 0} + clearFilters()}>Clear filters + {/if} + + + openSaveDialog()}>Save view as preset… + {#if presetNames.length > 0} + + Load preset + + {#each presetNames as name (name)} + loadPreset(name)}> + {name} + {#if module.activePreset === name}{/if} + + {/each} + + + + Delete preset + + {#each presetNames as name (name)} + deletePreset(name)}> + {name} + + + {/each} + + + {/if} + + + {/if} +
+ + + + + {#if hasPreferences} + + {/if} + {#each headers as h (h.value)} + + {#if hasPreferences} + + {:else} + {h.text} + {/if} + {#if h.sizeable} + startResize(e, h)} + > + {/if} + + {/each} + + + + {#if entries.length === 0} + + + {module.loadingtext || 'No parameters available.'} + + + {:else} + {#each entries as row (rowKey(row))} + + {#if hasPreferences} + + + + {/if} + {#each headers as h (h.value)} + + {#if h.value === 'paramValue' && isEditable(row)} + {#if editingKey === rowKey(row)} +
+ onKeydown(e, row)} + {@attach autofocus} + /> + + +
+ {:else} + + {/if} + {:else} + {row[h.value] ?? ''} + {/if} +
+ {/each} +
+ {/each} + {/if} +
+
+
+
+ + + + + Save view preset + + Store the current favorites, sorting and filters as a named preset. + + +
+ { if (e.key === 'Enter') { e.preventDefault(); confirmSavePreset(); } }} + /> +
+ + + + +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModulePartList.svelte b/Client/svelte/src/lib/amcf/modules/ModulePartList.svelte new file mode 100644 index 000000000..9ef9cb833 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModulePartList.svelte @@ -0,0 +1,162 @@ + + +{#if visible} +
+ {#if loading && !details} +

{loadingtext}

+ {:else if errorMessage} +

{errorMessage}

+ {:else if !details} +

No build selected.

+ {:else} + {#if showdetails} + +
+ {#if thumbnailURL(details.thumbnail)} + + {:else} +
+ +
+ {/if} +
+
Name
+
{details.name || '—'}
+
Layers
+
{details.layercount ?? '—'}
+
Layer thickness
+
{layerThickness(details)}
+
File size
+
{formatBytes(details.size)}
+
+
+ {/if} + + +
+ Parts ({parts.length}) +
+
+ + + + + + Part name + Part number + + + + {#if parts.length === 0} + + + No parts in this build. + + + {:else} + {#each parts as part, idx (part.uuid || idx)} + selectPart(part)} + onkeydown={(event: KeyboardEvent) => onPartKeyDown(event, part)} + > + + {#if part.disabled} + + {:else} + + {/if} + + + {part.name || '—'} + {#if part.disabled} + Disabled + {/if} + + {part.partnumber || '—'} + + {/each} + {/if} + + + +
+ {/if} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleSeparator.svelte b/Client/svelte/src/lib/amcf/modules/ModuleSeparator.svelte new file mode 100644 index 000000000..cd04599b7 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleSeparator.svelte @@ -0,0 +1,17 @@ + + +{#if visible} + +{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleStateMachineGraph.svelte b/Client/svelte/src/lib/amcf/modules/ModuleStateMachineGraph.svelte new file mode 100644 index 000000000..7e93f0aba --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleStateMachineGraph.svelte @@ -0,0 +1,315 @@ + + +{#if !structureLoaded} +
+ Loading state machine... +
+{:else if nodes.length === 0} +
+ No states found for "{statemachineName}" +
+{:else} +
+ + + + + + + + + + + + + + + + + {#each edges as edge (edge.from + '->' + edge.to)} + {@const isActive = edge.from === activeState} + + {/each} + + {#each nodes as node (node.name)} + {@const isActive = node.name === activeState} + + + {#if isActive} + + {/if} + + {node.name} + + + {/each} + +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleStatusBanner.svelte b/Client/svelte/src/lib/amcf/modules/ModuleStatusBanner.svelte new file mode 100644 index 000000000..a475149e2 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleStatusBanner.svelte @@ -0,0 +1,49 @@ + + +{#if visible} + + + {#if bannerTitle} + {bannerTitle} + {/if} + {#if bannerDesc} + {bannerDesc} + {/if} + +{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleStatusList.svelte b/Client/svelte/src/lib/amcf/modules/ModuleStatusList.svelte new file mode 100644 index 000000000..2bcc9bcab --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleStatusList.svelte @@ -0,0 +1,94 @@ + + +{#if visible} +
+ {#if title} +
{title}
+ {/if} +
+ {#if rows.length === 0} +
{module.loadingtext || 'No status available.'}
+ {:else} + {#each rows as row (row.label)} + {@const r = renderRow(row)} +
+ {row.label} + {#if r.pill} + {r.text} + {:else} + {r.text} + {/if} +
+ {/each} + {/if} +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleTableBase.svelte b/Client/svelte/src/lib/amcf/modules/ModuleTableBase.svelte new file mode 100644 index 000000000..cb823bcde --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleTableBase.svelte @@ -0,0 +1,68 @@ + + +
+ + + + + {#each headers as h} + + {h.text} + + {/each} + + + + {#if entries.length === 0} + + + {emptyMessage} + + + {:else} + {#each entries as row, idx (row[rowKey] || idx)} + {#if rowSnippet} + {@render rowSnippet(row)} + {:else} + onRowClick?.(row)} + > + {#each headers as h} + + {row[h.value] ?? ''} + + {/each} + + {/if} + {/each} + {/if} + + + +
diff --git a/Client/svelte/src/lib/amcf/modules/ModuleTabs.svelte b/Client/svelte/src/lib/amcf/modules/ModuleTabs.svelte new file mode 100644 index 000000000..f77df79a3 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleTabs.svelte @@ -0,0 +1,70 @@ + + +{#snippet tabsBody()} + + + {#each tabs as tab (tab.uuid)} + {tab.caption || tab.name} + {/each} + + {#each tabs as tab (tab.uuid)} + + + + + + + {/each} + +{/snippet} + +{#if visible && tabs.length > 0} + {#if isCard} + + {#if title} + + {title} + {#if subtitle} + {subtitle} + {/if} + + {/if} + + {@render tabsBody()} + + + {:else} + {@render tabsBody()} + {/if} +{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleTogglePanel.svelte b/Client/svelte/src/lib/amcf/modules/ModuleTogglePanel.svelte new file mode 100644 index 000000000..81abf2219 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleTogglePanel.svelte @@ -0,0 +1,53 @@ + + +{#if visible} +
+ {#each toggles as toggle (toggle.uuid)} +
+
+ {toggle.label} + {stateLabel(toggle)} +
+ onToggle(toggle)} + /> +
+ {/each} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleUpload.svelte b/Client/svelte/src/lib/amcf/modules/ModuleUpload.svelte new file mode 100644 index 000000000..a442d072b --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleUpload.svelte @@ -0,0 +1,127 @@ + + +{#if visible} +
+
document.getElementById(`upload-${module.uuid}`)?.click()} + onkeydown={(e) => e.key === 'Enter' && document.getElementById(`upload-${module.uuid}`)?.click()} + > + + + {#if uploading} +
+
+

{statusMessage}

+
+
+
+
+

+ {Math.round(uploadProgress)}% +

+
+
+ {:else} +
+ +

{caption}

+ {#if statusMessage} +

{statusMessage}

+ {/if} +
+ {/if} +
+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleVideoStream.svelte b/Client/svelte/src/lib/amcf/modules/ModuleVideoStream.svelte new file mode 100644 index 000000000..fb9ee3db3 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleVideoStream.svelte @@ -0,0 +1,39 @@ + + +{#if visible} +
+ {#if streamURL} + {module.caption + {:else} +
+ No stream available. +
+ {/if} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/ModuleWorkflow.svelte b/Client/svelte/src/lib/amcf/modules/ModuleWorkflow.svelte new file mode 100644 index 000000000..be213a421 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/ModuleWorkflow.svelte @@ -0,0 +1,31 @@ + + +{#if visible} +
+ {#key workflow.uuid} + + {/key} +
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowEditor.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowEditor.svelte new file mode 100644 index 000000000..ce62734b2 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowEditor.svelte @@ -0,0 +1,193 @@ + + +
+ 0} + workflowName={state.workflow.name} + onaddparallel={handleAddParallel} + onundo={handleUndo} + onnamchange={handleNameChange} + /> + +
+ +
+ +
+ + +
+
+ {#each state.workflow.sequence as item (item.id)} +
+ {#if isParallelGroup(item)} + + {:else} + + {/if} +
+ {/each} +
+ + {#if state.workflow.sequence.length === 0} +
+ Drag steps from the palette or click to add +
+ {/if} +
+ + + {#if state.selectedStepId} +
+ +
+ {/if} +
+
diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowPalette.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowPalette.svelte new file mode 100644 index 000000000..59336f1e2 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowPalette.svelte @@ -0,0 +1,78 @@ + + +
+

+ Step Palette +

+ + +
+ {#if functionBlocks.length > 0} + + Function Blocks + + {#each functionBlocks as entry} + {@const colors = colorMap[entry.color] || colorMap.blue} + + {/each} + {/if} + + {#if templates.length > 0} + + + Templates + + {#each templates as entry} + {@const colors = colorMap[entry.color] || colorMap.amber} + + {/each} + {/if} +
+
+
+
diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowParallelGroup.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowParallelGroup.svelte new file mode 100644 index 000000000..dc18a87e3 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowParallelGroup.svelte @@ -0,0 +1,99 @@ + + +
+
+ + Parallel + +
+ + +
+
+ +
+ {#each group.branches as branch, branchIndex} +
+
+ + Branch {branchIndex + 1} + + {#if group.branches.length > 1} + + {/if} +
+
handleBranchConsider(branchIndex, e)} + onfinalize={(e) => handleBranchFinalize(branchIndex, e)} + > + {#each branch as step (step.id)} +
+ +
+ {/each} +
+
+ {/each} +
+
diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStep.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStep.svelte new file mode 100644 index 000000000..1b72917b9 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStep.svelte @@ -0,0 +1,104 @@ + + + +
+ ⠿ + + + {category === 'functionblock' ? 'FB' : 'TPL'} + + + {label} + + {#if step.params && Object.keys(step.params).length > 0} + + {Object.entries(step.params) + .map(([k, v]) => `${k}=${v}`) + .join(', ')} + + {/if} + + +
diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStepEditor.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStepEditor.svelte new file mode 100644 index 000000000..4d5d0b9b5 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowStepEditor.svelte @@ -0,0 +1,84 @@ + + +{#if step && catalogEntry} +
+
+

+ Properties +

+ +
+ +
+
+ +

{catalogEntry.label}

+
+
+ +

{catalogEntry.category}

+
+ + {#if catalogEntry.params && catalogEntry.params.length > 0} + + + Parameters + + {#each catalogEntry.params as param} +
+ + handleParamChange(param.name, e.currentTarget.value, param.type)} + class="h-8 text-sm" + /> +
+ {/each} + {:else} +

No configurable parameters

+ {/if} +
+
+{:else} +
+

+ Select a step to view its properties +

+
+{/if} diff --git a/Client/svelte/src/lib/amcf/modules/workflow/WorkflowToolbar.svelte b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowToolbar.svelte new file mode 100644 index 000000000..33af2c86a --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/WorkflowToolbar.svelte @@ -0,0 +1,40 @@ + + +
+ onnamchange?.(e.currentTarget.value)} + class="bg-transparent text-sm font-semibold text-foreground border-none outline-none w-48 placeholder:text-muted-foreground/40" + placeholder="Workflow name..." + /> + + + + + +
+ + +
diff --git a/Client/svelte/src/lib/amcf/modules/workflow/workflowStore.ts b/Client/svelte/src/lib/amcf/modules/workflow/workflowStore.ts new file mode 100644 index 000000000..9b94cd385 --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/workflowStore.ts @@ -0,0 +1,205 @@ +import type { + Workflow, + SequenceItem, + WorkflowStep, + ParallelGroup, + StepCatalogEntry, +} from './workflowTypes'; +import { isParallelGroup } from './workflowTypes'; + +let nextId = 1; +function uid(): string { + return `wf_${Date.now()}_${nextId++}`; +} + +export interface WorkflowState { + workflow: Workflow; + selectedStepId: string | null; + catalog: StepCatalogEntry[]; + undoStack: string[]; +} + +function snapshot(wf: Workflow): string { + return JSON.stringify(wf); +} + +function pushUndo(state: WorkflowState): void { + state.undoStack.push(snapshot(state.workflow)); + if (state.undoStack.length > 50) { + state.undoStack.shift(); + } +} + +export function createWorkflowState( + workflow: Workflow, + catalog: StepCatalogEntry[], +): WorkflowState { + return { + workflow, + selectedStepId: null, + catalog, + undoStack: [], + }; +} + +export function addStep( + state: WorkflowState, + stepRef: string, + index?: number, +): void { + pushUndo(state); + const entry = state.catalog.find((c) => c.id === stepRef); + const defaultParams: Record = {}; + if (entry?.params) { + for (const p of entry.params) { + if (p.default !== undefined) defaultParams[p.name] = p.default; + } + } + const step: WorkflowStep = { id: uid(), stepRef, params: defaultParams }; + const seq = state.workflow.sequence; + if (index !== undefined && index >= 0 && index <= seq.length) { + seq.splice(index, 0, step); + } else { + seq.push(step); + } +} + +export function removeStep(state: WorkflowState, stepId: string): void { + pushUndo(state); + const seq = state.workflow.sequence; + const idx = seq.findIndex((s) => s.id === stepId); + if (idx !== -1) { + seq.splice(idx, 1); + if (state.selectedStepId === stepId) state.selectedStepId = null; + return; + } + for (const item of seq) { + if (isParallelGroup(item)) { + for (const branch of item.branches) { + const bi = branch.findIndex((s) => s.id === stepId); + if (bi !== -1) { + branch.splice(bi, 1); + if (state.selectedStepId === stepId) state.selectedStepId = null; + return; + } + } + } + } +} + +export function moveStep( + state: WorkflowState, + fromIndex: number, + toIndex: number, +): void { + pushUndo(state); + const seq = state.workflow.sequence; + if (fromIndex < 0 || fromIndex >= seq.length) return; + const [item] = seq.splice(fromIndex, 1); + seq.splice(toIndex, 0, item); +} + +export function moveBranchStep( + state: WorkflowState, + groupId: string, + branchIndex: number, + fromIndex: number, + toIndex: number, +): void { + pushUndo(state); + const group = state.workflow.sequence.find( + (s) => s.id === groupId && isParallelGroup(s), + ) as ParallelGroup | undefined; + if (!group) return; + const branch = group.branches[branchIndex]; + if (!branch) return; + if (fromIndex < 0 || fromIndex >= branch.length) return; + const [item] = branch.splice(fromIndex, 1); + branch.splice(toIndex, 0, item); +} + +export function addParallelGroup( + state: WorkflowState, + branchCount: number = 2, + index?: number, +): void { + pushUndo(state); + const branches: WorkflowStep[][] = []; + for (let i = 0; i < branchCount; i++) branches.push([]); + const group: ParallelGroup = { id: uid(), type: 'parallel', branches }; + const seq = state.workflow.sequence; + if (index !== undefined && index >= 0 && index <= seq.length) { + seq.splice(index, 0, group); + } else { + seq.push(group); + } +} + +export function addBranch(state: WorkflowState, groupId: string): void { + pushUndo(state); + const group = state.workflow.sequence.find( + (s) => s.id === groupId && isParallelGroup(s), + ) as ParallelGroup | undefined; + if (group) { + group.branches.push([]); + } +} + +export function removeBranch( + state: WorkflowState, + groupId: string, + branchIndex: number, +): void { + pushUndo(state); + const group = state.workflow.sequence.find( + (s) => s.id === groupId && isParallelGroup(s), + ) as ParallelGroup | undefined; + if (!group || group.branches.length <= 1) return; + group.branches.splice(branchIndex, 1); +} + +export function updateStepParams( + state: WorkflowState, + stepId: string, + params: Record, +): void { + pushUndo(state); + const step = findStepById(state, stepId); + if (step) { + step.params = { ...(step.params || {}), ...params }; + } +} + +export function selectStep(state: WorkflowState, stepId: string | null): void { + state.selectedStepId = stepId; +} + +export function undo(state: WorkflowState): void { + if (state.undoStack.length === 0) return; + const prev = state.undoStack.pop()!; + state.workflow = JSON.parse(prev); + state.selectedStepId = null; +} + +export function findStepById( + state: WorkflowState, + stepId: string, +): WorkflowStep | null { + for (const item of state.workflow.sequence) { + if (!isParallelGroup(item) && item.id === stepId) return item; + if (isParallelGroup(item)) { + for (const branch of item.branches) { + const found = branch.find((s) => s.id === stepId); + if (found) return found; + } + } + } + return null; +} + +export function getCatalogEntry( + state: WorkflowState, + stepRef: string, +): StepCatalogEntry | undefined { + return state.catalog.find((c) => c.id === stepRef); +} diff --git a/Client/svelte/src/lib/amcf/modules/workflow/workflowTypes.ts b/Client/svelte/src/lib/amcf/modules/workflow/workflowTypes.ts new file mode 100644 index 000000000..919d0548a --- /dev/null +++ b/Client/svelte/src/lib/amcf/modules/workflow/workflowTypes.ts @@ -0,0 +1,38 @@ +export interface StepParam { + name: string; + type: 'int' | 'float' | 'string' | 'bool'; + unit?: string; + default?: unknown; +} + +export interface StepCatalogEntry { + id: string; + label: string; + category: 'functionblock' | 'template'; + color: string; + params?: StepParam[]; +} + +export interface WorkflowStep { + id: string; + stepRef: string; + params?: Record; +} + +export interface ParallelGroup { + id: string; + type: 'parallel'; + branches: WorkflowStep[][]; +} + +export type SequenceItem = WorkflowStep | ParallelGroup; + +export function isParallelGroup(item: SequenceItem): item is ParallelGroup { + return (item as ParallelGroup).type === 'parallel'; +} + +export interface Workflow { + uuid: string; + name: string; + sequence: SequenceItem[]; +} diff --git a/Client/svelte/src/lib/amcf/poll.svelte.ts b/Client/svelte/src/lib/amcf/poll.svelte.ts new file mode 100644 index 000000000..bdb6a1a17 --- /dev/null +++ b/Client/svelte/src/lib/amcf/poll.svelte.ts @@ -0,0 +1,79 @@ +import { getContext, setContext } from 'svelte'; +import { createSubscriber } from 'svelte/reactivity'; + +const TICK_KEY = Symbol('amcf-poll-tick'); +const MODULE_CHANGES_KEY = Symbol('amcf-module-changes'); + +export interface PollTick { + v: number; +} + +/* + * Application-wide tick: bumped on navigation, status and visibility changes and after + * asynchronous loads. Every reader re-evaluates. + */ +export function initPollTick (): PollTick { + const ref: PollTick = $state({ v: 0 }); + setContext(TICK_KEY, ref); + return ref; +} + +export function usePollTick (): PollTick { + return getContext(TICK_KEY) ?? { v: 0 }; +} + +/* + * Per-module change notifications, fed by the core with the uuids of the modules whose + * pushed state changed, so that one changed attribute only re-renders the affected modules. + */ +export class ModuleChanges { + #listeners = new Map void>>(); + + listen (uuid: string, update: () => void): () => void { + const listeners = this.#listeners.get(uuid) ?? new Set<() => void>(); + this.#listeners.set(uuid, listeners); + listeners.add(update); + + return () => { + listeners.delete(update); + if (listeners.size === 0) this.#listeners.delete(uuid); + }; + } + + notify (uuids: Iterable) { + for (const uuid of uuids) { + const listeners = this.#listeners.get(uuid); + if (listeners) { + for (const update of [...listeners]) update(); + } + } + } +} + +export function initModuleChanges (): ModuleChanges { + const changes = new ModuleChanges(); + setContext(MODULE_CHANGES_KEY, changes); + return changes; +} + +/* + * Tick of one module component. Reading `v` re-evaluates when the module's own state changes + * and on every application-wide tick. + */ +export function useModuleTick (getModule: () => { uuid?: string } | null | undefined): PollTick { + const appTick = usePollTick(); + const changes = getContext(MODULE_CHANGES_KEY); + + const subscribe = createSubscriber((update) => { + const uuid = getModule()?.uuid; + if (!changes || !uuid) return; + return changes.listen(uuid, update); + }); + + return { + get v () { + subscribe(); + return appTick.v; + } + } as PollTick; +} diff --git a/Client/svelte/src/lib/assets/favicon.svg b/Client/svelte/src/lib/assets/favicon.svg new file mode 100644 index 000000000..cc5dc66a3 --- /dev/null +++ b/Client/svelte/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/Client/svelte/src/lib/components/Sparkline.svelte b/Client/svelte/src/lib/components/Sparkline.svelte new file mode 100644 index 000000000..e6ff32e35 --- /dev/null +++ b/Client/svelte/src/lib/components/Sparkline.svelte @@ -0,0 +1,43 @@ + + +{#if path} + + + +{:else} + — +{/if} diff --git a/Client/svelte/src/lib/components/TimeRangeSelector.svelte b/Client/svelte/src/lib/components/TimeRangeSelector.svelte new file mode 100644 index 000000000..2876da107 --- /dev/null +++ b/Client/svelte/src/lib/components/TimeRangeSelector.svelte @@ -0,0 +1,60 @@ + + +
+
+ + + {#if mode === 'custom'} + + {/if} +
+ + {#if mode === 'live'} +
+ {#each liveWindows as w (w.seconds)} + + {/each} +
+ {/if} +
diff --git a/Client/svelte/src/lib/components/UPlotChart.svelte b/Client/svelte/src/lib/components/UPlotChart.svelte new file mode 100644 index 000000000..7de9b2562 --- /dev/null +++ b/Client/svelte/src/lib/components/UPlotChart.svelte @@ -0,0 +1,286 @@ + + + diff --git a/Client/svelte/src/lib/components/VariableSelector.svelte b/Client/svelte/src/lib/components/VariableSelector.svelte new file mode 100644 index 000000000..a5532f591 --- /dev/null +++ b/Client/svelte/src/lib/components/VariableSelector.svelte @@ -0,0 +1,68 @@ + + +
+
+ + +
+ +
    + {#if filtered.length === 0} +
  • No variables found.
  • + {:else} + {#each filtered as v (v.name)} +
  • + +
  • + {/each} + {/if} +
+
+
+ {selected.length} selected · {variables.length} recorded +
+
diff --git a/Client/svelte/src/lib/components/ui/alert/alert-description.svelte b/Client/svelte/src/lib/components/ui/alert/alert-description.svelte new file mode 100644 index 000000000..8b56aed2f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/alert/alert-description.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/alert/alert-title.svelte b/Client/svelte/src/lib/components/ui/alert/alert-title.svelte new file mode 100644 index 000000000..77e45ad5c --- /dev/null +++ b/Client/svelte/src/lib/components/ui/alert/alert-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/alert/alert.svelte b/Client/svelte/src/lib/components/ui/alert/alert.svelte new file mode 100644 index 000000000..80f7858b1 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/alert/alert.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/Client/svelte/src/lib/components/ui/alert/index.ts b/Client/svelte/src/lib/components/ui/alert/index.ts new file mode 100644 index 000000000..97e21b4ea --- /dev/null +++ b/Client/svelte/src/lib/components/ui/alert/index.ts @@ -0,0 +1,14 @@ +import Root from "./alert.svelte"; +import Description from "./alert-description.svelte"; +import Title from "./alert-title.svelte"; +export { alertVariants, type AlertVariant } from "./alert.svelte"; + +export { + Root, + Description, + Title, + // + Root as Alert, + Description as AlertDescription, + Title as AlertTitle, +}; diff --git a/Client/svelte/src/lib/components/ui/badge/badge.svelte b/Client/svelte/src/lib/components/ui/badge/badge.svelte new file mode 100644 index 000000000..e3164ba7f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/badge/badge.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/badge/index.ts b/Client/svelte/src/lib/components/ui/badge/index.ts new file mode 100644 index 000000000..64e0aa9b0 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from "./badge.svelte"; +export { badgeVariants, type BadgeVariant } from "./badge.svelte"; diff --git a/Client/svelte/src/lib/components/ui/button/button.svelte b/Client/svelte/src/lib/components/ui/button/button.svelte new file mode 100644 index 000000000..a8296aed1 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/button/button.svelte @@ -0,0 +1,82 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/Client/svelte/src/lib/components/ui/button/index.ts b/Client/svelte/src/lib/components/ui/button/index.ts new file mode 100644 index 000000000..fb585d768 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/Client/svelte/src/lib/components/ui/card/card-action.svelte b/Client/svelte/src/lib/components/ui/card/card-action.svelte new file mode 100644 index 000000000..cc36c5665 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-action.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/card-content.svelte b/Client/svelte/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 000000000..bc90b8371 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,15 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/card-description.svelte b/Client/svelte/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 000000000..9b20ac701 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,20 @@ + + +

+ {@render children?.()} +

diff --git a/Client/svelte/src/lib/components/ui/card/card-footer.svelte b/Client/svelte/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 000000000..2d4d0f24a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/card-header.svelte b/Client/svelte/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 000000000..25017884e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/card-title.svelte b/Client/svelte/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 000000000..744723117 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/card.svelte b/Client/svelte/src/lib/components/ui/card/card.svelte new file mode 100644 index 000000000..99448cc9a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/card.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/card/index.ts b/Client/svelte/src/lib/components/ui/card/index.ts new file mode 100644 index 000000000..4d3fce489 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/card/index.ts @@ -0,0 +1,25 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; +import Action from "./card-action.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + Action, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, + Action as CardAction, +}; diff --git a/Client/svelte/src/lib/components/ui/checkbox/checkbox.svelte b/Client/svelte/src/lib/components/ui/checkbox/checkbox.svelte new file mode 100644 index 000000000..0a2b0101c --- /dev/null +++ b/Client/svelte/src/lib/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,36 @@ + + + + {#snippet children({ checked, indeterminate })} +
+ {#if checked} + + {:else if indeterminate} + + {/if} +
+ {/snippet} +
diff --git a/Client/svelte/src/lib/components/ui/checkbox/index.ts b/Client/svelte/src/lib/components/ui/checkbox/index.ts new file mode 100644 index 000000000..6d92d9458 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from "./checkbox.svelte"; +export { + Root, + // + Root as Checkbox, +}; diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-close.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-close.svelte new file mode 100644 index 000000000..840b2f68b --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-close.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-content.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 000000000..5c6ee6db3 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,45 @@ + + + + + + {@render children?.()} + {#if showCloseButton} + + + Close + + {/if} + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-description.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 000000000..38450239a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-footer.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 000000000..e7ff4468e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-header.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 000000000..4e5c44734 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-overlay.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 000000000..f81ad8334 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-portal.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 000000000..ccfa79caf --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-title.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 000000000..e4d4b344a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog-trigger.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog-trigger.svelte new file mode 100644 index 000000000..9d1e80110 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/dialog.svelte b/Client/svelte/src/lib/components/ui/dialog/dialog.svelte new file mode 100644 index 000000000..211672c6d --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/dialog.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dialog/index.ts b/Client/svelte/src/lib/components/ui/dialog/index.ts new file mode 100644 index 000000000..076cef528 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,34 @@ +import Root from "./dialog.svelte"; +import Portal from "./dialog-portal.svelte"; +import Title from "./dialog-title.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; +import Trigger from "./dialog-trigger.svelte"; +import Close from "./dialog-close.svelte"; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte new file mode 100644 index 000000000..e0e197187 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte @@ -0,0 +1,16 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 000000000..6d9ef8556 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,43 @@ + + + + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 000000000..1e96782e7 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 000000000..433540fd2 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,22 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte new file mode 100644 index 000000000..aca1f7bd5 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 000000000..04cd1103d --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,27 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 000000000..9681c2bb4 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,24 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte new file mode 100644 index 000000000..274cfef78 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte new file mode 100644 index 000000000..189aef40e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte @@ -0,0 +1,16 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 000000000..ce2ad0946 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,33 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 000000000..90f1b6f10 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 000000000..7c6e9c67a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 000000000..3f06dc49a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 000000000..5f49d01e9 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte new file mode 100644 index 000000000..f04458139 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte new file mode 100644 index 000000000..cb053444d --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte new file mode 100644 index 000000000..cb4bc621c --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/dropdown-menu/index.ts b/Client/svelte/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 000000000..7850c6a30 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,54 @@ +import Root from "./dropdown-menu.svelte"; +import Sub from "./dropdown-menu-sub.svelte"; +import CheckboxGroup from "./dropdown-menu-checkbox-group.svelte"; +import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import Group from "./dropdown-menu-group.svelte"; +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import RadioGroup from "./dropdown-menu-radio-group.svelte"; +import RadioItem from "./dropdown-menu-radio-item.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import Trigger from "./dropdown-menu-trigger.svelte"; +import SubContent from "./dropdown-menu-sub-content.svelte"; +import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; +import GroupHeading from "./dropdown-menu-group-heading.svelte"; +import Portal from "./dropdown-menu-portal.svelte"; + +export { + CheckboxGroup, + CheckboxItem, + Content, + Portal, + Root as DropdownMenu, + CheckboxGroup as DropdownMenuCheckboxGroup, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Portal as DropdownMenuPortal, + Group as DropdownMenuGroup, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + RadioGroup as DropdownMenuRadioGroup, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + Trigger as DropdownMenuTrigger, + GroupHeading as DropdownMenuGroupHeading, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger, +}; diff --git a/Client/svelte/src/lib/components/ui/input/index.ts b/Client/svelte/src/lib/components/ui/input/index.ts new file mode 100644 index 000000000..f47b6d3fb --- /dev/null +++ b/Client/svelte/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/Client/svelte/src/lib/components/ui/input/input.svelte b/Client/svelte/src/lib/components/ui/input/input.svelte new file mode 100644 index 000000000..ff1a4c875 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/input/input.svelte @@ -0,0 +1,52 @@ + + +{#if type === "file"} + +{:else} + +{/if} diff --git a/Client/svelte/src/lib/components/ui/label/index.ts b/Client/svelte/src/lib/components/ui/label/index.ts new file mode 100644 index 000000000..8bfca0b3f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/Client/svelte/src/lib/components/ui/label/label.svelte b/Client/svelte/src/lib/components/ui/label/label.svelte new file mode 100644 index 000000000..d71afbca2 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/label/label.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/scroll-area/index.ts b/Client/svelte/src/lib/components/ui/scroll-area/index.ts new file mode 100644 index 000000000..e86a25b21 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from "./scroll-area-scrollbar.svelte"; +import Root from "./scroll-area.svelte"; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar, +}; diff --git a/Client/svelte/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/Client/svelte/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 000000000..8f5d96099 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,31 @@ + + + + {@render children?.()} + + diff --git a/Client/svelte/src/lib/components/ui/scroll-area/scroll-area.svelte b/Client/svelte/src/lib/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 000000000..86ee0326f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,43 @@ + + + + + {@render children?.()} + + {#if orientation === "vertical" || orientation === "both"} + + {/if} + {#if orientation === "horizontal" || orientation === "both"} + + {/if} + + diff --git a/Client/svelte/src/lib/components/ui/select/index.ts b/Client/svelte/src/lib/components/ui/select/index.ts new file mode 100644 index 000000000..4dec358b1 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/index.ts @@ -0,0 +1,37 @@ +import Root from "./select.svelte"; +import Group from "./select-group.svelte"; +import Label from "./select-label.svelte"; +import Item from "./select-item.svelte"; +import Content from "./select-content.svelte"; +import Trigger from "./select-trigger.svelte"; +import Separator from "./select-separator.svelte"; +import ScrollDownButton from "./select-scroll-down-button.svelte"; +import ScrollUpButton from "./select-scroll-up-button.svelte"; +import GroupHeading from "./select-group-heading.svelte"; +import Portal from "./select-portal.svelte"; + +export { + Root, + Group, + Label, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + GroupHeading, + Portal, + // + Root as Select, + Group as SelectGroup, + Label as SelectLabel, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, + GroupHeading as SelectGroupHeading, + Portal as SelectPortal, +}; diff --git a/Client/svelte/src/lib/components/ui/select/select-content.svelte b/Client/svelte/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 000000000..4b9ca4386 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,45 @@ + + + + + + + {@render children?.()} + + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-group-heading.svelte b/Client/svelte/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 000000000..1fab5f002 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,21 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/select/select-group.svelte b/Client/svelte/src/lib/components/ui/select/select-group.svelte new file mode 100644 index 000000000..a1f43bf3d --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-group.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-item.svelte b/Client/svelte/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 000000000..b85eef696 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,38 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/Client/svelte/src/lib/components/ui/select/select-label.svelte b/Client/svelte/src/lib/components/ui/select/select-label.svelte new file mode 100644 index 000000000..46960259f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-label.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/select/select-portal.svelte b/Client/svelte/src/lib/components/ui/select/select-portal.svelte new file mode 100644 index 000000000..424bcddcc --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-scroll-down-button.svelte b/Client/svelte/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 000000000..362920582 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-scroll-up-button.svelte b/Client/svelte/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 000000000..1aa2300c9 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,20 @@ + + + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-separator.svelte b/Client/svelte/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 000000000..0eac3ebc5 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,18 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/select/select-trigger.svelte b/Client/svelte/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 000000000..dbb81dfa0 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/Client/svelte/src/lib/components/ui/select/select.svelte b/Client/svelte/src/lib/components/ui/select/select.svelte new file mode 100644 index 000000000..05eb6634e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/select/select.svelte @@ -0,0 +1,11 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/separator/index.ts b/Client/svelte/src/lib/components/ui/separator/index.ts new file mode 100644 index 000000000..82442d2cd --- /dev/null +++ b/Client/svelte/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/Client/svelte/src/lib/components/ui/separator/separator.svelte b/Client/svelte/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 000000000..f40999fa7 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,21 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/index.ts b/Client/svelte/src/lib/components/ui/sheet/index.ts new file mode 100644 index 000000000..28d7da1c7 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/index.ts @@ -0,0 +1,34 @@ +import Root from "./sheet.svelte"; +import Portal from "./sheet-portal.svelte"; +import Trigger from "./sheet-trigger.svelte"; +import Close from "./sheet-close.svelte"; +import Overlay from "./sheet-overlay.svelte"; +import Content from "./sheet-content.svelte"; +import Header from "./sheet-header.svelte"; +import Footer from "./sheet-footer.svelte"; +import Title from "./sheet-title.svelte"; +import Description from "./sheet-description.svelte"; + +export { + Root, + Close, + Trigger, + Portal, + Overlay, + Content, + Header, + Footer, + Title, + Description, + // + Root as Sheet, + Close as SheetClose, + Trigger as SheetTrigger, + Portal as SheetPortal, + Overlay as SheetOverlay, + Content as SheetContent, + Header as SheetHeader, + Footer as SheetFooter, + Title as SheetTitle, + Description as SheetDescription, +}; diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-close.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-close.svelte new file mode 100644 index 000000000..ae382c123 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-close.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-content.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-content.svelte new file mode 100644 index 000000000..065fe0445 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-content.svelte @@ -0,0 +1,60 @@ + + + + + + + + {@render children?.()} + + + Close + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-description.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-description.svelte new file mode 100644 index 000000000..333b17a7a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-footer.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-footer.svelte new file mode 100644 index 000000000..dd9ed84b0 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-header.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-header.svelte new file mode 100644 index 000000000..757a6a566 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-overlay.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-overlay.svelte new file mode 100644 index 000000000..345e197bd --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-portal.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-portal.svelte new file mode 100644 index 000000000..f3085a3cd --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-title.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-title.svelte new file mode 100644 index 000000000..9fda327e9 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet-trigger.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet-trigger.svelte new file mode 100644 index 000000000..e266975f9 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/sheet/sheet.svelte b/Client/svelte/src/lib/components/ui/sheet/sheet.svelte new file mode 100644 index 000000000..5bf978391 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/sheet/sheet.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/switch/index.ts b/Client/svelte/src/lib/components/ui/switch/index.ts new file mode 100644 index 000000000..f5533db72 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/switch/index.ts @@ -0,0 +1,7 @@ +import Root from "./switch.svelte"; + +export { + Root, + // + Root as Switch, +}; diff --git a/Client/svelte/src/lib/components/ui/switch/switch.svelte b/Client/svelte/src/lib/components/ui/switch/switch.svelte new file mode 100644 index 000000000..80661fd82 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/switch/switch.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/Client/svelte/src/lib/components/ui/table/index.ts b/Client/svelte/src/lib/components/ui/table/index.ts new file mode 100644 index 000000000..14695c815 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/index.ts @@ -0,0 +1,28 @@ +import Root from "./table.svelte"; +import Body from "./table-body.svelte"; +import Caption from "./table-caption.svelte"; +import Cell from "./table-cell.svelte"; +import Footer from "./table-footer.svelte"; +import Head from "./table-head.svelte"; +import Header from "./table-header.svelte"; +import Row from "./table-row.svelte"; + +export { + Root, + Body, + Caption, + Cell, + Footer, + Head, + Header, + Row, + // + Root as Table, + Body as TableBody, + Caption as TableCaption, + Cell as TableCell, + Footer as TableFooter, + Head as TableHead, + Header as TableHeader, + Row as TableRow, +}; diff --git a/Client/svelte/src/lib/components/ui/table/table-body.svelte b/Client/svelte/src/lib/components/ui/table/table-body.svelte new file mode 100644 index 000000000..29e96875f --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-body.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-caption.svelte b/Client/svelte/src/lib/components/ui/table/table-caption.svelte new file mode 100644 index 000000000..4696cff57 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-caption.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-cell.svelte b/Client/svelte/src/lib/components/ui/table/table-cell.svelte new file mode 100644 index 000000000..2c0c26a03 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-cell.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-footer.svelte b/Client/svelte/src/lib/components/ui/table/table-footer.svelte new file mode 100644 index 000000000..b9b14ebfa --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-footer.svelte @@ -0,0 +1,20 @@ + + +tr]:last:border-b-0", className)} + {...restProps} +> + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-head.svelte b/Client/svelte/src/lib/components/ui/table/table-head.svelte new file mode 100644 index 000000000..b67a6f9bd --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-head.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-header.svelte b/Client/svelte/src/lib/components/ui/table/table-header.svelte new file mode 100644 index 000000000..f47d2597c --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-header.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table-row.svelte b/Client/svelte/src/lib/components/ui/table/table-row.svelte new file mode 100644 index 000000000..0df769e0a --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table-row.svelte @@ -0,0 +1,23 @@ + + +svelte-css-wrapper]:[&>th,td]:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors", + className + )} + {...restProps} +> + {@render children?.()} + diff --git a/Client/svelte/src/lib/components/ui/table/table.svelte b/Client/svelte/src/lib/components/ui/table/table.svelte new file mode 100644 index 000000000..a33495632 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/table/table.svelte @@ -0,0 +1,22 @@ + + +
+ + {@render children?.()} +
+
diff --git a/Client/svelte/src/lib/components/ui/tabs/index.ts b/Client/svelte/src/lib/components/ui/tabs/index.ts new file mode 100644 index 000000000..12d4327aa --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tabs/index.ts @@ -0,0 +1,16 @@ +import Root from "./tabs.svelte"; +import Content from "./tabs-content.svelte"; +import List from "./tabs-list.svelte"; +import Trigger from "./tabs-trigger.svelte"; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/Client/svelte/src/lib/components/ui/tabs/tabs-content.svelte b/Client/svelte/src/lib/components/ui/tabs/tabs-content.svelte new file mode 100644 index 000000000..340d65cf2 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tabs/tabs-list.svelte b/Client/svelte/src/lib/components/ui/tabs/tabs-list.svelte new file mode 100644 index 000000000..08932b60e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tabs/tabs-trigger.svelte b/Client/svelte/src/lib/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 000000000..e623b366b --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,20 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tabs/tabs.svelte b/Client/svelte/src/lib/components/ui/tabs/tabs.svelte new file mode 100644 index 000000000..ef6cada5e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tooltip/index.ts b/Client/svelte/src/lib/components/ui/tooltip/index.ts new file mode 100644 index 000000000..171860421 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/index.ts @@ -0,0 +1,19 @@ +import Root from "./tooltip.svelte"; +import Trigger from "./tooltip-trigger.svelte"; +import Content from "./tooltip-content.svelte"; +import Provider from "./tooltip-provider.svelte"; +import Portal from "./tooltip-portal.svelte"; + +export { + Root, + Trigger, + Content, + Provider, + Portal, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, + Provider as TooltipProvider, + Portal as TooltipPortal, +}; diff --git a/Client/svelte/src/lib/components/ui/tooltip/tooltip-content.svelte b/Client/svelte/src/lib/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 000000000..266252287 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,52 @@ + + + + + {@render children?.()} + + {#snippet child({ props })} +
+ {/snippet} +
+
+
diff --git a/Client/svelte/src/lib/components/ui/tooltip/tooltip-portal.svelte b/Client/svelte/src/lib/components/ui/tooltip/tooltip-portal.svelte new file mode 100644 index 000000000..d234f7d7d --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/tooltip-portal.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tooltip/tooltip-provider.svelte b/Client/svelte/src/lib/components/ui/tooltip/tooltip-provider.svelte new file mode 100644 index 000000000..8150bef2e --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/tooltip-provider.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tooltip/tooltip-trigger.svelte b/Client/svelte/src/lib/components/ui/tooltip/tooltip-trigger.svelte new file mode 100644 index 000000000..1acdaa47b --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/tooltip-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/components/ui/tooltip/tooltip.svelte b/Client/svelte/src/lib/components/ui/tooltip/tooltip.svelte new file mode 100644 index 000000000..0b0f9cef2 --- /dev/null +++ b/Client/svelte/src/lib/components/ui/tooltip/tooltip.svelte @@ -0,0 +1,7 @@ + + + diff --git a/Client/svelte/src/lib/index.ts b/Client/svelte/src/lib/index.ts new file mode 100644 index 000000000..856f2b6c3 --- /dev/null +++ b/Client/svelte/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/Client/svelte/src/lib/utils.ts b/Client/svelte/src/lib/utils.ts new file mode 100644 index 000000000..55b3a918e --- /dev/null +++ b/Client/svelte/src/lib/utils.ts @@ -0,0 +1,13 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { ref?: U | null }; diff --git a/Client/svelte/src/routes/+layout.svelte b/Client/svelte/src/routes/+layout.svelte new file mode 100644 index 000000000..3d6597cd6 --- /dev/null +++ b/Client/svelte/src/routes/+layout.svelte @@ -0,0 +1,15 @@ + + + + + +
+ {@render children()} +
+
diff --git a/Client/svelte/src/routes/+layout.ts b/Client/svelte/src/routes/+layout.ts new file mode 100644 index 000000000..ae88a2755 --- /dev/null +++ b/Client/svelte/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = false; +export const ssr = false; diff --git a/Client/svelte/src/routes/+page.svelte b/Client/svelte/src/routes/+page.svelte new file mode 100644 index 000000000..a80b766d1 --- /dev/null +++ b/Client/svelte/src/routes/+page.svelte @@ -0,0 +1,472 @@ + + + +{#if status === 'initial'} +
+
+
+ + +{:else if status === 'login'} + setTimeout(bumpTick, POST_LOGIN_TICK_DELAY_MS)} /> + + +{:else if status === 'ready'} + +
+ + + + + {#if !isLargeScreen} + + + + {appName} + + + + + + + {/if} + + + + +
+ + + + {#snippet child({ props })} + + {/snippet} + + {darkMode ? 'Switch to light mode' : 'Switch to dark mode'} + + + {#each toolbarItems as item (item.uuid)} + + + {#snippet child({ props })} + + {/snippet} + + {item.caption} + + {/each} +
+ + +
+ + {#if isLargeScreen && sidebarVisible} + + {/if} + + +
+ {#each pages as page (page.name)} + {#if poll.v >= 0 && app.pageIsActive(page)} +
+ {#each page.modules || [] as mod (mod.uuid)} + + {/each} +
+ {/if} + {/each} +
+
+ + + {#each dialogs as dialog (dialog.name)} + setDialogOpen(dialog, open)} + > + + {#if dialog.title} + + {dialog.title} + + {/if} +
+ {#each dialog.modules || [] as mod (mod.uuid)} + + {/each} +
+
+
+ {/each} + + + + + +
+ {#if copyright} + © {copyright} + {/if} +
+ + +{:else if status === 'error'} +
+
+
+ +
+

Connection Error

+

Unable to connect to the server.

+ {#if currentError} +

{currentError}

+ {/if} + +
+
+{/if} diff --git a/Client/svelte/src/routes/layout.css b/Client/svelte/src/routes/layout.css new file mode 100644 index 000000000..a0bc5380a --- /dev/null +++ b/Client/svelte/src/routes/layout.css @@ -0,0 +1,155 @@ +@import "tailwindcss"; +@import "tw-animate-css"; +@import "@core/theme/tokens.css"; + +@custom-variant dark (&:is(.dark *)); + +/* + * ScanLab Corporate Theme + * Light gray backgrounds, ScanLab red (#C8102E) accent, + * clean industrial typography. + */ +:root { + --radius: 0.375rem; + + /* Surfaces */ + --background: oklch(0.975 0.002 250); /* ~#F7F8FA */ + --foreground: oklch(0.20 0 0); /* #1E1E1E */ + --card: oklch(1.0 0 0); /* #FFFFFF */ + --card-foreground: oklch(0.20 0 0); /* #1E1E1E */ + --popover: oklch(1.0 0 0); + --popover-foreground: oklch(0.20 0 0); + + /* Brand */ + --primary: oklch(0.48 0.195 22); /* #C8102E */ + --primary-foreground: oklch(1.0 0 0); /* white */ + + /* Neutral secondary */ + --secondary: oklch(0.965 0.002 250); /* ~#F2F3F5 */ + --secondary-foreground: oklch(0.20 0 0); + + /* Muted */ + --muted: oklch(0.955 0.003 250); /* ~#ECEEF0 */ + --muted-foreground: oklch(0.48 0.01 250); /* #5F6368 */ + + /* Accent */ + --accent: oklch(0.965 0.002 250); + --accent-foreground: oklch(0.20 0 0); + + /* Destructive */ + --destructive: oklch(0.48 0.195 22); /* #C8102E */ + + /* Borders / inputs */ + --border: oklch(0.90 0.004 250); /* ~#DDDFE3 */ + --input: oklch(0.90 0.004 250); + --ring: oklch(0.48 0.195 22); + + /* Charts */ + --chart-1: oklch(0.48 0.195 22); /* ScanLab red */ + --chart-2: oklch(0.60 0.12 185); /* teal */ + --chart-3: oklch(0.55 0.10 260); /* blue-gray */ + --chart-4: oklch(0.72 0.16 85); /* amber */ + --chart-5: oklch(0.58 0.15 145); /* green */ + + /* Sidebar */ + --sidebar: oklch(1.0 0 0); + --sidebar-foreground: oklch(0.20 0 0); + --sidebar-primary: oklch(0.48 0.195 22); + --sidebar-primary-foreground: oklch(1.0 0 0); + --sidebar-accent: oklch(0.965 0.002 250); + --sidebar-accent-foreground: oklch(0.20 0 0); + --sidebar-border: oklch(0.90 0.004 250); + --sidebar-ring: oklch(0.48 0.195 22); + + /* Toolbar */ + --toolbar: oklch(0.30 0.005 250); + --toolbar-foreground: oklch(1.0 0 0); +} + +.dark { + --background: oklch(0.17 0.01 250); /* #1E2228 */ + --foreground: oklch(0.93 0.005 250); /* #E2E8F0 */ + --card: oklch(0.22 0.01 250); /* #2A2F38 */ + --card-foreground: oklch(0.93 0.005 250); + --popover: oklch(0.22 0.01 250); + --popover-foreground: oklch(0.93 0.005 250); + --primary: oklch(0.58 0.195 22); /* lighter red for dark bg */ + --primary-foreground: oklch(1.0 0 0); + --secondary: oklch(0.26 0.01 250); + --secondary-foreground: oklch(0.93 0.005 250); + --muted: oklch(0.26 0.01 250); + --muted-foreground: oklch(0.65 0.01 250); + --accent: oklch(0.26 0.01 250); + --accent-foreground: oklch(0.93 0.005 250); + --destructive: oklch(0.58 0.195 22); + --border: oklch(0.32 0.01 250); + --input: oklch(0.32 0.01 250); + --ring: oklch(0.58 0.195 22); + --chart-1: oklch(0.58 0.195 22); + --chart-2: oklch(0.65 0.14 185); + --chart-3: oklch(0.60 0.12 260); + --chart-4: oklch(0.75 0.18 85); + --chart-5: oklch(0.62 0.17 145); + --sidebar: oklch(0.22 0.01 250); + --sidebar-foreground: oklch(0.93 0.005 250); + --sidebar-primary: oklch(0.58 0.195 22); + --sidebar-primary-foreground: oklch(1.0 0 0); + --sidebar-accent: oklch(0.26 0.01 250); + --sidebar-accent-foreground: oklch(0.93 0.005 250); + --sidebar-border: oklch(0.32 0.01 250); + --sidebar-ring: oklch(0.58 0.195 22); + + --toolbar: oklch(0.20 0.005 250); + --toolbar-foreground: oklch(0.93 0.005 250); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --color-toolbar: var(--toolbar); + --color-toolbar-foreground: var(--toolbar-foreground); + --font-sans: "Segoe UI", "Inter", "Helvetica Neue", Arial, sans-serif; + --font-mono: "Cascadia Code", "Fira Code", Consolas, monospace; +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground font-sans; + } +} diff --git a/Client/svelte/static/robots.txt b/Client/svelte/static/robots.txt new file mode 100644 index 000000000..b6dd6670c --- /dev/null +++ b/Client/svelte/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/Client/svelte/svelte.config.js b/Client/svelte/svelte.config.js new file mode 100644 index 000000000..061d940e1 --- /dev/null +++ b/Client/svelte/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-static'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter({ + pages: 'dist', + assets: 'dist', + fallback: 'index.html', + strict: false, + }), + alias: { + '@core': '../core', + }, + }, +}; + +export default config; diff --git a/Client/svelte/tsconfig.json b/Client/svelte/tsconfig.json new file mode 100644 index 000000000..2c2ed3c4d --- /dev/null +++ b/Client/svelte/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/Client/svelte/vite.config.ts b/Client/svelte/vite.config.ts new file mode 100644 index 000000000..6a0c9545f --- /dev/null +++ b/Client/svelte/vite.config.ts @@ -0,0 +1,22 @@ +import tailwindcss from '@tailwindcss/vite'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; +import path from 'path'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], + resolve: { + alias: { + '@core': path.resolve(__dirname, '../core'), + }, + // @core files (../core) import packages like axios that live in + // this project's node_modules. Without dedupe, Vite walks up from + // Client/core/ and fails to find them. + dedupe: ['axios', 'luxon', 'three'], + }, + server: { + fs: { + allow: [path.resolve(__dirname, '..')], + }, + }, +}); diff --git a/Client/babel.config.js b/Client/vue2/babel.config.js similarity index 100% rename from Client/babel.config.js rename to Client/vue2/babel.config.js diff --git a/Client/package-lock.json b/Client/vue2/package-lock.json similarity index 66% rename from Client/package-lock.json rename to Client/vue2/package-lock.json index b1388106b..c81fc8796 100644 --- a/Client/package-lock.json +++ b/Client/vue2/package-lock.json @@ -9,8 +9,7 @@ "version": "0.1.0", "dependencies": { "@mdi/font": "^7.1.96", - "apexcharts": "^3.44.0", - "asmcrypto-lite": "^1.1.0", + "apexcharts": "^4.0.0", "axios": "^0.24.0", "luxon": "^3.2.1", "roboto-fontface": "^0.10.0", @@ -35,75 +34,67 @@ } }, "node_modules/@achrinza/node-ipc": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.6.tgz", - "integrity": "sha512-ULSIYPy4ZPM301dfCxRz0l2GJjOwIo/PqmWonIu1bLml7UmnVQmH+juJcoyXp6E8gIRRNAjGYftJnNQlfy4vPg==", + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.10.tgz", + "integrity": "sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A==", "dev": true, + "license": "MIT", "dependencies": { "@node-ipc/js-queue": "2.0.3", "event-pubsub": "4.3.0", "js-message": "1.0.7" }, "engines": { - "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22 || 23 || 24 || 25" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -114,119 +105,85 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", - "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", + "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", "dev": true, + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -236,13 +193,15 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -252,142 +211,111 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.22.11" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -397,146 +325,150 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -546,14 +478,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -562,29 +495,30 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -596,35 +530,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -632,14 +561,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -648,30 +577,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -680,14 +606,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -696,14 +622,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -712,33 +638,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -747,14 +671,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -763,15 +689,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -780,14 +707,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -796,16 +723,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -814,53 +739,70 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -869,13 +811,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -884,64 +828,81 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -950,85 +911,113 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1037,13 +1026,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1052,13 +1042,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1067,15 +1059,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1084,13 +1076,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1099,13 +1095,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1114,37 +1112,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1153,13 +1145,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1168,14 +1161,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1184,13 +1177,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1199,14 +1197,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1215,13 +1214,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1230,15 +1230,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1247,13 +1247,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1262,13 +1263,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1277,14 +1280,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1293,15 +1298,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1310,16 +1314,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1328,30 +1330,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1360,29 +1347,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1391,13 +1363,19 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1406,13 +1384,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1421,14 +1400,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1437,13 +1417,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1452,18 +1433,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1472,13 +1449,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1487,14 +1465,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1503,13 +1481,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1518,13 +1498,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1533,28 +1515,100 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz", + "integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1563,189 +1617,87 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", + "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", - "dev": true, + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1756,19 +1708,63 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1783,56 +1779,43 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1844,6 +1827,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1853,98 +1837,93 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" }, "node_modules/@mdi/font": { - "version": "7.1.96", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.1.96.tgz", - "integrity": "sha512-Imag6npmfkBDi2Ze2jiZVAPTDIKLxhz2Sx82xJ2zctyAU5LYJejLI5ChnDwiD9bMkQfVuzEsI98Q8toHyC+HCg==" + "version": "7.4.47", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", + "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", + "license": "Apache-2.0" }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } @@ -1954,6 +1933,7 @@ "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", "dev": true, + "license": "MIT", "dependencies": { "easy-stack": "1.0.1" }, @@ -1966,6 +1946,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1979,6 +1960,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -1988,6 +1970,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1996,353 +1979,791 @@ "node": ">= 8" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@soda/friendly-errors-webpack-plugin": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", - "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "error-stack-parser": "^2.0.6", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8.0.0" + "node": ">= 10.0.0" }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=7.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "has-flag": "^4.0.0" + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/@soda/get-current-script": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@svgdotjs/svg.draggable.js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", + "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", + "license": "MIT", + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", + "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.5.tgz", + "integrity": "sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz", + "integrity": "sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10.13.0" } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "18.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz", - "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==", - "dev": true + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/mime": "*", + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/@vue/babel-helper-vue-jsx-merge-props": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" }, "node_modules/@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", - "svg-tags": "^1.0.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@vue/babel-plugin-transform-vue-jsx": { @@ -2350,6 +2771,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0", @@ -2362,20 +2784,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@vue/babel-preset-app": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz", - "integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.9.tgz", + "integrity": "sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.12.16", "@babel/helper-compilation-targets": "^7.12.16", @@ -2408,26 +2822,12 @@ } } }, - "node_modules/@vue/babel-preset-app/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@vue/babel-preset-app/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2435,17 +2835,12 @@ "node": ">=10" } }, - "node_modules/@vue/babel-preset-app/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@vue/babel-preset-jsx": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", "dev": true, + "license": "MIT", "dependencies": { "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", @@ -2471,6 +2866,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0" }, @@ -2483,6 +2879,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0" }, @@ -2495,6 +2892,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0" }, @@ -2507,6 +2905,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0" }, @@ -2519,6 +2918,7 @@ "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0", "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", @@ -2531,29 +2931,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@vue/babel-sugar-v-on": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-jsx": "^7.2.0", "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", @@ -2563,30 +2946,23 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@vue/cli-overlay": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz", - "integrity": "sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==", - "dev": true + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.9.tgz", + "integrity": "sha512-aBdZWrYKxLuFz1FDsk/muFD7GycrsW73Gi11yRc7R2W7Bm8mDRc9HKAI790gdg4NV+chkDFmfkegjg5iMDEpAA==", + "dev": true, + "license": "MIT" }, "node_modules/@vue/cli-plugin-babel": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz", - "integrity": "sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.9.tgz", + "integrity": "sha512-oDZt1Kfe4KGNtig3/3zFo2pIeDJij2uS0M6S+tAqQno4Zpla2D8Hk/AR5PrstUd/HmhHZYJoGyF78MOfj3SbWg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.12.16", - "@vue/babel-preset-app": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", + "@vue/babel-preset-app": "^5.0.9", + "@vue/cli-shared-utils": "^5.0.9", "babel-loader": "^8.2.2", "thread-loader": "^3.0.0", "webpack": "^5.54.0" @@ -2596,12 +2972,13 @@ } }, "node_modules/@vue/cli-plugin-eslint": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz", - "integrity": "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.9.tgz", + "integrity": "sha512-OfAa85qhP0dKSprI8+9qjbXW8BzOlOvEtXwdrTrAKlD6aN8oa/u6k4vbfJGdYbpsbpkj8FXYdCRkTgNG8KZbxg==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/cli-shared-utils": "^5.0.8", + "@vue/cli-shared-utils": "^5.0.9", "eslint-webpack-plugin": "^3.1.0", "globby": "^11.0.2", "webpack": "^5.54.0", @@ -2613,40 +2990,43 @@ } }, "node_modules/@vue/cli-plugin-router": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz", - "integrity": "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.9.tgz", + "integrity": "sha512-kopbO/8kIl5CAffwgptXEwV509i+M0FfwW4sSkgQ2RzpxOYBjQZvp+096mjZfFcWKSmryNP/ri/Mnu78vmhlhw==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/cli-shared-utils": "^5.0.8" + "@vue/cli-shared-utils": "^5.0.9" }, "peerDependencies": { "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" } }, "node_modules/@vue/cli-plugin-vuex": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz", - "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.9.tgz", + "integrity": "sha512-AQhgGNFVd4Pu2crvS0a+hRckgrJv07gzOASdbLd3I72wkT43dd01MLRp8IBRRsu92t3MXenW86AZUCbQBz3//A==", "dev": true, + "license": "MIT", "peerDependencies": { "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" } }, "node_modules/@vue/cli-service": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.8.tgz", - "integrity": "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.9.tgz", + "integrity": "sha512-yTX7GVyM19tEbd+y5/gA6MkVKA6K61nVYHYAivD61Hx6odVFmQsaC3/R3cWAHM1P5oVKCevBbumPljbT+tFG2w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.12.16", "@soda/friendly-errors-webpack-plugin": "^1.8.0", "@soda/get-current-script": "^1.0.2", "@types/minimist": "^1.2.0", - "@vue/cli-overlay": "^5.0.8", - "@vue/cli-plugin-router": "^5.0.8", - "@vue/cli-plugin-vuex": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", + "@vue/cli-overlay": "^5.0.9", + "@vue/cli-plugin-router": "^5.0.9", + "@vue/cli-plugin-vuex": "^5.0.9", + "@vue/cli-shared-utils": "^5.0.9", "@vue/component-compiler-utils": "^3.3.0", "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", "@vue/web-component-wrapper": "^1.3.0", @@ -2733,10 +3113,11 @@ } }, "node_modules/@vue/cli-shared-utils": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", - "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.9.tgz", + "integrity": "sha512-lf4KykiG8j9KwvNVi7fKtASmHuLsxCcCsflVU2b2CHMRuR4weOIV3zuuCrjWKjk0APn/MHJhgCjJGzHMbTtd5w==", "dev": true, + "license": "MIT", "dependencies": { "@achrinza/node-ipc": "^9.2.5", "chalk": "^4.1.2", @@ -2752,26 +3133,12 @@ "strip-ansi": "^6.0.0" } }, - "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@vue/cli-shared-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2783,38 +3150,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@vue/cli-shared-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@vue/cli-shared-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@vue/cli-shared-utils/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2823,13 +3164,11 @@ } }, "node_modules/@vue/cli-shared-utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2837,32 +3176,65 @@ "node": ">=10" } }, - "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@vue/cli-shared-utils/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", + "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", + "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" + } }, "node_modules/@vue/compiler-sfc": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", - "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", + "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.18.4", - "postcss": "^8.4.14", - "source-map": "^0.6.1" + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.28", + "@vue/compiler-dom": "3.5.28", + "@vue/compiler-ssr": "3.5.28", + "@vue/shared": "3.5.28", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", + "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.28", + "@vue/shared": "3.5.28" } }, "node_modules/@vue/component-compiler-utils": { @@ -2870,6 +3242,7 @@ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", "dev": true, + "license": "MIT", "dependencies": { "consolidate": "^0.15.1", "hash-sum": "^1.0.2", @@ -2888,13 +3261,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, + "license": "ISC", "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -2904,13 +3279,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@vue/component-compiler-utils/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -2927,7 +3304,15 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/shared": { + "version": "3.5.28", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", + "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", + "dev": true, + "license": "MIT" }, "node_modules/@vue/vue-loader-v15": { "name": "vue-loader", @@ -2935,6 +3320,7 @@ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", "dev": true, + "license": "MIT", "dependencies": { "@vue/component-compiler-utils": "^3.1.0", "hash-sum": "^1.0.2", @@ -2962,157 +3348,174 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@vue/web-component-wrapper": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -3120,24 +3523,28 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yr/monotone-cubic-spline": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", - "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==" + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3146,11 +3553,22 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3158,13 +3576,17 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { @@ -3172,15 +3594,20 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -3190,15 +3617,17 @@ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3215,6 +3644,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3228,15 +3658,16 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3247,13 +3678,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -3263,6 +3696,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3275,6 +3709,7 @@ "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -3284,33 +3719,40 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3320,17 +3762,17 @@ } }, "node_modules/apexcharts": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.44.0.tgz", - "integrity": "sha512-u7Xzrbcxc2yWznN78Jh5NMCYVAsWDfBjRl5ea++rVzFAqjU2hLz4RgKIFwYOBDRQtW1e/Qz8azJTqIJ1+Vu9Qg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", + "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", + "license": "MIT", "dependencies": { - "@yr/monotone-cubic-spline": "^1.0.3", - "svg.draggable.js": "^2.2.2", - "svg.easing.js": "^2.0.0", - "svg.filter.js": "^2.0.2", - "svg.pathmorphing.js": "^0.1.3", - "svg.resize.js": "^1.4.3", - "svg.select.js": "^3.0.1" + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" } }, "node_modules/arch": { @@ -3351,59 +3793,54 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/asmcrypto-lite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/asmcrypto-lite/-/asmcrypto-lite-1.1.0.tgz", - "integrity": "sha512-nlIeR0DzHGczSC00K2mjPdltSymV/FjaCrGDcc+5OQkZBVUY32x1z4vXyFvThZuy0MRZpQDTAKMBAS87hxetJw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "dev": true, "funding": [ { @@ -3413,14 +3850,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -3437,18 +3878,20 @@ "version": "0.24.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.14.4" } }, "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", + "loader-utils": "^2.0.4", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -3465,6 +3908,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -3479,54 +3923,59 @@ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, + "license": "MIT", "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.6.6" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -3546,30 +3995,50 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -3577,6 +4046,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3587,46 +4057,40 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", + "bytes": "~3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3635,16 +4099,16 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, + "license": "MIT", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -3653,34 +4117,37 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -3690,13 +4157,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -3724,6 +4197,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -3733,25 +4207,64 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3771,6 +4284,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3780,21 +4294,20 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-api": { @@ -3802,6 +4315,7 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -3810,9 +4324,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001457", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", - "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", + "version": "1.0.30001772", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001772.tgz", + "integrity": "sha512-mIwLZICj+ntVTw4BT2zfp+yu/AqV6GMKfJVJMx3MwPxs+uk/uj2GLl2dH8LQbjiLDX66amCga5nKFyDgRR43kg==", "dev": true, "funding": [ { @@ -3822,76 +4336,60 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" + "node": ">= 14.16.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } @@ -3900,13 +4398,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -3919,6 +4419,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -3931,6 +4432,7 @@ "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, + "license": "ISC", "dependencies": { "chalk": "^4.0.0", "highlight.js": "^10.7.1", @@ -3947,26 +4449,12 @@ "npm": ">=5.0.0" } }, - "node_modules/cli-highlight/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/cli-highlight/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3978,50 +4466,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cli-highlight/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cli-highlight/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -4034,6 +4484,7 @@ "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", "dev": true, + "license": "MIT", "dependencies": { "arch": "^2.1.1", "execa": "^1.0.0", @@ -4048,6 +4499,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4059,6 +4511,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -4068,6 +4521,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -4078,37 +4532,45 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } @@ -4117,13 +4579,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -4132,17 +4596,18 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -4154,6 +4619,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4162,25 +4628,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -4189,7 +4652,9 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", "dev": true, + "license": "MIT", "dependencies": { "bluebird": "^3.1.1" }, @@ -4202,6 +4667,7 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -4214,36 +4680,41 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" }, "node_modules/copy-webpack-plugin": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", @@ -4264,10 +4735,11 @@ } }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -4282,23 +4754,25 @@ } }, "node_modules/core-js": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", - "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz", - "integrity": "sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -4309,13 +4783,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -4328,35 +4804,26 @@ } }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">= 8" } }, "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >=14" }, @@ -4365,19 +4832,20 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -4387,29 +4855,24 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4417,17 +4880,12 @@ "node": ">=10" } }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", "dev": true, + "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -4462,15 +4920,16 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4482,6 +4941,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -4493,21 +4953,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -4519,6 +4981,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -4535,6 +4998,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -4544,10 +5008,11 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -4560,6 +5025,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -4572,6 +5038,7 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, + "license": "MIT", "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", @@ -4593,6 +5060,7 @@ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dev": true, + "license": "MIT", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", @@ -4636,6 +5104,7 @@ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -4648,6 +5117,7 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, + "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -4656,23 +5126,33 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4684,10 +5164,11 @@ } }, "node_modules/decache": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.1.tgz", - "integrity": "sha512-ohApBM8u9ygepJCjgBrEZSSxPjc0T/PJkD+uNyxXPkqudyUpdXpwJYp0VISm2WrPVzASU6DZyIi6BWdyw7uJ2Q==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", + "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", "dev": true, + "license": "MIT", "dependencies": { "callsite": "^1.0.0" } @@ -4696,13 +5177,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4712,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -4719,25 +5203,12 @@ "node": ">= 10" } }, - "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/default-gateway/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -4761,6 +5232,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4773,6 +5245,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4785,6 +5258,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -4792,61 +5266,35 @@ "node": ">=8" } }, - "node_modules/default-gateway/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "clone": "^1.0.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -4854,16 +5302,19 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4879,6 +5330,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4888,22 +5340,36 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -4911,17 +5377,12 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -4934,6 +5395,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4946,6 +5408,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, + "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -4955,6 +5418,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -4964,6 +5428,16 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -4974,13 +5448,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -4996,6 +5472,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -5010,6 +5487,7 @@ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -5020,6 +5498,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=10" } @@ -5028,19 +5507,37 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/easy-stack": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -5049,74 +5546,86 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.310", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.310.tgz", - "integrity": "sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA==", - "dev": true + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -5126,21 +5635,57 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dev": true, + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5149,61 +5694,67 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5217,46 +5768,34 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz", - "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", + "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-utils": "^3.0.0", + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.0.1", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-vue/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5264,436 +5803,210 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-vue/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": ">=10" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=10" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "has-flag": "^4.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8" + "node": ">=4.0" } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5702,11 +6015,25 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -5719,6 +6046,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -5728,6 +6056,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -5740,6 +6069,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -5749,15 +6079,24 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -5767,6 +6106,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5776,6 +6116,7 @@ "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=4.0.0" } @@ -5784,13 +6125,15 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -5800,6 +6143,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -5813,59 +6157,132 @@ "node": ">=6" } }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5874,25 +6291,28 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -5903,6 +6323,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -5914,19 +6335,39 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -5936,6 +6377,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -5948,6 +6390,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -5955,11 +6398,22 @@ "node": ">=4" } }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -5972,6 +6426,7 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -5992,6 +6447,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -6002,10 +6458,11 @@ } }, "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -6020,10 +6477,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6032,17 +6490,18 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -6054,6 +6513,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6062,13 +6522,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -6082,25 +6544,41 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -6108,21 +6586,23 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -6137,21 +6617,23 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -6159,6 +6641,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6168,6 +6651,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -6179,23 +6663,26 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6205,16 +6692,21 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -6224,29 +6716,56 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -6258,7 +6777,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6279,6 +6800,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -6290,15 +6812,23 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { @@ -6306,6 +6836,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6321,23 +6852,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, + "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -6352,46 +6899,38 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "license": "MIT" }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6403,13 +6942,28 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -6419,6 +6973,7 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -6427,13 +6982,15 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -6446,6 +7003,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6460,28 +7018,49 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -6499,22 +7078,21 @@ } }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.6.tgz", + "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "dev": true, + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -6530,7 +7108,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -6545,6 +7132,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -6552,39 +7140,57 @@ "entities": "^2.0.0" } }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -6595,10 +7201,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -6623,6 +7230,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -6632,6 +7240,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6644,6 +7253,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -6669,28 +7279,32 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6707,6 +7321,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -6715,7 +7330,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6725,22 +7342,25 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -6749,13 +7369,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6768,6 +7390,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, + "license": "MIT", "dependencies": { "ci-info": "^1.5.0" }, @@ -6776,12 +7399,16 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6792,6 +7419,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -6807,6 +7435,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6816,6 +7445,7 @@ "resolved": "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz", "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", "dev": true, + "license": "MIT", "dependencies": { "read-pkg-up": "^7.0.1" } @@ -6825,6 +7455,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6834,6 +7465,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6846,6 +7478,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6855,6 +7488,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -6864,6 +7498,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6873,6 +7508,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6885,6 +7521,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -6897,6 +7534,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6906,6 +7544,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6918,6 +7557,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -6929,19 +7569,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6950,13 +7593,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -6966,20 +7611,12 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6991,14 +7628,15 @@ } }, "node_modules/joi": { - "version": "17.8.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.8.3.tgz", - "integrity": "sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -7008,31 +7646,24 @@ "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.0" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7041,46 +7672,59 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -7089,10 +7733,11 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -7100,11 +7745,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7114,27 +7770,30 @@ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.0.tgz", + "integrity": "sha512-u+9asUHMJ99lA15VRMXw5XKfySFR9dGXwgsgS14YTbUq3GITP58mIM32At90P5fZ+MUId5Yw+IwI/yKub7jnCQ==", "dev": true, + "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, "node_modules/launch-editor-middleware": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.6.0.tgz", - "integrity": "sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.13.0.tgz", + "integrity": "sha512-P+JODAmo6+3oloE9NE+TW1VLktGUrcsf70CYO61AVcrPRfgf2SWNmdlItdkoa9tzR58HN9dRvrW650s6vwsfVQ==", "dev": true, + "license": "MIT", "dependencies": { - "launch-editor": "^2.6.0" + "launch-editor": "^2.13.0" } }, "node_modules/levn": { @@ -7142,6 +7801,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7151,10 +7811,11 @@ } }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -7163,15 +7824,21 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -7179,6 +7846,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7193,6 +7861,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7201,70 +7870,83 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.mapvalues": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -7276,26 +7958,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7307,50 +7975,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^3.0.0", "cli-cursor": "^2.0.0", @@ -7365,6 +7995,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7374,6 +8005,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -7386,6 +8018,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7395,6 +8028,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7404,6 +8038,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -7416,6 +8051,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -7429,6 +8065,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -7442,6 +8079,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -7454,6 +8092,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0" @@ -7467,6 +8106,7 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -7476,23 +8116,36 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/luxon": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", - "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", "engines": { "node": ">=12" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -7503,44 +8156,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, + "license": "Unlicense", "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, + "license": "MIT", "dependencies": { "source-map": "^0.6.1" } @@ -7549,13 +8220,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -7565,17 +8238,19 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -7587,6 +8262,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -7599,6 +8275,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7608,6 +8285,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -7620,17 +8298,20 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", + "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", "dev": true, + "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -7644,15 +8325,16 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -7664,6 +8346,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -7675,21 +8358,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -7700,13 +8385,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7719,6 +8406,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7728,6 +8416,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7739,46 +8428,39 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "license": "ISC" }, "node_modules/module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", - "dev": true + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.3.4.tgz", + "integrity": "sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==", + "dev": true, + "license": "MIT" }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -7792,6 +8474,7 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -7799,15 +8482,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7819,13 +8503,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7834,29 +8520,41 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7873,25 +8571,28 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -7904,6 +8605,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -7913,15 +8615,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7931,6 +8625,7 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -7943,6 +8638,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -7950,11 +8646,22 @@ "node": ">=4" } }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -7967,6 +8674,7 @@ "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -7987,6 +8695,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7997,10 +8706,11 @@ } }, "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -8019,15 +8729,20 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8037,19 +8752,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -8063,13 +8782,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -8078,10 +8799,11 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8091,6 +8813,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -8100,6 +8823,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -8115,6 +8839,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -8132,22 +8857,24 @@ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -8158,6 +8885,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -8176,26 +8904,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8207,79 +8921,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { @@ -8287,6 +8968,7 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -8300,6 +8982,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8309,6 +8992,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -8319,6 +9003,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -8331,6 +9016,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -8348,13 +9034,15 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } @@ -8363,13 +9051,15 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8379,6 +9069,7 @@ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -8389,6 +9080,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8398,50 +9090,57 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8454,6 +9153,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -8461,33 +9161,80 @@ "node": ">=8" } }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.12.0" + "node": ">=8" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -8502,10 +9249,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -8516,6 +9264,7 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" @@ -8529,6 +9278,7 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -8547,6 +9297,7 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -8563,6 +9314,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8575,6 +9327,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8587,6 +9340,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8599,6 +9353,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8611,6 +9366,7 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -8628,26 +9384,12 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8655,17 +9397,12 @@ "node": ">=10" } }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/postcss-merge-longhand": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" @@ -8682,6 +9419,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", @@ -8700,6 +9438,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8715,6 +9454,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, + "license": "MIT", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", @@ -8732,6 +9472,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", @@ -8749,6 +9490,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -8760,10 +9502,11 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -8772,13 +9515,14 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -8788,13 +9532,28 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -8803,11 +9562,26 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -8823,6 +9597,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "dev": true, + "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -8835,6 +9610,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8850,6 +9626,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8865,6 +9642,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8880,6 +9658,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8895,6 +9674,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8910,6 +9690,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" @@ -8926,6 +9707,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, + "license": "MIT", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -8942,6 +9724,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -8957,6 +9740,7 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, + "license": "MIT", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -8973,6 +9757,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" @@ -8989,6 +9774,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -9000,10 +9786,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -9017,6 +9804,7 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" @@ -9033,6 +9821,7 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -9047,22 +9836,24 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", - "dev": true, + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", "optional": true, "bin": { "prettier": "bin-prettier.js" @@ -9079,6 +9870,7 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -9088,13 +9880,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/progress-webpack-plugin": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^2.1.0", "figures": "^2.0.0", @@ -9107,11 +9901,90 @@ "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/progress-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/progress-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/progress-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/progress-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -9125,6 +9998,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -9133,34 +10007,38 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -9187,13 +10065,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -9203,39 +10083,33 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -9251,6 +10125,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -9258,9 +10133,65 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/read-pkg-up/node_modules/type-fest": { @@ -9268,15 +10199,27 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9287,15 +10230,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { @@ -9314,13 +10259,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -9328,76 +10275,50 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", - "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -9407,6 +10328,7 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -9420,6 +10342,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9429,6 +10352,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9437,21 +10361,26 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9461,6 +10390,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9470,6 +10400,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9483,15 +10414,17 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -9501,7 +10434,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -9515,7 +10450,8 @@ "node_modules/roboto-fontface": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" + "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==", + "license": "Apache-2.0" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -9536,6 +10472,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -9558,38 +10495,44 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "version": "1.97.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", + "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", + "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", "dev": true, + "license": "MIT", "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { @@ -9601,7 +10544,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -9626,6 +10569,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -9643,14 +10587,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -9662,29 +10609,31 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -9695,6 +10644,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9703,39 +10653,40 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/debug": { @@ -9743,6 +10694,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9752,78 +10704,92 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -9832,31 +10798,37 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9866,6 +10838,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -9879,14 +10852,76 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9896,17 +10931,19 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, + "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -9917,6 +10954,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9926,6 +10964,7 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -9936,14 +10975,16 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -9953,48 +10994,54 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -10011,6 +11058,7 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -10025,6 +11073,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -10037,19 +11086,22 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10059,6 +11111,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -10068,6 +11121,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10082,6 +11136,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10094,6 +11149,7 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10103,6 +11159,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10112,6 +11169,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10121,6 +11179,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10128,140 +11187,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "node_modules/svg.draggable.js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", - "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", - "dependencies": { - "svg.js": "^2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/svg.easing.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", - "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", - "dependencies": { - "svg.js": ">=2.3.x" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/svg.filter.js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", - "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", - "dependencies": { - "svg.js": "^2.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/svg.js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", - "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" - }, - "node_modules/svg.pathmorphing.js": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", - "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", - "dependencies": { - "svg.js": "^2.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/svg.resize.js": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", - "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "license": "MIT", "dependencies": { - "svg.js": "^2.6.5", - "svg.select.js": "^2.1.2" + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">= 0.8.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/svg.resize.js/node_modules/svg.select.js": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", - "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", "dependencies": { - "svg.js": "^2.2.5" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/svg.select.js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", - "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", - "dependencies": { - "svg.js": "^2.6.5" - }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -10283,27 +11263,34 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -10315,16 +11302,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -10348,15 +11336,54 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -10370,19 +11397,22 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -10392,6 +11422,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -10404,6 +11435,7 @@ "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", "dev": true, + "license": "MIT", "dependencies": { "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.1.0", @@ -10427,6 +11459,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -10437,10 +11470,11 @@ } }, "node_modules/thread-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -10457,33 +11491,28 @@ "node_modules/three": { "version": "0.156.1", "resolved": "https://registry.npmjs.org/three/-/three-0.156.1.tgz", - "integrity": "sha512-kP7H0FK9d/k6t/XvQ9FO6i+QrePoDcNhwl0I02+wmUJRNSLCUIDMcfObnzQvxb37/0Uc9TDT0T1HgsRRrO6SYQ==" + "integrity": "sha512-kP7H0FK9d/k6t/XvQ9FO6i+QrePoDcNhwl0I02+wmUJRNSLCUIDMcfObnzQvxb37/0Uc9TDT0T1HgsRRrO6SYQ==", + "license": "MIT" }, "node_modules/three-svg-loader": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/three-svg-loader/-/three-svg-loader-0.3.1.tgz", - "integrity": "sha512-GIWk/dYhubiXiamOeM0xAfrCTnHy9htgFrftEQhHErsacjVtXxO1vO0jUIC+vDZ7l03e880pBZFLfVImxjolpQ==" + "integrity": "sha512-GIWk/dYhubiXiamOeM0xAfrCTnHy9htgFrftEQhHErsacjVtXxO1vO0jUIC+vDZ7l03e880pBZFLfVImxjolpQ==", + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -10496,15 +11525,17 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10513,19 +11544,22 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -10534,12 +11568,16 @@ } }, "node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -10547,6 +11585,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -10555,11 +11594,19 @@ "node": ">= 0.6" } }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10569,6 +11616,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -10578,28 +11626,31 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -10609,14 +11660,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -10626,14 +11678,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -10644,6 +11701,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -10652,19 +11710,22 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -10674,6 +11735,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -10683,6 +11745,7 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -10693,25 +11756,30 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vue": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", - "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "license": "MIT", "dependencies": { - "@vue/compiler-sfc": "2.7.14", + "@vue/compiler-sfc": "2.7.16", "csstype": "^3.1.0" } }, "node_modules/vue-apexcharts": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.6.2.tgz", - "integrity": "sha512-9HS3scJwWgKjmkcWIf+ndNDR0WytUJD8Ju0V2ZYcjYtlTLwJAf2SKUlBZaQTkDmwje/zMgulvZRi+MXmi+WkKw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.7.0.tgz", + "integrity": "sha512-QMpvBllJ1XvFsK4dwcbyxKalVpHfJnoqsNWszY55HJk/Sn7WP1f5YUv4JIzugqu4GTQB6gLcCVwwPDQFtwr0oQ==", + "license": "MIT", "peerDependencies": { - "apexcharts": "^3.26.0" + "apexcharts": ">=4.0.0", + "vue": "^2.5.17" } }, "node_modules/vue-cli-plugin-vuetify": { @@ -10719,6 +11787,7 @@ "resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.5.8.tgz", "integrity": "sha512-uqi0/URJETJBbWlQHD1l0pnY7JN8Ytu+AL1fw50HFlGByPa8/xx+mq19GkFXA9FcwFT01IqEc/TkxMPugchomg==", "dev": true, + "license": "MIT", "dependencies": { "null-loader": "^4.0.1", "semver": "^7.1.2", @@ -10736,26 +11805,12 @@ } } }, - "node_modules/vue-cli-plugin-vuetify/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/vue-cli-plugin-vuetify/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -10763,17 +11818,12 @@ "node": ">=10" } }, - "node_modules/vue-cli-plugin-vuetify/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/vue-eslint-parser": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", - "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", @@ -10794,16 +11844,33 @@ } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/estraverse": { @@ -10811,30 +11878,17 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/vue-eslint-parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -10842,27 +11896,23 @@ "node": ">=10" } }, - "node_modules/vue-eslint-parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vue-loader": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.1.tgz", - "integrity": "sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==", + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", + "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" + "watchpack": "^2.4.0" }, "peerDependencies": { "webpack": "^4.1.0 || ^5.0.0-0" @@ -10876,26 +11926,12 @@ } } }, - "node_modules/vue-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/vue-loader/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10907,64 +11943,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/vue-loader/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/vue-loader/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/vue-loader/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/vue-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/vue-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", "dev": true, + "license": "MIT", "dependencies": { "hash-sum": "^1.0.2", "loader-utils": "^1.0.2" @@ -10974,13 +11958,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", "dev": true, + "license": "MIT", "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" @@ -10990,12 +11976,28 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/vue/node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } }, "node_modules/vuetify": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.6.14.tgz", - "integrity": "sha512-nr6wU3uTzhhEPssH23cW0Ee/hCrayp7cjl3nNjM2OmNwiJlV91tZiL1VO3597SqZyjh1xIa+m9J2rpKTSdIlrA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.7.2.tgz", + "integrity": "sha512-qr04ww7uzAPQbpk751x4fSdjsJ+zREzjQ/rBlcQGuWS6MIMFMXcXcwvp4+/tnGsULZxPMWfQ0kmZmg5Yc/XzgQ==", + "deprecated": "This version is deprecated", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/johnleider" @@ -11009,6 +12011,7 @@ "resolved": "https://registry.npmjs.org/vuetify-loader/-/vuetify-loader-1.9.2.tgz", "integrity": "sha512-8PP2w7aAs/rjA+Izec6qY7sHVb75MNrGQrDOTZJ5IEnvl+NiFhVpU2iWdRDZ3eMS842cWxSWStvkr+KJJKy+Iw==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.4.1", "acorn-walk": "^8.2.0", @@ -11041,6 +12044,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11051,10 +12055,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11068,6 +12073,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -11077,6 +12083,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -11085,38 +12092,41 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.105.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", + "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -11135,20 +12145,23 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "html-escaper": "^2.0.2", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -11158,90 +12171,23 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/webpack-chain": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, + "license": "MPL-2.0", "dependencies": { "deepmerge": "^1.5.2", "javascript-stringify": "^2.0.1" @@ -11251,10 +12197,11 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -11274,15 +12221,16 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -11294,6 +12242,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -11305,21 +12254,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -11327,10 +12278,11 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -11338,7 +12290,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -11351,6 +12303,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -11359,8 +12312,8 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -11376,21 +12329,25 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -11402,6 +12359,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -11409,25 +12367,78 @@ "ajv": "^8.8.2" } }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -11435,10 +12446,11 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -11456,12 +12468,14 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -11469,10 +12483,11 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -11481,17 +12496,57 @@ "version": "0.4.6", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -11506,6 +12561,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -11520,49 +12576,58 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true, + "license": "MIT" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11572,6 +12637,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11584,50 +12650,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -11649,6 +12684,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12" } @@ -11658,6 +12694,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -11666,13 +12703,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } @@ -11682,6 +12721,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -11700,6 +12740,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -11709,6 +12750,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -11722,6 +12764,7 @@ "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "execa": "^0.8.0", "is-ci": "^1.0.10", @@ -11737,6 +12780,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dev": true, + "license": "MIT", "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -11748,6 +12792,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -11766,6 +12811,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -11775,6 +12821,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, + "license": "ISC", "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -11785,15 +12832,53 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", "integrity": "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/yorkie/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/yorkie/node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "dev": true, + "license": "ISC" } } } diff --git a/Client/package.json b/Client/vue2/package.json similarity index 95% rename from Client/package.json rename to Client/vue2/package.json index 43d17cda1..ef726a616 100644 --- a/Client/package.json +++ b/Client/vue2/package.json @@ -9,8 +9,7 @@ }, "dependencies": { "@mdi/font": "^7.1.96", - "apexcharts": "^3.44.0", - "asmcrypto-lite": "^1.1.0", + "apexcharts": "^4.0.0", "axios": "^0.24.0", "luxon": "^3.2.1", "roboto-fontface": "^0.10.0", diff --git a/Client/package_template.json b/Client/vue2/package_template.json similarity index 100% rename from Client/package_template.json rename to Client/vue2/package_template.json diff --git a/Client/public/favicon.ico b/Client/vue2/public/favicon.ico similarity index 100% rename from Client/public/favicon.ico rename to Client/vue2/public/favicon.ico diff --git a/Client/public/index.html b/Client/vue2/public/index.html similarity index 100% rename from Client/public/index.html rename to Client/vue2/public/index.html diff --git a/Client/rebuild_dependencies.bat b/Client/vue2/rebuild_dependencies.bat similarity index 100% rename from Client/rebuild_dependencies.bat rename to Client/vue2/rebuild_dependencies.bat diff --git a/Client/src/App.vue b/Client/vue2/src/App.vue similarity index 66% rename from Client/src/App.vue rename to Client/vue2/src/App.vue index f1944ffdb..a2c364a0f 100644 --- a/Client/src/App.vue +++ b/Client/vue2/src/App.vue @@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - + - © {{ Application.AppDefinition.TextCopyRight }} + © {{ Application.AppDefinition.TextCopyRight }} - import AMCApplication from "./common/AMCApplication.js" + import AMCApplication from "@core/common/AMCApplication.js" import Dialog_Login from "./dialogs/Dialog_Login.vue"; import Dialog_Error from "./dialogs/Dialog_Error.vue"; - import Module_Content from "./modules/AMCModule_Content.vue"; - import Module_Tabs from "./modules/AMCModule_Tabs.vue"; - import Module_Grid from "./modules/AMCModule_Grid.vue"; - import Module_GLScene from "./modules/AMCModule_GLScene.vue"; - import Module_Graphic from "./modules/AMCModule_Graphic.vue"; - import Module_LayerView from "./modules/AMCModule_LayerView.vue"; - import Module_Logs from "./modules/AMCModule_Logs.vue"; + import Module_Factory from "./modules/AMCModule_Factory.vue"; import CustomPage_Example from "./CustomPage_Example.vue"; export default { created() { - this.GlobalTimer = setInterval(this.uiOnTimer, 600); - var baseURL = "/api"; if (process.env.NODE_ENV === "development") { baseURL = "http://localhost:8869/api"; @@ -215,8 +195,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. beforeDestroy() { - if (this.GlobalTimer) { - clearInterval(this.GlobalTimer); + if (this.Application) { + this.Application.stopFrontendUpdates(); } }, @@ -277,8 +257,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //if (this.appIsLogin) { - if (this.Application.AppDefinition.LoginBackgroundImageUUID) { - let imageurl = this.Application.getImageURL (this.Application.AppDefinition.LoginBackgroundImageUUID); + // Prefer the dark login background in dark mode, falling back to the light one. + let backgroundUUID = (this.$vuetify.theme.dark && this.Application.AppDefinition.DarkLoginBackgroundImageUUID) + ? this.Application.AppDefinition.DarkLoginBackgroundImageUUID + : this.Application.AppDefinition.LoginBackgroundImageUUID; + if (backgroundUUID) { + let imageurl = this.Application.getImageURL (backgroundUUID); mainStyle = mainStyle + "background-image: url(\"" + imageurl + "\"); background-size: cover; " } @@ -324,13 +308,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. components: { Dialog_Login, Dialog_Error, - Module_Content, - Module_Tabs, - Module_Logs, - Module_GLScene, - Module_Graphic, - Module_Grid, - Module_LayerView, + Module_Factory, CustomPage_Example }, @@ -350,13 +328,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. }, - uiOnTimer() { - if (this.Application) { - this.Application.updateModules (); - this.Application.updateContentItems (); - } - }, - uiUpdateAppSizeDeferred() { setTimeout(() => { this.uiUpdateAppSize (); @@ -384,19 +355,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. }, uiUpdateAppSize () { - - let height = window.innerHeight - this.$vuetify.application.footer - this.$vuetify.application.top; - let style = "height: " + height + "px; padding-top: 20px;"; - if (style != this.appContentDivStyle) { - this.appContentDivStyle = style; - } - - height = window.innerHeight - this.$vuetify.application.footer - this.$vuetify.application.top - 40; - style = "height: " + height + "px; background: rgba(255.0, 255.0, 255.0, 0.9); overflow:auto; margin:auto"; - if (style != this.appContentCardStyle) { - this.appContentCardStyle = style; - } - + // Height is handled by CSS flex layout; nothing to compute. } }, @@ -404,10 +363,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. data: () => ({ Application: null, - GlobalTimer: null, ShowDrawer: true, - appContentDivStyle: "", - appContentCardStyle: "", }) }; @@ -415,6 +371,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Client/src/CustomPage_Example.vue b/Client/vue2/src/CustomPage_Example.vue similarity index 100% rename from Client/src/CustomPage_Example.vue rename to Client/vue2/src/CustomPage_Example.vue diff --git a/Client/src/dialogs/Dialog_Error.vue b/Client/vue2/src/dialogs/Dialog_Error.vue similarity index 100% rename from Client/src/dialogs/Dialog_Error.vue rename to Client/vue2/src/dialogs/Dialog_Error.vue diff --git a/Client/vue2/src/dialogs/Dialog_Login.vue b/Client/vue2/src/dialogs/Dialog_Login.vue new file mode 100644 index 000000000..63e24513f --- /dev/null +++ b/Client/vue2/src/dialogs/Dialog_Login.vue @@ -0,0 +1,439 @@ + + + + + + + diff --git a/Client/src/main.js b/Client/vue2/src/main.js similarity index 80% rename from Client/src/main.js rename to Client/vue2/src/main.js index e9279225f..437ef8438 100644 --- a/Client/src/main.js +++ b/Client/vue2/src/main.js @@ -33,6 +33,15 @@ import App from './App.vue' import vuetify from './vuetify'; import 'roboto-fontface/css/roboto/roboto-fontface.css' import '@mdi/font/css/materialdesignicons.css' +import '@core/theme/tokens.css' +import { restoreHighContrastPreference } from '@core/theme/themeLoader.js' + +restoreHighContrastPreference (); + +// Register Module_Factory globally so container modules (Content, Grid, Tabs) +// can use it without importing it — eliminating the recursive component reference. +import Module_Factory from './modules/AMCModule_Factory.vue'; +Vue.component('Module_Factory', Module_Factory); Vue.config.productionTip = false diff --git a/Client/vue2/src/modules/AMCFormField.vue b/Client/vue2/src/modules/AMCFormField.vue new file mode 100644 index 000000000..edcc32cab --- /dev/null +++ b/Client/vue2/src/modules/AMCFormField.vue @@ -0,0 +1,216 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_AlertList.vue b/Client/vue2/src/modules/AMCModule_AlertList.vue new file mode 100644 index 000000000..46d21c41b --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_AlertList.vue @@ -0,0 +1,163 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_BuildList.vue b/Client/vue2/src/modules/AMCModule_BuildList.vue new file mode 100644 index 000000000..c4f931e75 --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_BuildList.vue @@ -0,0 +1,357 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_ButtonGroup.vue b/Client/vue2/src/modules/AMCModule_ButtonGroup.vue new file mode 100644 index 000000000..5e37821b4 --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_ButtonGroup.vue @@ -0,0 +1,172 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_Chart.vue b/Client/vue2/src/modules/AMCModule_Chart.vue new file mode 100644 index 000000000..e9965000d --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_Chart.vue @@ -0,0 +1,96 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_ConfigurationList.vue b/Client/vue2/src/modules/AMCModule_ConfigurationList.vue new file mode 100644 index 000000000..97f99e52c --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_ConfigurationList.vue @@ -0,0 +1,108 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_Content.vue b/Client/vue2/src/modules/AMCModule_Content.vue new file mode 100644 index 000000000..8790e6acc --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_Content.vue @@ -0,0 +1,224 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_ExecutionList.vue b/Client/vue2/src/modules/AMCModule_ExecutionList.vue new file mode 100644 index 000000000..68a2ea753 --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_ExecutionList.vue @@ -0,0 +1,469 @@ + + + + + + + diff --git a/Client/vue2/src/modules/AMCModule_Factory.vue b/Client/vue2/src/modules/AMCModule_Factory.vue new file mode 100644 index 000000000..ad52d02cf --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_Factory.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/Client/vue2/src/modules/AMCModule_Form.vue b/Client/vue2/src/modules/AMCModule_Form.vue new file mode 100644 index 000000000..37de27f8e --- /dev/null +++ b/Client/vue2/src/modules/AMCModule_Form.vue @@ -0,0 +1,631 @@ + + + + + + + diff --git a/Client/src/modules/AMCModule_GLScene.vue b/Client/vue2/src/modules/AMCModule_GLScene.vue similarity index 77% rename from Client/src/modules/AMCModule_GLScene.vue rename to Client/vue2/src/modules/AMCModule_GLScene.vue index 0b8158682..d21ed530b 100644 --- a/Client/src/modules/AMCModule_GLScene.vue +++ b/Client/vue2/src/modules/AMCModule_GLScene.vue @@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.