From 97b44a4db73a19a715109f659a747d4be152786b Mon Sep 17 00:00:00 2001 From: cracklesparkle Date: Tue, 20 Aug 2024 17:34:21 +0900 Subject: [PATCH] Rename; Added EMS server; redis compose --- .gitignore | 3 +- {frontend_reactjs => client}/.env.example | 0 {frontend_reactjs => client}/.eslintrc.cjs | 0 {frontend_reactjs => client}/.gitignore | 0 {frontend_reactjs => client}/Dockerfile | 0 {frontend_reactjs => client}/README.md | 0 client/bun.lockb | Bin 0 -> 363473 bytes {frontend_reactjs => client}/index.html | 0 .../package-lock.json | 523 ++++-- {frontend_reactjs => client}/package.json | 4 +- .../postcss.config.js | 0 {frontend_reactjs => client}/public/vite.svg | 0 {frontend_reactjs => client}/src/App.tsx | 11 +- .../src/assets/react.svg | 0 .../src/components/AccountMenu.tsx | 0 .../src/components/CardInfo/CardInfo.tsx | 0 .../src/components/CardInfo/CardInfoChip.tsx | 0 .../src/components/CardInfo/CardInfoLabel.tsx | 0 .../src/components/FetchingData.ts | 0 .../src/components/FolderViewer.tsx | 0 .../src/components/FormFields.tsx | 8 +- .../src/components/ServerData.tsx | 0 .../src/components/ServerHardware.tsx | 4 +- .../src/components/ServerIpsView.tsx | 0 .../src/components/ServerStorages.tsx | 0 .../src/components/ServersView.tsx | 0 .../src/components/TableEditable.tsx | 2 +- .../src/components/UserData.ts | 0 client/src/components/map/MapComponent.tsx | 175 ++ .../src/components/modals/FileViewer.tsx | 0 .../navigation/Drawer/ResponsiveDrawer.tsx | 0 .../src/components/navigation/NavTabs.tsx | 0 .../src/constants/index.ts | 0 .../src/hooks/swrHooks.ts | 0 .../src/http/axiosInstance.ts | 0 {frontend_reactjs => client}/src/index.css | 0 .../src/interfaces/auth.ts | 0 .../src/interfaces/create.ts | 0 .../src/interfaces/documents.ts | 0 .../src/interfaces/fuel.ts | 0 .../src/interfaces/preferences.ts | 0 .../src/interfaces/role.ts | 0 .../src/interfaces/servers.ts | 0 .../src/interfaces/user.ts | 0 .../src/layouts/DashboardLayout.tsx | 0 .../src/layouts/DashboardLayoutResponsive.tsx | 0 .../src/layouts/MainLayout.tsx | 0 {frontend_reactjs => client}/src/main.tsx | 18 +- .../src/pages/ApiTest.tsx | 0 .../src/pages/Boilers.tsx | 0 .../src/pages/Documents.tsx | 0 .../src/pages/Main.tsx | 0 client/src/pages/MapTest.tsx | 11 + .../src/pages/NotFound.tsx | 0 .../src/pages/Reports.tsx | 0 .../src/pages/Roles.tsx | 10 + .../src/pages/Servers.tsx | 0 .../src/pages/Settings.tsx | 0 .../src/pages/Users.tsx | 10 + .../src/pages/auth/PasswordReset.tsx | 0 .../src/pages/auth/SignIn.tsx | 8 +- .../src/pages/auth/SignUp.tsx | 0 .../src/services/AuthService.ts | 0 .../src/services/DocumentService.ts | 0 .../src/services/FuelService.ts | 0 .../src/services/RoleService.ts | 0 .../src/services/ServersService.ts | 0 .../src/services/UserService.ts | 0 .../src/store/auth.ts | 0 .../src/store/preferences.ts | 0 .../src/store/user.ts | 0 .../src/vite-env.d.ts | 0 .../tailwind.config.js | 0 {frontend_reactjs => client}/tsconfig.json | 0 .../tsconfig.node.json | 0 .../tsconfig.node.tsbuildinfo | 0 {frontend_reactjs => client}/vite.config.ts | 1 - {frontend_reactjs => client}/yarn.lock | 371 +++- docker-compose.yml | 46 +- ems/.gitignore | 24 + ems/Dockerfile | 22 + ems/package-lock.json | 1569 +++++++++++++++++ ems/package.json | 30 + ems/src/index.ts | 62 + ems/tsconfig.json | 108 ++ 85 files changed, 2832 insertions(+), 188 deletions(-) rename {frontend_reactjs => client}/.env.example (100%) rename {frontend_reactjs => client}/.eslintrc.cjs (100%) rename {frontend_reactjs => client}/.gitignore (100%) rename {frontend_reactjs => client}/Dockerfile (100%) rename {frontend_reactjs => client}/README.md (100%) create mode 100644 client/bun.lockb rename {frontend_reactjs => client}/index.html (100%) rename {frontend_reactjs => client}/package-lock.json (95%) rename {frontend_reactjs => client}/package.json (95%) rename {frontend_reactjs => client}/postcss.config.js (100%) rename {frontend_reactjs => client}/public/vite.svg (100%) rename {frontend_reactjs => client}/src/App.tsx (91%) rename {frontend_reactjs => client}/src/assets/react.svg (100%) rename {frontend_reactjs => client}/src/components/AccountMenu.tsx (100%) rename {frontend_reactjs => client}/src/components/CardInfo/CardInfo.tsx (100%) rename {frontend_reactjs => client}/src/components/CardInfo/CardInfoChip.tsx (100%) rename {frontend_reactjs => client}/src/components/CardInfo/CardInfoLabel.tsx (100%) rename {frontend_reactjs => client}/src/components/FetchingData.ts (100%) rename {frontend_reactjs => client}/src/components/FolderViewer.tsx (100%) rename {frontend_reactjs => client}/src/components/FormFields.tsx (93%) rename {frontend_reactjs => client}/src/components/ServerData.tsx (100%) rename {frontend_reactjs => client}/src/components/ServerHardware.tsx (98%) rename {frontend_reactjs => client}/src/components/ServerIpsView.tsx (100%) rename {frontend_reactjs => client}/src/components/ServerStorages.tsx (100%) rename {frontend_reactjs => client}/src/components/ServersView.tsx (100%) rename {frontend_reactjs => client}/src/components/TableEditable.tsx (99%) rename {frontend_reactjs => client}/src/components/UserData.ts (100%) create mode 100644 client/src/components/map/MapComponent.tsx rename {frontend_reactjs => client}/src/components/modals/FileViewer.tsx (100%) rename {frontend_reactjs => client}/src/components/navigation/Drawer/ResponsiveDrawer.tsx (100%) rename {frontend_reactjs => client}/src/components/navigation/NavTabs.tsx (100%) rename {frontend_reactjs => client}/src/constants/index.ts (100%) rename {frontend_reactjs => client}/src/hooks/swrHooks.ts (100%) rename {frontend_reactjs => client}/src/http/axiosInstance.ts (100%) rename {frontend_reactjs => client}/src/index.css (100%) rename {frontend_reactjs => client}/src/interfaces/auth.ts (100%) rename {frontend_reactjs => client}/src/interfaces/create.ts (100%) rename {frontend_reactjs => client}/src/interfaces/documents.ts (100%) rename {frontend_reactjs => client}/src/interfaces/fuel.ts (100%) rename {frontend_reactjs => client}/src/interfaces/preferences.ts (100%) rename {frontend_reactjs => client}/src/interfaces/role.ts (100%) rename {frontend_reactjs => client}/src/interfaces/servers.ts (100%) rename {frontend_reactjs => client}/src/interfaces/user.ts (100%) rename {frontend_reactjs => client}/src/layouts/DashboardLayout.tsx (100%) rename {frontend_reactjs => client}/src/layouts/DashboardLayoutResponsive.tsx (100%) rename {frontend_reactjs => client}/src/layouts/MainLayout.tsx (100%) rename {frontend_reactjs => client}/src/main.tsx (76%) rename {frontend_reactjs => client}/src/pages/ApiTest.tsx (100%) rename {frontend_reactjs => client}/src/pages/Boilers.tsx (100%) rename {frontend_reactjs => client}/src/pages/Documents.tsx (100%) rename {frontend_reactjs => client}/src/pages/Main.tsx (100%) create mode 100644 client/src/pages/MapTest.tsx rename {frontend_reactjs => client}/src/pages/NotFound.tsx (100%) rename {frontend_reactjs => client}/src/pages/Reports.tsx (100%) rename {frontend_reactjs => client}/src/pages/Roles.tsx (88%) rename {frontend_reactjs => client}/src/pages/Servers.tsx (100%) rename {frontend_reactjs => client}/src/pages/Settings.tsx (100%) rename {frontend_reactjs => client}/src/pages/Users.tsx (90%) rename {frontend_reactjs => client}/src/pages/auth/PasswordReset.tsx (100%) rename {frontend_reactjs => client}/src/pages/auth/SignIn.tsx (92%) rename {frontend_reactjs => client}/src/pages/auth/SignUp.tsx (100%) rename {frontend_reactjs => client}/src/services/AuthService.ts (100%) rename {frontend_reactjs => client}/src/services/DocumentService.ts (100%) rename {frontend_reactjs => client}/src/services/FuelService.ts (100%) rename {frontend_reactjs => client}/src/services/RoleService.ts (100%) rename {frontend_reactjs => client}/src/services/ServersService.ts (100%) rename {frontend_reactjs => client}/src/services/UserService.ts (100%) rename {frontend_reactjs => client}/src/store/auth.ts (100%) rename {frontend_reactjs => client}/src/store/preferences.ts (100%) rename {frontend_reactjs => client}/src/store/user.ts (100%) rename {frontend_reactjs => client}/src/vite-env.d.ts (100%) rename {frontend_reactjs => client}/tailwind.config.js (100%) rename {frontend_reactjs => client}/tsconfig.json (100%) rename {frontend_reactjs => client}/tsconfig.node.json (100%) rename {frontend_reactjs => client}/tsconfig.node.tsbuildinfo (100%) rename {frontend_reactjs => client}/vite.config.ts (85%) rename {frontend_reactjs => client}/yarn.lock (94%) create mode 100644 ems/.gitignore create mode 100644 ems/Dockerfile create mode 100644 ems/package-lock.json create mode 100644 ems/package.json create mode 100644 ems/src/index.ts create mode 100644 ems/tsconfig.json diff --git a/.gitignore b/.gitignore index 65456ad..c4b1cad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .venv .vscode __pycache__ -.env \ No newline at end of file +.env +redis_data \ No newline at end of file diff --git a/frontend_reactjs/.env.example b/client/.env.example similarity index 100% rename from frontend_reactjs/.env.example rename to client/.env.example diff --git a/frontend_reactjs/.eslintrc.cjs b/client/.eslintrc.cjs similarity index 100% rename from frontend_reactjs/.eslintrc.cjs rename to client/.eslintrc.cjs diff --git a/frontend_reactjs/.gitignore b/client/.gitignore similarity index 100% rename from frontend_reactjs/.gitignore rename to client/.gitignore diff --git a/frontend_reactjs/Dockerfile b/client/Dockerfile similarity index 100% rename from frontend_reactjs/Dockerfile rename to client/Dockerfile diff --git a/frontend_reactjs/README.md b/client/README.md similarity index 100% rename from frontend_reactjs/README.md rename to client/README.md diff --git a/client/bun.lockb b/client/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..4133972514dcc8d7fed943be688eeb992d951118 GIT binary patch literal 363473 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

L0D6=`;IS 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 J$N%a7{s+#PBT@hW literal 0 HcmV?d00001 diff --git a/frontend_reactjs/index.html b/client/index.html similarity index 100% rename from frontend_reactjs/index.html rename to client/index.html diff --git a/frontend_reactjs/package-lock.json b/client/package-lock.json similarity index 95% rename from frontend_reactjs/package-lock.json rename to client/package-lock.json index 0614257..ea6bec8 100644 --- a/frontend_reactjs/package-lock.json +++ b/client/package-lock.json @@ -23,6 +23,8 @@ "@uidotdev/usehooks": "^2.4.1", "autoprefixer": "^10.4.19", "axios": "^1.7.2", + "buffer": "^6.0.3", + "elysia-vite": "^0.2.0", "file-type": "^19.0.0", "ol": "^10.0.0", "postcss": "^8.4.38", @@ -45,7 +47,7 @@ "serve": "^14.2.3", "tailwindcss": "^3.4.4", "typescript": "^5.2.2", - "vite": "^5.2.0", + "vite": "^5.3.5", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-pwa": "^0.20.0" } @@ -1885,6 +1887,27 @@ "node": ">=6.9.0" } }, + "node_modules/@elysiajs/html": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@elysiajs/html/-/html-0.7.3.tgz", + "integrity": "sha512-F9WSfGsdym35NOz4WGXx0RbasBekJ8uW2rYufOpVyGTBLnFerGNfVZnOBAVrpsSEHeLL1O5Cxr0BCfF5tGabaA==", + "dependencies": { + "@kitajs/html": "^3.0.2", + "@kitajs/ts-html-plugin": "^1.2.0" + }, + "peerDependencies": { + "@kitajs/html": ">= 3.0.0", + "elysia": ">= 0.7.15" + }, + "peerDependenciesMeta": { + "@kitajs/html": { + "optional": true + }, + "@kitajs/ts-html-plugin": { + "optional": true + } + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", @@ -2019,9 +2042,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -2035,9 +2058,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -2051,9 +2074,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -2067,9 +2090,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -2083,9 +2106,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -2099,9 +2122,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -2115,9 +2138,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -2131,9 +2154,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -2147,9 +2170,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -2163,9 +2186,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -2179,9 +2202,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -2195,9 +2218,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -2211,9 +2234,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -2227,9 +2250,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -2243,9 +2266,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -2259,9 +2282,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -2275,9 +2298,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -2291,9 +2314,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -2307,9 +2330,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -2323,9 +2346,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -2339,9 +2362,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -2355,9 +2378,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -2371,9 +2394,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -2677,6 +2700,44 @@ "resolved": "https://registry.npmjs.org/@js-preview/pdf/-/pdf-2.0.2.tgz", "integrity": "sha512-g7RsK4k97y+/XvsjZfltEotty+QpfeQGDBAbr9UB0npjVP+2gxRnIhNEPpYFr44XQ6ZNjAIs5nKFppGjJVFJMQ==" }, + "node_modules/@kitajs/html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@kitajs/html/-/html-3.1.2.tgz", + "integrity": "sha512-igMLn8VCrAyjFuK1OOsCkiiu95EQ+hK/C96moz9+MzX3lsMukZO/AqXRxdhTeB80AtE61pL+lUTuwTkqz/s+rQ==", + "dependencies": { + "csstype": "^3.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/kitajs/html?sponsor=1" + }, + "peerDependencies": { + "@kitajs/ts-html-plugin": ">=1.3.3" + } + }, + "node_modules/@kitajs/ts-html-plugin": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@kitajs/ts-html-plugin/-/ts-html-plugin-1.3.4.tgz", + "integrity": "sha512-AAht1OvLkQizJ59DM70qBgb0VwdyW9KUtDaH66JrfanMMvSSoM598WspJrVdVbe50olw69H+nnTj0lEfNDVmPQ==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.2", + "yargs": "^17.7.2" + }, + "bin": { + "ts-html-plugin": "dist/cli.js", + "xss-scan": "dist/cli.js" + }, + "funding": { + "url": "https://github.com/kitajs/ts-html-plugin?sponsor=1" + }, + "peerDependencies": { + "@kitajs/html": "^3.1.1", + "typescript": "^5.2.2" + } + }, "node_modules/@mui/base": { "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", @@ -3425,6 +3486,11 @@ "win32" ] }, + "node_modules/@sinclair/typebox": { + "version": "0.31.28", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz", + "integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==" + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -4024,7 +4090,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -4033,7 +4098,6 @@ "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" }, @@ -4325,7 +4389,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -4592,10 +4655,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -4612,7 +4674,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-from": { @@ -4725,7 +4787,6 @@ "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" @@ -4832,6 +4893,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4844,7 +4952,6 @@ "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" }, @@ -4855,8 +4962,7 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-parse": { "version": "2.0.2", @@ -5000,6 +5106,14 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", @@ -5535,6 +5649,48 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/elysia": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/elysia/-/elysia-0.7.31.tgz", + "integrity": "sha512-mDqG2yYDCeX1GSbLZOU2ucdG8jO3SGApdoh3Xcc8tGUkEFvKd5W/YpjsNk8C7uLYfzgotSFmc7VbOkhmgbV4Zw==", + "dependencies": { + "@sinclair/typebox": "^0.31.17", + "cookie": "^0.6.0", + "eventemitter3": "^5.0.1", + "fast-querystring": "^1.1.2", + "memoirist": "0.1.4", + "openapi-types": "^12.1.3" + }, + "peerDependencies": { + "@sinclair/typebox": ">= 0.31.0", + "openapi-types": ">= 12.0.0", + "typescript": ">= 5.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "openapi-types": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/elysia-vite": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/elysia-vite/-/elysia-vite-0.2.0.tgz", + "integrity": "sha512-8TvqbmVzrNcmj6qTsO89Z62NMduLvvtLKWg/49tixT7btqEtw9ZeMIQR6UFmXwv1jGaNnWj3HfLqH/5B9WtzuQ==", + "dependencies": { + "@elysiajs/html": "^0.7.3", + "elysia": "^0.7.17" + }, + "peerDependencies": { + "@elysiajs/html": "^0.7.0", + "elysia": "^0.7.0" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -5674,9 +5830,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -5686,29 +5842,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -5921,6 +6077,11 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5969,6 +6130,11 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6015,6 +6181,14 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", @@ -6312,6 +6486,14 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -6509,7 +6691,6 @@ "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" } @@ -6913,7 +7094,6 @@ "version": "3.0.0", "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, "engines": { "node": ">=8" } @@ -7461,6 +7641,11 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/memoirist": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/memoirist/-/memoirist-0.1.4.tgz", + "integrity": "sha512-D6GbPSqO2nUVOmm7VZjJc5tC60pkOVUPzLwkKl1vCiYP+2b1cG8N9q1O3P0JmNM68u8vsgefPbxRUCSGxSXD+g==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7672,6 +7857,30 @@ "node": ">=10" } }, + "node_modules/node-stdlib-browser/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/node-stdlib-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7826,6 +8035,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -8105,9 +8319,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -8124,7 +8338,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -8708,6 +8922,14 @@ "jsesc": "bin/jsesc" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -9401,7 +9623,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9521,7 +9742,6 @@ "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" }, @@ -9754,6 +9974,11 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -9861,7 +10086,6 @@ "version": "5.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10064,13 +10288,13 @@ } }, "node_modules/vite": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", - "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", + "esbuild": "^0.21.3", + "postcss": "^8.4.41", "rollup": "^4.13.0" }, "bin": { @@ -10090,6 +10314,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -10107,6 +10332,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -10714,6 +10942,14 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -10732,6 +10968,49 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend_reactjs/package.json b/client/package.json similarity index 95% rename from frontend_reactjs/package.json rename to client/package.json index 310bb5b..10d67ab 100644 --- a/frontend_reactjs/package.json +++ b/client/package.json @@ -26,6 +26,8 @@ "@uidotdev/usehooks": "^2.4.1", "autoprefixer": "^10.4.19", "axios": "^1.7.2", + "buffer": "^6.0.3", + "elysia-vite": "^0.2.0", "file-type": "^19.0.0", "ol": "^10.0.0", "postcss": "^8.4.38", @@ -48,7 +50,7 @@ "serve": "^14.2.3", "tailwindcss": "^3.4.4", "typescript": "^5.2.2", - "vite": "^5.2.0", + "vite": "^5.3.5", "vite-plugin-node-polyfills": "^0.22.0", "vite-plugin-pwa": "^0.20.0" } diff --git a/frontend_reactjs/postcss.config.js b/client/postcss.config.js similarity index 100% rename from frontend_reactjs/postcss.config.js rename to client/postcss.config.js diff --git a/frontend_reactjs/public/vite.svg b/client/public/vite.svg similarity index 100% rename from frontend_reactjs/public/vite.svg rename to client/public/vite.svg diff --git a/frontend_reactjs/src/App.tsx b/client/src/App.tsx similarity index 91% rename from frontend_reactjs/src/App.tsx rename to client/src/App.tsx index 944173b..d8566c6 100644 --- a/frontend_reactjs/src/App.tsx +++ b/client/src/App.tsx @@ -15,9 +15,10 @@ import Documents from "./pages/Documents" import Reports from "./pages/Reports" import Boilers from "./pages/Boilers" import Servers from "./pages/Servers" -import { Api, Assignment, Cloud, Factory, Home, Login, Password, People, Settings as SettingsIcon, Shield, Storage } from "@mui/icons-material" +import { Api, Assignment, Cloud, Factory, Home, Login, Map, Password, People, Settings as SettingsIcon, Shield, Storage } from "@mui/icons-material" import Settings from "./pages/Settings" import PasswordReset from "./pages/auth/PasswordReset" +import MapTest from "./pages/MapTest" // Определение страниц с путями и компонентом для рендера export const pages = [ @@ -117,6 +118,14 @@ export const pages = [ drawer: true, dashboard: true }, + { + label: "Карта", + path: "/map-test", + icon: , + component: , + drawer: true, + dashboard: true + }, ] function App() { diff --git a/frontend_reactjs/src/assets/react.svg b/client/src/assets/react.svg similarity index 100% rename from frontend_reactjs/src/assets/react.svg rename to client/src/assets/react.svg diff --git a/frontend_reactjs/src/components/AccountMenu.tsx b/client/src/components/AccountMenu.tsx similarity index 100% rename from frontend_reactjs/src/components/AccountMenu.tsx rename to client/src/components/AccountMenu.tsx diff --git a/frontend_reactjs/src/components/CardInfo/CardInfo.tsx b/client/src/components/CardInfo/CardInfo.tsx similarity index 100% rename from frontend_reactjs/src/components/CardInfo/CardInfo.tsx rename to client/src/components/CardInfo/CardInfo.tsx diff --git a/frontend_reactjs/src/components/CardInfo/CardInfoChip.tsx b/client/src/components/CardInfo/CardInfoChip.tsx similarity index 100% rename from frontend_reactjs/src/components/CardInfo/CardInfoChip.tsx rename to client/src/components/CardInfo/CardInfoChip.tsx diff --git a/frontend_reactjs/src/components/CardInfo/CardInfoLabel.tsx b/client/src/components/CardInfo/CardInfoLabel.tsx similarity index 100% rename from frontend_reactjs/src/components/CardInfo/CardInfoLabel.tsx rename to client/src/components/CardInfo/CardInfoLabel.tsx diff --git a/frontend_reactjs/src/components/FetchingData.ts b/client/src/components/FetchingData.ts similarity index 100% rename from frontend_reactjs/src/components/FetchingData.ts rename to client/src/components/FetchingData.ts diff --git a/frontend_reactjs/src/components/FolderViewer.tsx b/client/src/components/FolderViewer.tsx similarity index 100% rename from frontend_reactjs/src/components/FolderViewer.tsx rename to client/src/components/FolderViewer.tsx diff --git a/frontend_reactjs/src/components/FormFields.tsx b/client/src/components/FormFields.tsx similarity index 93% rename from frontend_reactjs/src/components/FormFields.tsx rename to client/src/components/FormFields.tsx index faaba87..9f9e565 100644 --- a/frontend_reactjs/src/components/FormFields.tsx +++ b/client/src/components/FormFields.tsx @@ -1,6 +1,6 @@ import { SubmitHandler, useForm } from 'react-hook-form' import { CreateField } from '../interfaces/create' -import { Box, Button, CircularProgress, Stack, TextField, Typography } from '@mui/material'; +import { Box, Button, CircularProgress, Stack, SxProps, TextField, Typography } from '@mui/material'; import { AxiosResponse } from 'axios'; interface Props { @@ -11,6 +11,7 @@ interface Props { mutateHandler?: any; defaultValues?: {}; watchValues?: string[]; + sx?: SxProps | null; } function FormFields({ @@ -19,7 +20,8 @@ function FormFields({ fields, submitButtonText = 'Сохранить', mutateHandler, - defaultValues + defaultValues, + sx }: Props) { const getDefaultValues = (fields: CreateField[]) => { let result: { [key: string]: string | boolean } = {} @@ -51,7 +53,7 @@ function FormFields({ return (

- + {title} diff --git a/frontend_reactjs/src/components/ServerData.tsx b/client/src/components/ServerData.tsx similarity index 100% rename from frontend_reactjs/src/components/ServerData.tsx rename to client/src/components/ServerData.tsx diff --git a/frontend_reactjs/src/components/ServerHardware.tsx b/client/src/components/ServerHardware.tsx similarity index 98% rename from frontend_reactjs/src/components/ServerHardware.tsx rename to client/src/components/ServerHardware.tsx index 718cc21..720fcea 100644 --- a/frontend_reactjs/src/components/ServerHardware.tsx +++ b/client/src/components/ServerHardware.tsx @@ -116,7 +116,9 @@ export default function ServerHardware() { onRowClick={(params) => { setCurrentServerData(params.row) setServerDataOpen(true) - }} loading={false} /> + }} + loading={false} + /> } ) diff --git a/frontend_reactjs/src/components/ServerIpsView.tsx b/client/src/components/ServerIpsView.tsx similarity index 100% rename from frontend_reactjs/src/components/ServerIpsView.tsx rename to client/src/components/ServerIpsView.tsx diff --git a/frontend_reactjs/src/components/ServerStorages.tsx b/client/src/components/ServerStorages.tsx similarity index 100% rename from frontend_reactjs/src/components/ServerStorages.tsx rename to client/src/components/ServerStorages.tsx diff --git a/frontend_reactjs/src/components/ServersView.tsx b/client/src/components/ServersView.tsx similarity index 100% rename from frontend_reactjs/src/components/ServersView.tsx rename to client/src/components/ServersView.tsx diff --git a/frontend_reactjs/src/components/TableEditable.tsx b/client/src/components/TableEditable.tsx similarity index 99% rename from frontend_reactjs/src/components/TableEditable.tsx rename to client/src/components/TableEditable.tsx index 070bd6f..0b93d41 100644 --- a/frontend_reactjs/src/components/TableEditable.tsx +++ b/client/src/components/TableEditable.tsx @@ -217,7 +217,7 @@ export default function FullFeaturedCrudGrid({ columns={actions ? [...columns, ...actionColumns] : columns} editMode="row" rowModesModel={rowModesModel} - onRowClick={onRowClick} + //onRowClick={onRowClick} onRowModesModelChange={handleRowModesModelChange} onRowEditStop={handleRowEditStop} processRowUpdate={processRowUpdate} diff --git a/frontend_reactjs/src/components/UserData.ts b/client/src/components/UserData.ts similarity index 100% rename from frontend_reactjs/src/components/UserData.ts rename to client/src/components/UserData.ts diff --git a/client/src/components/map/MapComponent.tsx b/client/src/components/map/MapComponent.tsx new file mode 100644 index 0000000..7ad581a --- /dev/null +++ b/client/src/components/map/MapComponent.tsx @@ -0,0 +1,175 @@ +import { useEffect, useRef, useState } from 'react' +import GeoJSON from 'ol/format/GeoJSON' +import 'ol/ol.css' +import Map from 'ol/Map' +import View from 'ol/View' +import { Draw, Modify, Snap } from 'ol/interaction' +import { OSM, Vector as VectorSource } from 'ol/source' +import { Tile as TileLayer, Vector as VectorLayer } from 'ol/layer' +import { transform, transformExtent } from 'ol/proj' +import { Divider, IconButton, Stack } from '@mui/material' +import { Adjust, Api, CircleOutlined, RectangleOutlined, Timeline, Undo, Warning } from '@mui/icons-material' +import { Type } from 'ol/geom/Geometry' + +const MapComponent = () => { + const mapElement = useRef(null) + const [currentTool, setCurrentTool] = useState('Point') + + const map = useRef(null) + const source = useRef(new VectorSource()) + + const draw = useRef(null) + const snap = useRef(null) + + const drawingLayer = useRef(null) + + const addInteractions = () => { + draw.current = new Draw({ + source: source.current, + type: currentTool, + }) + map?.current?.addInteraction(draw.current) + snap.current = new Snap({ source: source.current }) + map?.current?.addInteraction(snap.current) + } + + // Function to save features to localStorage + const saveFeatures = () => { + const features = drawingLayer.current?.getSource()?.getFeatures() + if (features && features.length > 0) { + const geoJSON = new GeoJSON() + const featuresJSON = geoJSON.writeFeatures(features) + localStorage.setItem('savedFeatures', featuresJSON) + } + } + + // Function to load features from localStorage + const loadFeatures = () => { + const savedFeatures = localStorage.getItem('savedFeatures') + if (savedFeatures) { + const geoJSON = new GeoJSON() + const features = geoJSON.readFeatures(savedFeatures, { + featureProjection: 'EPSG:4326', // Ensure the projection is correct + }) + source.current?.addFeatures(features) // Add features to the vector source + //drawingLayer.current?.getSource()?.changed() + } + } + + useEffect(() => { + const geoLayer = new VectorLayer({ + background: '#1a2b39', + source: new VectorSource({ + url: 'https://openlayers.org/data/vector/ecoregions.json', + format: new GeoJSON(), + }), + style: { + 'fill-color': ['string', ['get', 'COLOR'], '#eee'], + }, + }) + + const raster = new TileLayer({ + source: new OSM(), + }) + + drawingLayer.current = new VectorLayer({ + source: source.current, + style: { + 'fill-color': 'rgba(255, 255, 255, 0.2)', + 'stroke-color': '#ffcc33', + 'stroke-width': 2, + 'circle-radius': 7, + 'circle-fill-color': '#ffcc33', + }, + }) + + // Center coordinates of Yakutia in EPSG:3857 + const center = transform([129.7694, 66.9419], 'EPSG:4326', 'EPSG:3857') + + // Extent for Yakutia in EPSG:4326 + const extent4326 = [105.0, 55.0, 170.0, 75.0] // Approximate bounding box + // Transform extent to EPSG:3857 + const extent = transformExtent(extent4326, 'EPSG:4326', 'EPSG:3857') + + map.current = new Map({ + layers: [geoLayer, raster, drawingLayer.current], + target: mapElement.current as HTMLDivElement, + view: new View({ + center, + zoom: 4, + extent, + }), + }) + + const modify = new Modify({ source: source.current }) + map.current.addInteraction(modify) + + addInteractions() + + loadFeatures() + + return () => { + map?.current?.setTarget(undefined) + } + }, []) + + useEffect(() => { + if (currentTool) { + if (draw.current) map?.current?.removeInteraction(draw.current) + if (snap.current) map?.current?.removeInteraction(snap.current) + addInteractions() + } + }, [currentTool]) + + return ( +
+ }> + { + fetch(`${import.meta.env.VITE_API_EMS_URL}/hello`, { method: 'GET' }).then(res => console.log(res)) + }}> + + + + { + saveFeatures() + }}> + + + + { + draw.current?.removeLastPoint() + }}> + + + + setCurrentTool('Point')}> + + + + setCurrentTool('LineString')}> + + + + setCurrentTool('Polygon')}> + + + + setCurrentTool('Circle')}> + + + +
+
+ ); +}; + +export default MapComponent diff --git a/frontend_reactjs/src/components/modals/FileViewer.tsx b/client/src/components/modals/FileViewer.tsx similarity index 100% rename from frontend_reactjs/src/components/modals/FileViewer.tsx rename to client/src/components/modals/FileViewer.tsx diff --git a/frontend_reactjs/src/components/navigation/Drawer/ResponsiveDrawer.tsx b/client/src/components/navigation/Drawer/ResponsiveDrawer.tsx similarity index 100% rename from frontend_reactjs/src/components/navigation/Drawer/ResponsiveDrawer.tsx rename to client/src/components/navigation/Drawer/ResponsiveDrawer.tsx diff --git a/frontend_reactjs/src/components/navigation/NavTabs.tsx b/client/src/components/navigation/NavTabs.tsx similarity index 100% rename from frontend_reactjs/src/components/navigation/NavTabs.tsx rename to client/src/components/navigation/NavTabs.tsx diff --git a/frontend_reactjs/src/constants/index.ts b/client/src/constants/index.ts similarity index 100% rename from frontend_reactjs/src/constants/index.ts rename to client/src/constants/index.ts diff --git a/frontend_reactjs/src/hooks/swrHooks.ts b/client/src/hooks/swrHooks.ts similarity index 100% rename from frontend_reactjs/src/hooks/swrHooks.ts rename to client/src/hooks/swrHooks.ts diff --git a/frontend_reactjs/src/http/axiosInstance.ts b/client/src/http/axiosInstance.ts similarity index 100% rename from frontend_reactjs/src/http/axiosInstance.ts rename to client/src/http/axiosInstance.ts diff --git a/frontend_reactjs/src/index.css b/client/src/index.css similarity index 100% rename from frontend_reactjs/src/index.css rename to client/src/index.css diff --git a/frontend_reactjs/src/interfaces/auth.ts b/client/src/interfaces/auth.ts similarity index 100% rename from frontend_reactjs/src/interfaces/auth.ts rename to client/src/interfaces/auth.ts diff --git a/frontend_reactjs/src/interfaces/create.ts b/client/src/interfaces/create.ts similarity index 100% rename from frontend_reactjs/src/interfaces/create.ts rename to client/src/interfaces/create.ts diff --git a/frontend_reactjs/src/interfaces/documents.ts b/client/src/interfaces/documents.ts similarity index 100% rename from frontend_reactjs/src/interfaces/documents.ts rename to client/src/interfaces/documents.ts diff --git a/frontend_reactjs/src/interfaces/fuel.ts b/client/src/interfaces/fuel.ts similarity index 100% rename from frontend_reactjs/src/interfaces/fuel.ts rename to client/src/interfaces/fuel.ts diff --git a/frontend_reactjs/src/interfaces/preferences.ts b/client/src/interfaces/preferences.ts similarity index 100% rename from frontend_reactjs/src/interfaces/preferences.ts rename to client/src/interfaces/preferences.ts diff --git a/frontend_reactjs/src/interfaces/role.ts b/client/src/interfaces/role.ts similarity index 100% rename from frontend_reactjs/src/interfaces/role.ts rename to client/src/interfaces/role.ts diff --git a/frontend_reactjs/src/interfaces/servers.ts b/client/src/interfaces/servers.ts similarity index 100% rename from frontend_reactjs/src/interfaces/servers.ts rename to client/src/interfaces/servers.ts diff --git a/frontend_reactjs/src/interfaces/user.ts b/client/src/interfaces/user.ts similarity index 100% rename from frontend_reactjs/src/interfaces/user.ts rename to client/src/interfaces/user.ts diff --git a/frontend_reactjs/src/layouts/DashboardLayout.tsx b/client/src/layouts/DashboardLayout.tsx similarity index 100% rename from frontend_reactjs/src/layouts/DashboardLayout.tsx rename to client/src/layouts/DashboardLayout.tsx diff --git a/frontend_reactjs/src/layouts/DashboardLayoutResponsive.tsx b/client/src/layouts/DashboardLayoutResponsive.tsx similarity index 100% rename from frontend_reactjs/src/layouts/DashboardLayoutResponsive.tsx rename to client/src/layouts/DashboardLayoutResponsive.tsx diff --git a/frontend_reactjs/src/layouts/MainLayout.tsx b/client/src/layouts/MainLayout.tsx similarity index 100% rename from frontend_reactjs/src/layouts/MainLayout.tsx rename to client/src/layouts/MainLayout.tsx diff --git a/frontend_reactjs/src/main.tsx b/client/src/main.tsx similarity index 76% rename from frontend_reactjs/src/main.tsx rename to client/src/main.tsx index eadf350..e89c8b5 100644 --- a/frontend_reactjs/src/main.tsx +++ b/client/src/main.tsx @@ -16,14 +16,24 @@ const mainTheme = createTheme( ].join(',') }, components: { + MuiListItemButton: { + defaultProps: { + disableRipple: true + } + }, + MuiButton: { + defaultProps: { + disableRipple: true + } + }, MuiButtonBase: { defaultProps: { - //disableRipple: true, + disableRipple: true, } }, MuiButtonGroup: { defaultProps: { - //disableRipple: true, + disableRipple: true, } } }, @@ -32,6 +42,7 @@ const mainTheme = createTheme( const darkTheme = createTheme( { + ...mainTheme, palette: { mode: "dark", primary: { main: '#1976d2' }, @@ -42,6 +53,7 @@ const darkTheme = createTheme( const lightTheme = createTheme( { + ...mainTheme, palette: { mode: "light", primary: { main: '#1976d2' }, @@ -58,7 +70,7 @@ function ThemedApp() { }, []) return ( - + ) diff --git a/frontend_reactjs/src/pages/ApiTest.tsx b/client/src/pages/ApiTest.tsx similarity index 100% rename from frontend_reactjs/src/pages/ApiTest.tsx rename to client/src/pages/ApiTest.tsx diff --git a/frontend_reactjs/src/pages/Boilers.tsx b/client/src/pages/Boilers.tsx similarity index 100% rename from frontend_reactjs/src/pages/Boilers.tsx rename to client/src/pages/Boilers.tsx diff --git a/frontend_reactjs/src/pages/Documents.tsx b/client/src/pages/Documents.tsx similarity index 100% rename from frontend_reactjs/src/pages/Documents.tsx rename to client/src/pages/Documents.tsx diff --git a/frontend_reactjs/src/pages/Main.tsx b/client/src/pages/Main.tsx similarity index 100% rename from frontend_reactjs/src/pages/Main.tsx rename to client/src/pages/Main.tsx diff --git a/client/src/pages/MapTest.tsx b/client/src/pages/MapTest.tsx new file mode 100644 index 0000000..c48a8ce --- /dev/null +++ b/client/src/pages/MapTest.tsx @@ -0,0 +1,11 @@ +import MapComponent from '../components/map/MapComponent' + +function MapTest() { + return ( +
+ +
+ ) +} + +export default MapTest \ No newline at end of file diff --git a/frontend_reactjs/src/pages/NotFound.tsx b/client/src/pages/NotFound.tsx similarity index 100% rename from frontend_reactjs/src/pages/NotFound.tsx rename to client/src/pages/NotFound.tsx diff --git a/frontend_reactjs/src/pages/Reports.tsx b/client/src/pages/Reports.tsx similarity index 100% rename from frontend_reactjs/src/pages/Reports.tsx rename to client/src/pages/Reports.tsx diff --git a/frontend_reactjs/src/pages/Roles.tsx b/client/src/pages/Roles.tsx similarity index 88% rename from frontend_reactjs/src/pages/Roles.tsx rename to client/src/pages/Roles.tsx index 0b2a583..36592f8 100644 --- a/frontend_reactjs/src/pages/Roles.tsx +++ b/client/src/pages/Roles.tsx @@ -42,6 +42,16 @@ export default function Roles() { onClose={() => setOpen(false)} > diff --git a/frontend_reactjs/src/pages/auth/PasswordReset.tsx b/client/src/pages/auth/PasswordReset.tsx similarity index 100% rename from frontend_reactjs/src/pages/auth/PasswordReset.tsx rename to client/src/pages/auth/PasswordReset.tsx diff --git a/frontend_reactjs/src/pages/auth/SignIn.tsx b/client/src/pages/auth/SignIn.tsx similarity index 92% rename from frontend_reactjs/src/pages/auth/SignIn.tsx rename to client/src/pages/auth/SignIn.tsx index 650e46a..af8094d 100644 --- a/frontend_reactjs/src/pages/auth/SignIn.tsx +++ b/client/src/pages/auth/SignIn.tsx @@ -8,7 +8,7 @@ import AuthService from '../../services/AuthService'; import UserService from '../../services/UserService'; const SignIn = () => { - const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm({ + const { register, handleSubmit, setError, formState: { errors, isSubmitting } } = useForm({ defaultValues: { username: '', password: '', @@ -39,8 +39,10 @@ const SignIn = () => { login(token) navigate('/'); - } catch (error) { - console.error('Ошибка при входе:', error); + } catch (error: any) { + setError('password', { + message: error?.response?.data?.detail + }) } }; diff --git a/frontend_reactjs/src/pages/auth/SignUp.tsx b/client/src/pages/auth/SignUp.tsx similarity index 100% rename from frontend_reactjs/src/pages/auth/SignUp.tsx rename to client/src/pages/auth/SignUp.tsx diff --git a/frontend_reactjs/src/services/AuthService.ts b/client/src/services/AuthService.ts similarity index 100% rename from frontend_reactjs/src/services/AuthService.ts rename to client/src/services/AuthService.ts diff --git a/frontend_reactjs/src/services/DocumentService.ts b/client/src/services/DocumentService.ts similarity index 100% rename from frontend_reactjs/src/services/DocumentService.ts rename to client/src/services/DocumentService.ts diff --git a/frontend_reactjs/src/services/FuelService.ts b/client/src/services/FuelService.ts similarity index 100% rename from frontend_reactjs/src/services/FuelService.ts rename to client/src/services/FuelService.ts diff --git a/frontend_reactjs/src/services/RoleService.ts b/client/src/services/RoleService.ts similarity index 100% rename from frontend_reactjs/src/services/RoleService.ts rename to client/src/services/RoleService.ts diff --git a/frontend_reactjs/src/services/ServersService.ts b/client/src/services/ServersService.ts similarity index 100% rename from frontend_reactjs/src/services/ServersService.ts rename to client/src/services/ServersService.ts diff --git a/frontend_reactjs/src/services/UserService.ts b/client/src/services/UserService.ts similarity index 100% rename from frontend_reactjs/src/services/UserService.ts rename to client/src/services/UserService.ts diff --git a/frontend_reactjs/src/store/auth.ts b/client/src/store/auth.ts similarity index 100% rename from frontend_reactjs/src/store/auth.ts rename to client/src/store/auth.ts diff --git a/frontend_reactjs/src/store/preferences.ts b/client/src/store/preferences.ts similarity index 100% rename from frontend_reactjs/src/store/preferences.ts rename to client/src/store/preferences.ts diff --git a/frontend_reactjs/src/store/user.ts b/client/src/store/user.ts similarity index 100% rename from frontend_reactjs/src/store/user.ts rename to client/src/store/user.ts diff --git a/frontend_reactjs/src/vite-env.d.ts b/client/src/vite-env.d.ts similarity index 100% rename from frontend_reactjs/src/vite-env.d.ts rename to client/src/vite-env.d.ts diff --git a/frontend_reactjs/tailwind.config.js b/client/tailwind.config.js similarity index 100% rename from frontend_reactjs/tailwind.config.js rename to client/tailwind.config.js diff --git a/frontend_reactjs/tsconfig.json b/client/tsconfig.json similarity index 100% rename from frontend_reactjs/tsconfig.json rename to client/tsconfig.json diff --git a/frontend_reactjs/tsconfig.node.json b/client/tsconfig.node.json similarity index 100% rename from frontend_reactjs/tsconfig.node.json rename to client/tsconfig.node.json diff --git a/frontend_reactjs/tsconfig.node.tsbuildinfo b/client/tsconfig.node.tsbuildinfo similarity index 100% rename from frontend_reactjs/tsconfig.node.tsbuildinfo rename to client/tsconfig.node.tsbuildinfo diff --git a/frontend_reactjs/vite.config.ts b/client/vite.config.ts similarity index 85% rename from frontend_reactjs/vite.config.ts rename to client/vite.config.ts index a8758de..969491e 100644 --- a/frontend_reactjs/vite.config.ts +++ b/client/vite.config.ts @@ -1,6 +1,5 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' -import { VitePWA } from "vite-plugin-pwa"; import { nodePolyfills } from 'vite-plugin-node-polyfills' // https://vitejs.dev/config/ diff --git a/frontend_reactjs/yarn.lock b/client/yarn.lock similarity index 94% rename from frontend_reactjs/yarn.lock rename to client/yarn.lock index 0df712d..c4b152a 100644 --- a/frontend_reactjs/yarn.lock +++ b/client/yarn.lock @@ -977,6 +977,14 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@elysiajs/html@^0.7.3": + version "0.7.3" + resolved "https://registry.npmjs.org/@elysiajs/html/-/html-0.7.3.tgz" + integrity sha512-F9WSfGsdym35NOz4WGXx0RbasBekJ8uW2rYufOpVyGTBLnFerGNfVZnOBAVrpsSEHeLL1O5Cxr0BCfF5tGabaA== + dependencies: + "@kitajs/html" "^3.0.2" + "@kitajs/ts-html-plugin" "^1.2.0" + "@emotion/babel-plugin@^11.11.0": version "11.11.0" resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" @@ -1084,10 +1092,10 @@ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1244,6 +1252,22 @@ resolved "https://registry.npmjs.org/@js-preview/pdf/-/pdf-2.0.2.tgz" integrity sha512-g7RsK4k97y+/XvsjZfltEotty+QpfeQGDBAbr9UB0npjVP+2gxRnIhNEPpYFr44XQ6ZNjAIs5nKFppGjJVFJMQ== +"@kitajs/html@^3.0.2", "@kitajs/html@^3.1.1": + version "3.1.2" + resolved "https://registry.npmjs.org/@kitajs/html/-/html-3.1.2.tgz" + integrity sha512-igMLn8VCrAyjFuK1OOsCkiiu95EQ+hK/C96moz9+MzX3lsMukZO/AqXRxdhTeB80AtE61pL+lUTuwTkqz/s+rQ== + dependencies: + csstype "^3.1.3" + +"@kitajs/ts-html-plugin@^1.2.0", "@kitajs/ts-html-plugin@>=1.3.3": + version "1.3.4" + resolved "https://registry.npmjs.org/@kitajs/ts-html-plugin/-/ts-html-plugin-1.3.4.tgz" + integrity sha512-AAht1OvLkQizJ59DM70qBgb0VwdyW9KUtDaH66JrfanMMvSSoM598WspJrVdVbe50olw69H+nnTj0lEfNDVmPQ== + dependencies: + chalk "^4.1.2" + tslib "^2.6.2" + yargs "^17.7.2" + "@mui/base@^5.0.0-beta.40", "@mui/base@5.0.0-beta.40": version "5.0.0-beta.40" resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz" @@ -1387,6 +1411,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@petamoriken/float16@^3.4.7": + version "3.8.7" + resolved "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.7.tgz" + integrity sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" @@ -1515,6 +1544,11 @@ resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@sinclair/typebox@^0.31.17": + version "0.31.28" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz" + integrity sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ== + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" @@ -2136,6 +2170,14 @@ buffer@^5.7.1: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" @@ -2258,6 +2300,15 @@ clipboardy@3.0.0: execa "^5.1.1" is-wsl "^2.2.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.1.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" @@ -2277,6 +2328,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz" + integrity sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" @@ -2287,6 +2343,26 @@ color-name@1.1.3: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-parse@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz" + integrity sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw== + dependencies: + color-name "^2.0.0" + +color-rgba@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz" + integrity sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg== + dependencies: + color-parse "^2.0.0" + color-space "^2.0.0" + +color-space@^2.0.0, color-space@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz" + integrity sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -2359,6 +2435,11 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + core-js-compat@^3.31.0, core-js-compat@^3.36.1: version "3.37.1" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz" @@ -2667,6 +2748,11 @@ domain-browser@^4.22.0: resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz" integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== +earcut@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz" + integrity sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -2697,6 +2783,26 @@ elliptic@^6.5.3, elliptic@^6.5.5: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elysia-vite@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/elysia-vite/-/elysia-vite-0.2.0.tgz" + integrity sha512-8TvqbmVzrNcmj6qTsO89Z62NMduLvvtLKWg/49tixT7btqEtw9ZeMIQR6UFmXwv1jGaNnWj3HfLqH/5B9WtzuQ== + dependencies: + "@elysiajs/html" "^0.7.3" + elysia "^0.7.17" + +elysia@^0.7.17, "elysia@>= 0.7.15": + version "0.7.31" + resolved "https://registry.npmjs.org/elysia/-/elysia-0.7.31.tgz" + integrity sha512-mDqG2yYDCeX1GSbLZOU2ucdG8jO3SGApdoh3Xcc8tGUkEFvKd5W/YpjsNk8C7uLYfzgotSFmc7VbOkhmgbV4Zw== + dependencies: + "@sinclair/typebox" "^0.31.17" + cookie "^0.6.0" + eventemitter3 "^5.0.1" + fast-querystring "^1.1.2" + memoirist "0.1.4" + openapi-types "^12.1.3" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -2803,36 +2909,36 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" -escalade@^3.1.2: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -2957,6 +3063,11 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.0.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" @@ -2985,6 +3096,11 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -3011,6 +3127,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-querystring@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + fast-url-parser@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" @@ -3156,6 +3279,25 @@ gensync@^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== +geotiff@^2.0.7: + version "2.1.3" + resolved "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz" + integrity sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA== + dependencies: + "@petamoriken/float16" "^3.4.7" + lerc "^3.0.0" + pako "^2.0.4" + parse-headers "^2.0.2" + quick-lru "^6.1.1" + web-worker "^1.2.0" + xml-utils "^1.0.2" + zstddec "^0.1.0" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" @@ -3759,6 +3901,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +lerc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz" + integrity sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww== + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" @@ -3856,6 +4003,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +memoirist@0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/memoirist/-/memoirist-0.1.4.tgz" + integrity sha512-D6GbPSqO2nUVOmm7VZjJc5tC60pkOVUPzLwkKl1vCiYP+2b1cG8N9q1O3P0JmNM68u8vsgefPbxRUCSGxSXD+g== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -4100,6 +4252,18 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" +ol@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/ol/-/ol-10.0.0.tgz" + integrity sha512-Gzfh61cQAxseCWL97VpGwbF91R2D69y3ABUewTl2H1Hjy6ipCtnoKshgO+n3WBrjsbsyS8QnkfmiJZNQGQNeOA== + dependencies: + color-rgba "^3.0.0" + color-space "^2.0.1" + earcut "^3.0.0" + geotiff "^2.0.7" + pbf "4.0.1" + rbush "^4.0.0" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -4119,6 +4283,11 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" @@ -4150,6 +4319,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +pako@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + pako@~1.0.5: version "1.0.11" resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" @@ -4174,6 +4348,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.7: pbkdf2 "^3.1.2" safe-buffer "^5.2.1" +parse-headers@^2.0.2: + version "2.0.5" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" @@ -4232,6 +4411,13 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbf@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz" + integrity sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA== + dependencies: + resolve-protobuf-schema "^2.1.0" + pbkdf2@^3.0.3, pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" @@ -4324,13 +4510,13 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.38, postcss@>=8.0.9: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.38, postcss@^8.4.41, postcss@>=8.0.9: + version "8.4.41" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" prelude-ls@^1.2.1: @@ -4367,6 +4553,11 @@ prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -4416,6 +4607,16 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^6.1.1: + version "6.1.2" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz" + integrity sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ== + +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -4436,6 +4637,13 @@ range-parser@1.2.0: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== +rbush@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/rbush/-/rbush-4.0.0.tgz" + integrity sha512-F5xw+166FYDZI6jEcz+sWEHL5/J+du3kQWkwqWrPKb6iVoLPZh+2KhTS4OoYqrw1v/RO1xQe6WsLwBvrUAlvXw== + dependencies: + quickselect "^2.0.0" + rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" @@ -4617,6 +4825,11 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" @@ -4632,6 +4845,13 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + resolve@^1.1.7, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.2: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" @@ -4952,7 +5172,16 @@ string_decoder@~1.1.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5235,6 +5464,11 @@ ts-interface-checker@^0.1.9: resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tslib@^2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + tty-browserify@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" @@ -5306,7 +5540,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5.2.2, typescript@>=4.2.0: +typescript@^5.2.2, "typescript@>= 5.0.0", typescript@>=4.2.0: version "5.4.5" resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== @@ -5442,13 +5676,13 @@ vite-plugin-pwa@^0.20.0: workbox-build "^7.1.0" workbox-window "^7.1.0" -"vite@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0", "vite@^4 || ^5", vite@^5.2.0: - version "5.2.13" - resolved "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz" - integrity sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A== +"vite@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "vite@^3.1.0 || ^4.0.0 || ^5.0.0", "vite@^4 || ^5", vite@^5.3.5: + version "5.4.1" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz" + integrity sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA== dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" + esbuild "^0.21.3" + postcss "^8.4.41" rollup "^4.13.0" optionalDependencies: fsevents "~2.3.3" @@ -5458,6 +5692,11 @@ vm-browserify@^1.0.1: resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +web-worker@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz" + integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" @@ -5680,6 +5919,15 @@ workbox-window@^7.1.0, workbox-window@7.1.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" @@ -5694,11 +5942,21 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xml-utils@^1.0.2: + version "1.10.1" + resolved "https://registry.npmjs.org/xml-utils/-/xml-utils-1.10.1.tgz" + integrity sha512-Dn6vJ1Z9v1tepSjvnCpwk5QqwIPcEFKdgnjqfYOABv1ngSofuAhtlugcUC3ehS1OHdgDWSG6C5mvj+Qm15udTQ== + xtend@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" @@ -5714,11 +5972,34 @@ yaml@^2.3.4: resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz" integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zstddec@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz" + integrity sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg== + zustand@^4.5.2: version "4.5.2" resolved "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz" diff --git a/docker-compose.yml b/docker-compose.yml index 4ebcc1e..557d574 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,47 @@ services: - client: - container_name: client + client_app: + container_name: client_app build: - context: ./frontend_reactjs + context: ./client dockerfile: Dockerfile volumes: - - ./frontend_reactjs:/app + - ./client:/app - /app/node_modules - - /app/dist ports: - 5173:5173 - restart: always \ No newline at end of file + restart: always + + redis_db: + image: "redis:alpine" + container_name: redis_db + ports: + - ${REDIS_PORT}:${REDIS_PORT} + environment: + - REDIS_PASSWORD=${REDIS_PASSWORD} + command: [ "redis-server", "--requirepass", "${REDIS_PASSWORD}" ] + volumes: + - ./redis_data:/data + expose: + - ${REDIS_PORT}:${REDIS_PORT} + restart: unless-stopped + + ems: + container_name: ems + build: + context: ./ems + dockerfile: Dockerfile + links: + - redis_db:redis_db + depends_on: + - redis_db + environment: + - REDIS_PASSWORD=${REDIS_PASSWORD} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT} + - EMS_PORT=${EMS_PORT} + ports: + - ${EMS_PORT}:${EMS_PORT} + restart: always + +volumes: + redis_data: diff --git a/ems/.gitignore b/ems/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/ems/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ems/Dockerfile b/ems/Dockerfile new file mode 100644 index 0000000..295d94c --- /dev/null +++ b/ems/Dockerfile @@ -0,0 +1,22 @@ +FROM node:lts-alpine AS base + +FROM base AS builder + +WORKDIR /app + +COPY package*.json ./ + +RUN npm ci + +COPY . . + +RUN npm run build + +ENV REDIS_HOST=$REDIS_HOST +ENV REDIS_PORT=$REDIS_PORT +ENV REDIS_PASSWORD=$REDIS_PASSWORD +ENV EMS_PORT=$EMS_PORT + +EXPOSE $EMS_PORT + +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/ems/package-lock.json b/ems/package-lock.json new file mode 100644 index 0000000..6360697 --- /dev/null +++ b/ems/package-lock.json @@ -0,0 +1,1569 @@ +{ + "name": "ems", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ems", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "ioredis": "^5.4.1" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/node": "^22.4.1", + "@types/redis": "^4.0.11", + "nodemon": "^3.1.4", + "ts-node": "^10.9.2", + "typescript": "^5.5.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "dev": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "dev": true, + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "dev": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "dev": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "dev": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "dev": true, + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", + "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "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 + }, + "node_modules/@types/redis": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz", + "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==", + "deprecated": "This is a stub types definition. redis provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "redis": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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==" + }, + "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 + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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 + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "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==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "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==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "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", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.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, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "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==", + "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==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ioredis": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", + "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ioredis/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==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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 + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "dev": true, + "workspaces": [ + "./packages/*" + ], + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.0", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==" + }, + "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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "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==", + "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==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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/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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "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/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/ems/package.json b/ems/package.json new file mode 100644 index 0000000..6bbf54a --- /dev/null +++ b/ems/package.json @@ -0,0 +1,30 @@ +{ + "name": "ems", + "version": "1.0.0", + "main": "index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "npx tsc", + "start": "node dist/index.js", + "dev": "nodemon src/index.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "ioredis": "^5.4.1" + }, + "devDependencies": { + "@types/express": "^4.17.21", + "@types/node": "^22.4.1", + "@types/redis": "^4.0.11", + "nodemon": "^3.1.4", + "ts-node": "^10.9.2", + "typescript": "^5.5.4" + } +} diff --git a/ems/src/index.ts b/ems/src/index.ts new file mode 100644 index 0000000..c902c90 --- /dev/null +++ b/ems/src/index.ts @@ -0,0 +1,62 @@ +import express, { Request, Response } from 'express' +import { Redis } from 'ioredis' +import dotenv from 'dotenv' +import bodyParser from 'body-parser' + +const cors = require('cors') + +const redis = new Redis({ + port: Number(process.env.REDIS_PORT) || 6379, + host: process.env.REDIS_HOST, + password: process.env.REDIS_PASSWORD, +}) + +dotenv.config() + +const app = express() +const port = process.env.EMS_PORT + +// Middleware to parse JSON requests +app.use(bodyParser.json()) + +app.get('/hello', cors(), (req: Request, res: Response) => { + res.send('Hello, World!') +}) + +// Route to store GeoJSON data +app.post('/geojson', cors(), async (req: Request, res: Response) => { + const geoJSON = req.body + + if (!geoJSON || !geoJSON.features) { + return res.status(400).send('Invalid GeoJSON') + } + + const id = `geojson:${Date.now()}`; + redis.set(id, JSON.stringify(geoJSON), (err, reply) => { + if (err) { + return res.status(500).send('Error saving GeoJSON to Redis'); + } + res.send({ status: 'success', id }); + }) +}) + +// Route to fetch GeoJSON data +app.get('/geojson/:id', cors(), async (req: Request, res: Response) => { + const id = req.params.id; + + redis.get(id, (err, data) => { + if (err) { + return res.status(500).send('Error fetching GeoJSON from Redis'); + } + + if (data) { + res.send(JSON.parse(data)); + } else { + res.status(404).send('GeoJSON not found'); + } + }) +}) + +app.listen(port, () => { + console.log(`Server running on http://localhost:${port}`); +}) diff --git a/ems/tsconfig.json b/ems/tsconfig.json new file mode 100644 index 0000000..ba74b4b --- /dev/null +++ b/ems/tsconfig.json @@ -0,0 +1,108 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +}