From 7cb215be52c80b0f882c854194ff5012c4201106 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Wed, 16 Aug 2023 14:47:21 -0400 Subject: [PATCH] refactor: Re-organize server/client structure so everything exists on same port Used https://spin.atomicobject.com/2020/08/17/cra-express-share-code as a base for refactoring --- .dockerignore | 1 + .gitignore | 2 + package.json | 58 +- {web/public => public}/favicon.ico | Bin {web/public => public}/index.html | 0 {web/public => public}/logo192.png | Bin {web/public => public}/logo512.png | Bin {web/public => public}/manifest.json | 0 {web/src => src/client}/App.css | 0 {web/src => src/client}/App.test.tsx | 0 {web/src => src/client}/App.tsx | 6 +- .../client}/components/PlayDisplay.tsx | 9 +- .../components/skeleton/SkeletonParagraph.tsx | 0 .../components/skeleton/SkeletonTitle.tsx | 0 .../statusCard/ClientStatusCard.tsx | 2 +- .../statusCard/SourceStatusCard.tsx | 2 +- .../statusCard/StatusCardSkeleton.tsx | 1 - .../client}/dashboard/dashboard.tsx | 0 {web/src => src/client}/index.css | 0 {web/src => src/client}/logo.svg | 0 {web/src => src/client}/recent/RecentPage.tsx | 4 +- {web/src => src/client}/reportWebVitals.ts | 0 .../client}/status/StatusSection.tsx | 2 +- src/core/Atomic.ts | 125 +++ src/{utils => core}/StringUtils.ts | 10 +- {web/src => src}/index.tsx | 6 +- {web/src => src}/react-app-env.d.ts | 0 src/server/{ => api}/api.ts | 4 +- src/server/{ => api}/middleware.ts | 0 src/{ => server}/apis/AbstractApiClient.ts | 3 +- src/{ => server}/apis/JRiverApiClient.ts | 0 src/{ => server}/apis/KodiApiClient.ts | 3 +- src/{ => server}/apis/LastfmApiClient.ts | 3 +- .../apis/ListenbrainzApiClient.ts | 3 +- src/{ => server}/apis/maloja/interfaces.ts | 0 .../clients/AbstractScrobbleClient.ts | 5 +- src/{ => server}/clients/LastfmScrobbler.ts | 6 +- .../clients/ListenbrainzScrobbler.ts | 7 +- src/{ => server}/clients/MalojaScrobbler.ts | 7 +- src/{ => server}/clients/ScrobbleClients.ts | 5 +- src/{ => server}/common/TupleMap.ts | 0 src/{ => server}/common/index.ts | 2 +- .../common/infrastructure/Atomic.ts | 113 +-- .../common/infrastructure/config/aioConfig.ts | 0 .../infrastructure/config/client/clients.ts | 0 .../infrastructure/config/client/index.ts | 0 .../infrastructure/config/client/lastfm.ts | 0 .../config/client/listenbrainz.ts | 0 .../infrastructure/config/client/maloja.ts | 0 .../common/infrastructure/config/common.ts | 0 .../infrastructure/config/health/webhooks.ts | 0 .../infrastructure/config/source/deezer.ts | 0 .../infrastructure/config/source/index.ts | 0 .../infrastructure/config/source/jellyfin.ts | 0 .../infrastructure/config/source/jriver.ts | 0 .../infrastructure/config/source/kodi.ts | 0 .../infrastructure/config/source/lastfm.ts | 0 .../config/source/listenbrainz.ts | 0 .../infrastructure/config/source/mopidy.ts | 0 .../infrastructure/config/source/mpris.ts | 0 .../infrastructure/config/source/plex.ts | 0 .../infrastructure/config/source/sources.ts | 0 .../infrastructure/config/source/spotify.ts | 0 .../infrastructure/config/source/subsonic.ts | 0 .../infrastructure/config/source/tautulli.ts | 0 .../infrastructure/config/source/ytmusic.ts | 0 .../typings/lastfm-node-client.d.ts | 0 .../typings/passport-deezer.d.ts | 0 src/{ => server}/common/logging.ts | 2 - .../common/schema/aio-client.json | 0 .../common/schema/aio-source.json | 0 src/{ => server}/common/schema/aio.json | 0 src/{ => server}/common/schema/client.json | 0 src/{ => server}/common/schema/source.json | 0 src/{ => server}/index.ts | 25 +- src/{ => server}/ioc.ts | 0 .../notifier/AbstractWebhookNotifier.ts | 0 .../notifier/GotifyWebhookNotifier.ts | 0 src/{ => server}/notifier/Notifiers.ts | 0 .../notifier/NtfyWebhookNotifier.ts | 0 src/{ => server}/sources/AbstractSource.ts | 5 +- src/{ => server}/sources/DeezerSource.ts | 3 +- src/{ => server}/sources/JRiverSource.ts | 3 +- src/{ => server}/sources/JellyfinSource.ts | 5 +- src/{ => server}/sources/KodiSource.ts | 3 +- src/{ => server}/sources/LastfmSource.ts | 3 +- .../sources/ListenbrainzSource.ts | 0 src/{ => server}/sources/MPRISSource.ts | 3 +- src/{ => server}/sources/MemorySource.ts | 5 +- src/{ => server}/sources/MopidySource.ts | 7 +- .../PlayerState/AbstractPlayerState.ts | 5 +- .../sources/PlayerState/GenericPlayerState.ts | 0 .../PlayerState/JellyfinPlayerState.ts | 3 +- .../sources/PlayerState/ListenProgress.ts | 3 +- src/{ => server}/sources/PlexSource.ts | 5 +- src/{ => server}/sources/ScrobbleSources.ts | 0 src/{ => server}/sources/SpotifySource.ts | 5 +- src/{ => server}/sources/SubsonicSource.ts | 4 +- src/{ => server}/sources/TautulliSource.ts | 5 +- src/{ => server}/sources/YTMusicSource.ts | 3 +- .../ingressNotifiers/IngressNotifier.ts | 0 .../ingressNotifiers/JellyfinNotifier.ts | 0 .../sources/ingressNotifiers/PlexNotifier.ts | 0 .../ingressNotifiers/TautulliNotifier.ts | 0 src/server/tsconfig.json | 31 + src/{ => server}/utils.ts | 3 +- src/{ => server}/views/recent.ejs | 0 src/{ => server}/views/status.ejs | 0 {web/src => src}/setupTests.ts | 0 web/tailwind.config.js => tailwind.config.js | 0 tsconfig.json | 43 +- web/.gitignore | 23 - web/README.md | 46 - web/package.json | 53 -- web/src/logs/LogLine.tsx | 32 - web/src/logs/LogsSection.css | 8 - web/src/logs/LogsSection.tsx | 66 -- web/src/reportWebVitals.js | 38 - web/src/reportWebVitals.js.map | 1 - web/src/setupProxy.js | 11 - web/src/setupTests.js | 8 - web/src/setupTests.js.map | 1 - web/tsconfig.json | 26 - webpack.config.server.js | 39 + yarn.lock | 876 ++++++++++++------ 125 files changed, 960 insertions(+), 831 deletions(-) rename {web/public => public}/favicon.ico (100%) rename {web/public => public}/index.html (100%) rename {web/public => public}/logo192.png (100%) rename {web/public => public}/logo512.png (100%) rename {web/public => public}/manifest.json (100%) rename {web/src => src/client}/App.css (100%) rename {web/src => src/client}/App.test.tsx (100%) rename {web/src => src/client}/App.tsx (98%) rename {web/src => src/client}/components/PlayDisplay.tsx (73%) rename {web/src => src/client}/components/skeleton/SkeletonParagraph.tsx (100%) rename {web/src => src/client}/components/skeleton/SkeletonTitle.tsx (100%) rename {web/src => src/client}/components/statusCard/ClientStatusCard.tsx (93%) rename {web/src => src/client}/components/statusCard/SourceStatusCard.tsx (91%) rename {web/src => src/client}/components/statusCard/StatusCardSkeleton.tsx (90%) rename {web/src => src/client}/dashboard/dashboard.tsx (100%) rename {web/src => src/client}/index.css (100%) rename {web/src => src/client}/logo.svg (100%) rename {web/src => src/client}/recent/RecentPage.tsx (90%) rename {web/src => src/client}/reportWebVitals.ts (100%) rename {web/src => src/client}/status/StatusSection.tsx (93%) create mode 100644 src/core/Atomic.ts rename src/{utils => core}/StringUtils.ts (91%) rename {web/src => src}/index.tsx (80%) rename {web/src => src}/react-app-env.d.ts (100%) rename src/server/{ => api}/api.ts (98%) rename src/server/{ => api}/middleware.ts (100%) rename src/{ => server}/apis/AbstractApiClient.ts (87%) rename src/{ => server}/apis/JRiverApiClient.ts (100%) rename src/{ => server}/apis/KodiApiClient.ts (97%) rename src/{ => server}/apis/LastfmApiClient.ts (97%) rename src/{ => server}/apis/ListenbrainzApiClient.ts (98%) rename src/{ => server}/apis/maloja/interfaces.ts (100%) rename src/{ => server}/clients/AbstractScrobbleClient.ts (98%) rename src/{ => server}/clients/LastfmScrobbler.ts (98%) rename src/{ => server}/clients/ListenbrainzScrobbler.ts (97%) rename src/{ => server}/clients/MalojaScrobbler.ts (99%) rename src/{ => server}/clients/ScrobbleClients.ts (99%) rename src/{ => server}/common/TupleMap.ts (100%) rename src/{ => server}/common/index.ts (74%) rename src/{ => server}/common/infrastructure/Atomic.ts (68%) rename src/{ => server}/common/infrastructure/config/aioConfig.ts (100%) rename src/{ => server}/common/infrastructure/config/client/clients.ts (100%) rename src/{ => server}/common/infrastructure/config/client/index.ts (100%) rename src/{ => server}/common/infrastructure/config/client/lastfm.ts (100%) rename src/{ => server}/common/infrastructure/config/client/listenbrainz.ts (100%) rename src/{ => server}/common/infrastructure/config/client/maloja.ts (100%) rename src/{ => server}/common/infrastructure/config/common.ts (100%) rename src/{ => server}/common/infrastructure/config/health/webhooks.ts (100%) rename src/{ => server}/common/infrastructure/config/source/deezer.ts (100%) rename src/{ => server}/common/infrastructure/config/source/index.ts (100%) rename src/{ => server}/common/infrastructure/config/source/jellyfin.ts (100%) rename src/{ => server}/common/infrastructure/config/source/jriver.ts (100%) rename src/{ => server}/common/infrastructure/config/source/kodi.ts (100%) rename src/{ => server}/common/infrastructure/config/source/lastfm.ts (100%) rename src/{ => server}/common/infrastructure/config/source/listenbrainz.ts (100%) rename src/{ => server}/common/infrastructure/config/source/mopidy.ts (100%) rename src/{ => server}/common/infrastructure/config/source/mpris.ts (100%) rename src/{ => server}/common/infrastructure/config/source/plex.ts (100%) rename src/{ => server}/common/infrastructure/config/source/sources.ts (100%) rename src/{ => server}/common/infrastructure/config/source/spotify.ts (100%) rename src/{ => server}/common/infrastructure/config/source/subsonic.ts (100%) rename src/{ => server}/common/infrastructure/config/source/tautulli.ts (100%) rename src/{ => server}/common/infrastructure/config/source/ytmusic.ts (100%) rename src/{ => server}/common/infrastructure/typings/lastfm-node-client.d.ts (100%) rename src/{ => server}/common/infrastructure/typings/passport-deezer.d.ts (100%) rename src/{ => server}/common/logging.ts (99%) rename src/{ => server}/common/schema/aio-client.json (100%) rename src/{ => server}/common/schema/aio-source.json (100%) rename src/{ => server}/common/schema/aio.json (100%) rename src/{ => server}/common/schema/client.json (100%) rename src/{ => server}/common/schema/source.json (100%) rename src/{ => server}/index.ts (98%) rename src/{ => server}/ioc.ts (100%) rename src/{ => server}/notifier/AbstractWebhookNotifier.ts (100%) rename src/{ => server}/notifier/GotifyWebhookNotifier.ts (100%) rename src/{ => server}/notifier/Notifiers.ts (100%) rename src/{ => server}/notifier/NtfyWebhookNotifier.ts (100%) rename src/{ => server}/sources/AbstractSource.ts (98%) rename src/{ => server}/sources/DeezerSource.ts (98%) rename src/{ => server}/sources/JRiverSource.ts (96%) rename src/{ => server}/sources/JellyfinSource.ts (98%) rename src/{ => server}/sources/KodiSource.ts (94%) rename src/{ => server}/sources/LastfmSource.ts (96%) rename src/{ => server}/sources/ListenbrainzSource.ts (100%) rename src/{ => server}/sources/MPRISSource.ts (98%) rename src/{ => server}/sources/MemorySource.ts (99%) rename src/{ => server}/sources/MopidySource.ts (97%) rename src/{ => server}/sources/PlayerState/AbstractPlayerState.ts (98%) rename src/{ => server}/sources/PlayerState/GenericPlayerState.ts (100%) rename src/{ => server}/sources/PlayerState/JellyfinPlayerState.ts (81%) rename src/{ => server}/sources/PlayerState/ListenProgress.ts (88%) rename src/{ => server}/sources/PlexSource.ts (98%) rename src/{ => server}/sources/ScrobbleSources.ts (100%) rename src/{ => server}/sources/SpotifySource.ts (98%) rename src/{ => server}/sources/SubsonicSource.ts (97%) rename src/{ => server}/sources/TautulliSource.ts (92%) rename src/{ => server}/sources/YTMusicSource.ts (98%) rename src/{ => server}/sources/ingressNotifiers/IngressNotifier.ts (100%) rename src/{ => server}/sources/ingressNotifiers/JellyfinNotifier.ts (100%) rename src/{ => server}/sources/ingressNotifiers/PlexNotifier.ts (100%) rename src/{ => server}/sources/ingressNotifiers/TautulliNotifier.ts (100%) create mode 100644 src/server/tsconfig.json rename src/{ => server}/utils.ts (99%) rename src/{ => server}/views/recent.ejs (100%) rename src/{ => server}/views/status.ejs (100%) rename {web/src => src}/setupTests.ts (100%) rename web/tailwind.config.js => tailwind.config.js (100%) delete mode 100644 web/.gitignore delete mode 100644 web/README.md delete mode 100644 web/package.json delete mode 100644 web/src/logs/LogLine.tsx delete mode 100644 web/src/logs/LogsSection.css delete mode 100644 web/src/logs/LogsSection.tsx delete mode 100644 web/src/reportWebVitals.js delete mode 100644 web/src/reportWebVitals.js.map delete mode 100644 web/src/setupProxy.js delete mode 100644 web/src/setupTests.js delete mode 100644 web/src/setupTests.js.map delete mode 100644 web/tsconfig.json create mode 100644 webpack.config.server.js diff --git a/.dockerignore b/.dockerignore index ca9f2a66..6d61b7ac 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,3 +17,4 @@ flatpak/generated-sources.json flatpak/.flatpak-builder docsite/build docsite/node_modules +build diff --git a/.gitignore b/.gitignore index 124b8353..640cd404 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,5 @@ src/**/**.js.map *.bak .flatpak-builder flatpak/generated-sources.json + +build diff --git a/package.json b/package.json index 3c3b2574..3ce5039f 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,6 @@ "description": "scrobble plays from multiple sources to multiple clients", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc", - "start": "concurrently -c \"auto\" --names \"server,client\" \"npm:server\" \"npm:client\"", - "server": "node src/index.js", - "client": "node start-client.js", "schema": "npm run -s schema-aio & npm run -s schema-source & npm run -s schema-client & npm run -s schema-aiosource & npm run -s schema-aioclient", "schema-client": "typescript-json-schema tsconfig.json ClientConfig --out src/common/schema/client.json --required --titles --tsNodeRegister --refs --validationKeywords deprecationMessage", "schema-source": "typescript-json-schema tsconfig.json SourceConfig --out src/common/schema/source.json --required --titles --tsNodeRegister --refs --validationKeywords deprecationMessage", @@ -17,7 +12,17 @@ "schema-aioclient": "typescript-json-schema tsconfig.json AIOClientConfig --out src/common/schema/aio-client.json --titles --required --tsNodeRegister --refs --validationKeywords deprecationMessage", "typedoc": "typedoc", "postinstall": "patch-package", - "circular": "madge --circular --extensions ts src/index.ts" + "circular": "madge --circular --extensions ts src/index.ts", + "test": "react-scripts test", + "eject": "react-scripts eject", + "dev": "concurrently -p name -c \"yellow,magenta,blue\" -n \"webpack-server,nodemon-server,CRA\" \"yarn dev:server:webpack\" \"yarn dev:server:nodemon\" \"yarn dev:client\"", + "dev:client": "wait-on -l tcp:9079 && react-scripts start", + "dev:server": "concurrently -p name -c \"yellow,magenta\" -n \"webpack-server,nodemon-server\" \"yarn dev:server:webpack\" \"yarn dev:server:nodemon\"", + "dev:server:webpack": "webpack --config webpack.config.server.js --watch", + "dev:server:nodemon": "rm -f build/server.js && wait-on -l build/server.js && nodemon build/server.js", + "build": "yarn build:client && yarn build:server", + "build:client": "react-scripts build", + "build:server": "webpack --config webpack.config.server.js" }, "exports": { ".": { @@ -38,15 +43,15 @@ "bugs": { "url": "https://github.com/FoxxMD/multi-scrobbler/issues" }, - "homepage": "https://github.com/FoxxMD/multi-scrobbler#readme", "private": true, - "workspaces": [ - "web" - ], + "homepage": ".", + "proxy": "http://localhost:9079", "dependencies": { "@awaitjs/express": "^0.6.3", "@foxxmd/winston": "3.3.31", "@kenyip/backoff-strategies": "^1.0.4", + "@react-nano/use-event-source": "^0.13.0", + "@tanstack/react-query": "^4.32.1", "ajv": "^7.2.4", "better-sse": "^0.8.0", "body-parser": "^1.19.0", @@ -66,19 +71,32 @@ "iti": "^0.6.0", "json5": "^2.2.3", "kodi-api": "^0.2.1", + "ky": "^0.33.3", "lastfm-node-client": "^2.2.0", "mopidy": "^1.3.0", + "nodemon": "^3.0.1", "normalize-url": "^6.1.0", "ntfy": "1.0.5", "p-event": "^4.2.0", "passport": "^0.6.0", "passport-deezer": "^0.2.0", "pony-cause": "^1.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.15.0", + "react-scripts": "5.0.1", "safe-stable-stringify": "^1.1.1", "socket.io": "^4.6.1", "spotify-web-api-node": "^5.0.2", "superagent": "^8.0.9", + "tailwindcss": "^3.3.3", "triple-beam": "^1.3.0", + "ts-loader": "^9.4.4", + "typescript": "^4.9.5", + "wait-on": "^7.0.1", + "web-vitals": "^2.1.4", + "webpack-cli": "^5.1.4", + "webpack-node-externals": "^3.0.0", "winston-daily-rotate-file": "^4.5.0", "winston-duplex": "0.1.3", "winston-null": "^2.0.0", @@ -87,14 +105,22 @@ "youtube-music-ts-api": "github:FoxxMD/youtube-music-ts-api#libraryHistoryImprovements-dist" }, "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", "@tsconfig/node18": "^1.0.1", "@types/common-tags": "^1.8.1", "@types/concat-stream": "^2.0.0", "@types/express": "^4.17.13", "@types/express-session": "^1.17.4", "@types/formidable": "^2.0.5", + "@types/jest": "^27.5.2", "@types/node": "^18.0.0", "@types/passport": "^1.0.12", + "@types/react": "^18.2.18", + "@types/react-dom": "^18.2.7", + "@types/react-window": "^1.8.5", "@types/spotify-web-api-node": "^5.0.7", "@types/superagent": "^4.1.16", "@types/triple-beam": "^1.3.2", @@ -107,6 +133,18 @@ "typescript": "^4.9.5", "typescript-json-schema": "~0.55" }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, "overrides": { "spotify-web-api-node": { "superagent": "$superagent" diff --git a/web/public/favicon.ico b/public/favicon.ico similarity index 100% rename from web/public/favicon.ico rename to public/favicon.ico diff --git a/web/public/index.html b/public/index.html similarity index 100% rename from web/public/index.html rename to public/index.html diff --git a/web/public/logo192.png b/public/logo192.png similarity index 100% rename from web/public/logo192.png rename to public/logo192.png diff --git a/web/public/logo512.png b/public/logo512.png similarity index 100% rename from web/public/logo512.png rename to public/logo512.png diff --git a/web/public/manifest.json b/public/manifest.json similarity index 100% rename from web/public/manifest.json rename to public/manifest.json diff --git a/web/src/App.css b/src/client/App.css similarity index 100% rename from web/src/App.css rename to src/client/App.css diff --git a/web/src/App.test.tsx b/src/client/App.test.tsx similarity index 100% rename from web/src/App.test.tsx rename to src/client/App.test.tsx diff --git a/web/src/App.tsx b/src/client/App.tsx similarity index 98% rename from web/src/App.tsx rename to src/client/App.tsx index 37867fe5..2d423f65 100644 --- a/web/src/App.tsx +++ b/src/client/App.tsx @@ -10,17 +10,17 @@ import './App.css'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query' const queryClient = new QueryClient() import Dashboard from "./dashboard/dashboard"; -import RecentPage from "./recent/RecentPage"; +//import RecentPage from "./recent/RecentPage"; const router = createBrowserRouter([ { path: "/", element: , }, - { +/* { path: "/recent", element: , - }, + },*/ ]); function App() { diff --git a/web/src/components/PlayDisplay.tsx b/src/client/components/PlayDisplay.tsx similarity index 73% rename from web/src/components/PlayDisplay.tsx rename to src/client/components/PlayDisplay.tsx index 573aa51e..c55dfb78 100644 --- a/web/src/components/PlayDisplay.tsx +++ b/src/client/components/PlayDisplay.tsx @@ -1,13 +1,10 @@ import React, {Fragment, PropsWithChildren, ReactElement} from 'react'; -import SkeletonTitle from "./skeleton/SkeletonTitle.js"; -import SkeletonParagraph from "./skeleton/SkeletonParagraph.js"; -import StatusCardSkeleton, {StatusCardSkeletonData} from "./statusCard/StatusCardSkeleton.js"; -import {PlayData, PlayObject, TrackStringOptions} from "../../../src/common/infrastructure/Atomic.js"; -import {buildTrackString, buildTrackStringReactOptions} from "../../../src/utils/StringUtils.js"; +import {JsonPlayObject, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString, buildTrackStringReactOptions} from "../../core/StringUtils.js"; interface PlayObjectProps { - data: PlayObject + data: JsonPlayObject artistLength?: number trackLength?: number buildOptions?: TrackStringOptions & {includeWeb?: boolean} diff --git a/web/src/components/skeleton/SkeletonParagraph.tsx b/src/client/components/skeleton/SkeletonParagraph.tsx similarity index 100% rename from web/src/components/skeleton/SkeletonParagraph.tsx rename to src/client/components/skeleton/SkeletonParagraph.tsx diff --git a/web/src/components/skeleton/SkeletonTitle.tsx b/src/client/components/skeleton/SkeletonTitle.tsx similarity index 100% rename from web/src/components/skeleton/SkeletonTitle.tsx rename to src/client/components/skeleton/SkeletonTitle.tsx diff --git a/web/src/components/statusCard/ClientStatusCard.tsx b/src/client/components/statusCard/ClientStatusCard.tsx similarity index 93% rename from web/src/components/statusCard/ClientStatusCard.tsx rename to src/client/components/statusCard/ClientStatusCard.tsx index 0ff1a506..fb6d76b4 100644 --- a/web/src/components/statusCard/ClientStatusCard.tsx +++ b/src/client/components/statusCard/ClientStatusCard.tsx @@ -1,7 +1,7 @@ import React, {Fragment} from 'react'; -import {ClientStatusData} from "../../../../src/common/infrastructure/Atomic"; import StatusCardSkeleton, {StatusCardSkeletonData} from "./StatusCardSkeleton"; import SkeletonParagraph from "../skeleton/SkeletonParagraph"; +import {ClientStatusData} from "../../../core/Atomic"; export interface ClientStatusCardData extends StatusCardSkeletonData { loading?: boolean diff --git a/web/src/components/statusCard/SourceStatusCard.tsx b/src/client/components/statusCard/SourceStatusCard.tsx similarity index 91% rename from web/src/components/statusCard/SourceStatusCard.tsx rename to src/client/components/statusCard/SourceStatusCard.tsx index 21cb9d76..dd383160 100644 --- a/web/src/components/statusCard/SourceStatusCard.tsx +++ b/src/client/components/statusCard/SourceStatusCard.tsx @@ -1,7 +1,7 @@ import React, {Fragment} from 'react'; -import {ClientStatusData, SourceStatusData} from "../../../../src/common/infrastructure/Atomic"; import StatusCardSkeleton, {StatusCardSkeletonData} from "./StatusCardSkeleton"; import SkeletonParagraph from "../skeleton/SkeletonParagraph"; +import {SourceStatusData} from "../../../core/Atomic"; export interface SourceStatusCardData extends StatusCardSkeletonData { loading?: boolean diff --git a/web/src/components/statusCard/StatusCardSkeleton.tsx b/src/client/components/statusCard/StatusCardSkeleton.tsx similarity index 90% rename from web/src/components/statusCard/StatusCardSkeleton.tsx rename to src/client/components/statusCard/StatusCardSkeleton.tsx index d891b3c1..fc4840ef 100644 --- a/web/src/components/statusCard/StatusCardSkeleton.tsx +++ b/src/client/components/statusCard/StatusCardSkeleton.tsx @@ -1,5 +1,4 @@ import React, {PropsWithChildren} from 'react'; -import {ClientStatusData, SourceStatusData} from "../../../../src/common/infrastructure/Atomic"; import SkeletonTitle from "../skeleton/SkeletonTitle"; import SkeletonParagraph from "../skeleton/SkeletonParagraph"; diff --git a/web/src/dashboard/dashboard.tsx b/src/client/dashboard/dashboard.tsx similarity index 100% rename from web/src/dashboard/dashboard.tsx rename to src/client/dashboard/dashboard.tsx diff --git a/web/src/index.css b/src/client/index.css similarity index 100% rename from web/src/index.css rename to src/client/index.css diff --git a/web/src/logo.svg b/src/client/logo.svg similarity index 100% rename from web/src/logo.svg rename to src/client/logo.svg diff --git a/web/src/recent/RecentPage.tsx b/src/client/recent/RecentPage.tsx similarity index 90% rename from web/src/recent/RecentPage.tsx rename to src/client/recent/RecentPage.tsx index d0b165ef..faa324ae 100644 --- a/web/src/recent/RecentPage.tsx +++ b/src/client/recent/RecentPage.tsx @@ -3,13 +3,13 @@ import { useQuery, } from '@tanstack/react-query' import ky from "ky"; -import {PlayObject} from "../../../src/common/infrastructure/Atomic"; import PlayDisplay from "../components/PlayDisplay"; +import {JsonPlayObject} from "../../core/Atomic.js"; const recent = () => { const {isLoading, isSuccess, isError, data, error} = useQuery({ queryKey: ['recent?name=default&type=spotify'], queryFn: async () => { - return await ky.get('/api/recent?name=default&type=spotify').json() as PlayObject[] + return await ky.get('/api/recent?name=default&type=spotify').json() as JsonPlayObject[] } }); diff --git a/web/src/reportWebVitals.ts b/src/client/reportWebVitals.ts similarity index 100% rename from web/src/reportWebVitals.ts rename to src/client/reportWebVitals.ts diff --git a/web/src/status/StatusSection.tsx b/src/client/status/StatusSection.tsx similarity index 93% rename from web/src/status/StatusSection.tsx rename to src/client/status/StatusSection.tsx index 556ffd16..48df1cd3 100644 --- a/web/src/status/StatusSection.tsx +++ b/src/client/status/StatusSection.tsx @@ -4,9 +4,9 @@ import { } from '@tanstack/react-query' import ky from "ky"; import StatusCardSkeleton from "../components/statusCard/StatusCardSkeleton"; -import {ClientStatusData, SourceStatusData} from "../../../src/common/infrastructure/Atomic"; import SourceStatusCard from "../components/statusCard/SourceStatusCard"; import ClientStatusCard from "../components/statusCard/ClientStatusCard"; +import {ClientStatusData, SourceStatusData} from "../../core/Atomic"; const StatusSection = () => { const {isLoading, isSuccess, isError, data, error} = useQuery({ diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts new file mode 100644 index 00000000..11192f8b --- /dev/null +++ b/src/core/Atomic.ts @@ -0,0 +1,125 @@ +import {Dayjs} from "dayjs"; + +export interface SourceStatusData { + status: string; + type: "spotify" | "plex" | "tautulli" | "subsonic" | "jellyfin" | "lastfm" | "deezer" | "ytmusic" | "mpris" | "mopidy" | "listenbrainz" | "jriver" | "kodi"; + display: string; + tracksDiscovered: number; + name: string; + canPoll: boolean; + hasAuth: boolean; + hasAuthInteraction: boolean; + authed: boolean; +} + +export interface ClientStatusData { + status: string; + type: "maloja" | "lastfm" | "listenbrainz"; + display: string; + tracksDiscovered: number; + name: string; + hasAuth: boolean; +} + +export interface TrackStringOptions { + include?: ('time' | 'artist' | 'track' | 'timeFromNow' | 'trackId')[] + transformers?: { + artists?: (a: string[]) => T | string + track?: (t: string, hasExistingParts?: boolean) => T | string + time?: (t: Dayjs) => T | string + timeFromNow?: (t: Dayjs) => T | string + reducer?: (arr: (T | string)[]) => T //(acc: T, curr: T | string) => T + } +} + +export interface PlayProgress { + timestamp: Dayjs + position?: number + positionPercent?: number +} + +export type ListenRange = [PlayProgress, PlayProgress] + +export interface TrackData { + artists?: string[] + album?: string + track?: string + /** + * The length of the track, in seconds + * */ + duration?: number + + meta?: { + brainz?: { + artist?: string + albumArtist?: string + album?: string + track?: string + releaseGroup?: string + } + } +} + +export interface PlayData extends TrackData { + /** + * The date the track was played at + * */ + playDate?: Dayjs | string + /** Number of seconds the track was listened to */ + listenedFor?: number + listenRanges?: ListenRange[] +} + +export interface PlayMeta { + source?: string + + /** + * Specifies from what facet/data from the source this play was parsed from IE history, now playing, etc... + * */ + parsedFrom?: string + /** + * Unique ID for this track, given by the Source + * */ + trackId?: string + + /** + * Atomic ID for this instance of played tracked IE a unique ID for "this track played at this time" + * */ + playId?: string + newFromSource?: boolean + url?: { + web: string + [key: string]: string + } + user?: string + mediaType?: string + server?: string + library?: string + /** + * The position the "player" is at in the track at the time the play was reported, in seconds + * */ + trackProgressPosition?: number + /** + * A unique identifier for the device playing this track + * */ + deviceId?: string + + [key: string]: any +} + +export interface AmbPlayObject { + data: PlayData, + meta: PlayMeta +} + +export interface PlayObject extends AmbPlayObject { + data: ObjectPlayData, +} + +export interface JsonPlayObject extends AmbPlayObject { + playDate?: string +} + +export interface ObjectPlayData extends PlayData { + playDate?: Dayjs +} diff --git a/src/utils/StringUtils.ts b/src/core/StringUtils.ts similarity index 91% rename from src/utils/StringUtils.ts rename to src/core/StringUtils.ts index b9d1f249..0887e2b2 100644 --- a/src/utils/StringUtils.ts +++ b/src/core/StringUtils.ts @@ -1,11 +1,11 @@ import dayjs, {Dayjs} from "dayjs"; -import {PlayObject, TrackStringOptions} from "../common/infrastructure/Atomic.js"; import React, {ReactElement} from "react"; import utc from "dayjs/plugin/utc.js"; import isBetween from "dayjs/plugin/isBetween.js"; import relativeTime from "dayjs/plugin/relativeTime.js"; import duration from "dayjs/plugin/duration.js"; import timezone from "dayjs/plugin/timezone.js"; +import {AmbPlayObject, TrackStringOptions} from "./Atomic.js"; dayjs.extend(utc) dayjs.extend(isBetween); @@ -36,7 +36,7 @@ export const defaultBuildTrackStringTransformers = { time: defaultTimeFunc, timeFromNow: defaultTimeFromNowFunc, } -export const buildTrackString = (playObj: PlayObject, options: TrackStringOptions = {}): T => { +export const buildTrackString = (playObj: AmbPlayObject, options: TrackStringOptions = {}): T => { const { include = ['time', 'artist', 'track'], transformers: { @@ -59,6 +59,8 @@ export const buildTrackString = (playObj: PlayObject, options: Track } = {}, } = playObj; + const pd = typeof playDate === 'string' ? dayjs(playDate) : playDate; + const strParts: (T | string)[] = []; if (include.includes('trackId') && trackId !== undefined) { strParts.push(`(${trackId})`); @@ -70,10 +72,10 @@ export const buildTrackString = (playObj: PlayObject, options: Track strParts.push(trackFunc(track, strParts.length > 0)); } if (include.includes('time')) { - strParts.push(timeFunc(playDate)); + strParts.push(timeFunc(pd)); } if (include.includes('timeFromNow')) { - const tfn = timeFromNow(playDate); + const tfn = timeFromNow(pd); if (tfn !== undefined) { strParts.push(tfn) } diff --git a/web/src/index.tsx b/src/index.tsx similarity index 80% rename from web/src/index.tsx rename to src/index.tsx index e273ef2a..bb4f2cd1 100644 --- a/web/src/index.tsx +++ b/src/index.tsx @@ -1,8 +1,8 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import './client/index.css'; +import App from './client/App'; +import reportWebVitals from './client/reportWebVitals'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement diff --git a/web/src/react-app-env.d.ts b/src/react-app-env.d.ts similarity index 100% rename from web/src/react-app-env.d.ts rename to src/react-app-env.d.ts diff --git a/src/server/api.ts b/src/server/api/api.ts similarity index 98% rename from src/server/api.ts rename to src/server/api/api.ts index bba7a675..b7cf9c6c 100644 --- a/src/server/api.ts +++ b/src/server/api/api.ts @@ -3,8 +3,8 @@ import {getRoot} from "../ioc.js"; import {capitalize} from "../utils.js"; import {makeClientCheckMiddle, makeSourceCheckMiddle} from "./middleware.js"; import AbstractSource from "../sources/AbstractSource.js"; -import {ClientStatusData, PlayObject, SourceStatusData, TrackStringOptions} from "../common/infrastructure/Atomic.js"; -import {buildTrackString, longestString, truncateStringToLength} from "../utils/StringUtils.js"; +import {ClientStatusData, PlayObject, SourceStatusData, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString, longestString, truncateStringToLength} from "../../core/StringUtils.js"; diff --git a/src/server/middleware.ts b/src/server/api/middleware.ts similarity index 100% rename from src/server/middleware.ts rename to src/server/api/middleware.ts diff --git a/src/apis/AbstractApiClient.ts b/src/server/apis/AbstractApiClient.ts similarity index 87% rename from src/apis/AbstractApiClient.ts rename to src/server/apis/AbstractApiClient.ts index c4ce751f..2bd34668 100644 --- a/src/apis/AbstractApiClient.ts +++ b/src/server/apis/AbstractApiClient.ts @@ -1,7 +1,8 @@ import {capitalize, mergeArr} from "../utils.js"; import {Logger} from '@foxxmd/winston'; -import {FormatPlayObjectOptions, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions} from "../common/infrastructure/Atomic.js"; import winston from '@foxxmd/winston'; +import {PlayObject} from "../../core/Atomic.js"; export default abstract class AbstractApiClient { name: string; diff --git a/src/apis/JRiverApiClient.ts b/src/server/apis/JRiverApiClient.ts similarity index 100% rename from src/apis/JRiverApiClient.ts rename to src/server/apis/JRiverApiClient.ts diff --git a/src/apis/KodiApiClient.ts b/src/server/apis/KodiApiClient.ts similarity index 97% rename from src/apis/KodiApiClient.ts rename to src/server/apis/KodiApiClient.ts index f45b2e0e..f51c1fac 100644 --- a/src/apis/KodiApiClient.ts +++ b/src/server/apis/KodiApiClient.ts @@ -5,8 +5,9 @@ import { KodiClient } from 'kodi-api' import normalizeUrl from "normalize-url"; import {URL} from "url"; import {RecentlyPlayedOptions} from "../sources/AbstractSource.js"; -import {FormatPlayObjectOptions, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions} from "../common/infrastructure/Atomic.js"; import dayjs from "dayjs"; +import {PlayObject} from "../../core/Atomic.js"; interface KodiDuration { hours: number diff --git a/src/apis/LastfmApiClient.ts b/src/server/apis/LastfmApiClient.ts similarity index 97% rename from src/apis/LastfmApiClient.ts rename to src/server/apis/LastfmApiClient.ts index f062d7e4..53275a05 100644 --- a/src/apis/LastfmApiClient.ts +++ b/src/server/apis/LastfmApiClient.ts @@ -2,8 +2,9 @@ import LastFm, {AuthGetSessionResponse, TrackObject, UserGetInfoResponse} from " import AbstractApiClient from "./AbstractApiClient.js"; import dayjs from "dayjs"; import {readJson, sleep, writeFile} from "../utils.js"; -import {FormatPlayObjectOptions, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions} from "../common/infrastructure/Atomic.js"; import {LastfmData} from "../common/infrastructure/config/client/lastfm.js"; +import {PlayObject} from "../../core/Atomic.js"; const badErrors = [ 'api key suspended', diff --git a/src/apis/ListenbrainzApiClient.ts b/src/server/apis/ListenbrainzApiClient.ts similarity index 98% rename from src/apis/ListenbrainzApiClient.ts rename to src/server/apis/ListenbrainzApiClient.ts index c838a9b7..a49b63fc 100644 --- a/src/apis/ListenbrainzApiClient.ts +++ b/src/server/apis/ListenbrainzApiClient.ts @@ -1,7 +1,7 @@ import AbstractApiClient from "./AbstractApiClient.js"; import request, {Request} from 'superagent'; import {ListenBrainzClientData} from "../common/infrastructure/config/client/listenbrainz.js"; -import {FormatPlayObjectOptions, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions} from "../common/infrastructure/Atomic.js"; import dayjs from "dayjs"; import { containsDelimiters, findDelimiters, @@ -11,6 +11,7 @@ import { unique, uniqueNormalizedStrArr } from "../utils.js"; +import {PlayObject} from "../../core/Atomic.js"; export interface ArtistMBIDMapping { diff --git a/src/apis/maloja/interfaces.ts b/src/server/apis/maloja/interfaces.ts similarity index 100% rename from src/apis/maloja/interfaces.ts rename to src/server/apis/maloja/interfaces.ts diff --git a/src/clients/AbstractScrobbleClient.ts b/src/server/clients/AbstractScrobbleClient.ts similarity index 98% rename from src/clients/AbstractScrobbleClient.ts rename to src/server/clients/AbstractScrobbleClient.ts index 9e564fd0..265063af 100644 --- a/src/clients/AbstractScrobbleClient.ts +++ b/src/server/clients/AbstractScrobbleClient.ts @@ -10,14 +10,15 @@ import { INITIALIZING, InitState, NOT_INITIALIZED, - PlayObject, ScrobbledPlayObject, TrackStringOptions + ScrobbledPlayObject } from "../common/infrastructure/Atomic.js"; import winston, {Logger} from '@foxxmd/winston'; import {CommonClientConfig} from "../common/infrastructure/config/client/index.js"; import {ClientConfig} from "../common/infrastructure/config/client/clients.js"; import {Notifiers} from "../notifier/Notifiers.js"; import {FixedSizeList} from 'fixed-size-list'; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString, truncateStringToLength} from "../../core/StringUtils.js"; export default abstract class AbstractScrobbleClient { diff --git a/src/clients/LastfmScrobbler.ts b/src/server/clients/LastfmScrobbler.ts similarity index 98% rename from src/clients/LastfmScrobbler.ts rename to src/server/clients/LastfmScrobbler.ts index d59a1300..ed260f04 100644 --- a/src/clients/LastfmScrobbler.ts +++ b/src/server/clients/LastfmScrobbler.ts @@ -12,14 +12,14 @@ import LastfmApiClient from "../apis/LastfmApiClient.js"; import { FormatPlayObjectOptions, INITIALIZING, - PlayObject, ScrobbledPlayObject, - TrackStringOptions + ScrobbledPlayObject } from "../common/infrastructure/Atomic.js"; import {LastfmClientConfig} from "../common/infrastructure/config/client/lastfm.js"; import {TrackScrobbleResponse, UserGetRecentTracksResponse} from "lastfm-node-client"; import {Notifiers} from "../notifier/Notifiers.js"; import {Logger} from '@foxxmd/winston'; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; export default class LastfmScrobbler extends AbstractScrobbleClient { diff --git a/src/clients/ListenbrainzScrobbler.ts b/src/server/clients/ListenbrainzScrobbler.ts similarity index 97% rename from src/clients/ListenbrainzScrobbler.ts rename to src/server/clients/ListenbrainzScrobbler.ts index 50056c06..bb376490 100644 --- a/src/clients/ListenbrainzScrobbler.ts +++ b/src/server/clients/ListenbrainzScrobbler.ts @@ -11,15 +11,14 @@ import { import LastfmApiClient from "../apis/LastfmApiClient.js"; import { FormatPlayObjectOptions, - INITIALIZING, - PlayObject, - TrackStringOptions + INITIALIZING } from "../common/infrastructure/Atomic.js"; import {Notifiers} from "../notifier/Notifiers.js"; import {Logger} from '@foxxmd/winston'; import {ListenBrainzClientConfig} from "../common/infrastructure/config/client/listenbrainz.js"; import {ListenbrainzApiClient} from "../apis/ListenbrainzApiClient.js"; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; export default class ListenbrainzScrobbler extends AbstractScrobbleClient { diff --git a/src/clients/MalojaScrobbler.ts b/src/server/clients/MalojaScrobbler.ts similarity index 99% rename from src/clients/MalojaScrobbler.ts rename to src/server/clients/MalojaScrobbler.ts index ccfad598..b1beb4c5 100644 --- a/src/clients/MalojaScrobbler.ts +++ b/src/server/clients/MalojaScrobbler.ts @@ -11,9 +11,7 @@ import { } from "../utils.js"; import { FormatPlayObjectOptions, - INITIALIZING, - PlayObject, - TrackStringOptions + INITIALIZING } from "../common/infrastructure/Atomic.js"; import {MalojaClientConfig} from "../common/infrastructure/config/client/maloja.js"; import {Notifiers} from "../notifier/Notifiers.js"; @@ -24,7 +22,8 @@ import { MalojaScrobbleV2RequestData, MalojaScrobbleV3RequestData, MalojaScrobbleV3ResponseData, MalojaV2ScrobbleData, MalojaV3ScrobbleData } from "../apis/maloja/interfaces"; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject, TrackStringOptions} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; const feat = ["ft.", "ft", "feat.", "feat", "featuring", "Ft.", "Ft", "Feat.", "Feat", "Featuring"]; diff --git a/src/clients/ScrobbleClients.ts b/src/server/clients/ScrobbleClients.ts similarity index 99% rename from src/clients/ScrobbleClients.ts rename to src/server/clients/ScrobbleClients.ts index 192e2744..29a18775 100644 --- a/src/clients/ScrobbleClients.ts +++ b/src/server/clients/ScrobbleClients.ts @@ -8,7 +8,7 @@ import { } from "../utils.js"; import MalojaScrobbler from "./MalojaScrobbler.js"; import LastfmScrobbler from "./LastfmScrobbler.js"; -import {clientTypes, ConfigMeta, PlayObject} from "../common/infrastructure/Atomic.js"; +import {clientTypes, ConfigMeta} from "../common/infrastructure/Atomic.js"; import {AIOConfig} from "../common/infrastructure/config/aioConfig.js"; import * as aioSchema from '../common/schema/aio-client.json'; import * as clientSchema from '../common/schema/client.json'; @@ -22,7 +22,8 @@ import winston from '@foxxmd/winston'; import ListenbrainzScrobbler from "./ListenbrainzScrobbler.js"; import {ListenBrainzClientConfig} from "../common/infrastructure/config/client/listenbrainz.js"; import {ErrorWithCause} from "pony-cause"; -import {buildTrackString} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; type groupedNamedConfigs = {[key: string]: ParsedConfig[]}; diff --git a/src/common/TupleMap.ts b/src/server/common/TupleMap.ts similarity index 100% rename from src/common/TupleMap.ts rename to src/server/common/TupleMap.ts diff --git a/src/common/index.ts b/src/server/common/index.ts similarity index 74% rename from src/common/index.ts rename to src/server/common/index.ts index 334684a9..bb62500a 100644 --- a/src/common/index.ts +++ b/src/server/common/index.ts @@ -4,5 +4,5 @@ import * as path from 'path'; //const __filename = fileURLToPath(import.meta.url); //const __dirname = path.dirname(__filename); -export const projectDir = path.resolve(__dirname, '../../'); +export const projectDir = process.cwd(); //path.resolve(__dirname, '../../../'); export const configDir: string = path.resolve(projectDir, './config'); diff --git a/src/common/infrastructure/Atomic.ts b/src/server/common/infrastructure/Atomic.ts similarity index 68% rename from src/common/infrastructure/Atomic.ts rename to src/server/common/infrastructure/Atomic.ts index e6cb98f7..0e22ec3a 100644 --- a/src/common/infrastructure/Atomic.ts +++ b/src/server/common/infrastructure/Atomic.ts @@ -3,9 +3,9 @@ import {FixedSizeList} from 'fixed-size-list'; import {MESSAGE} from 'triple-beam'; import {Logger} from '@foxxmd/winston'; import TupleMap from "../TupleMap.js"; -import is from "@sindresorhus/is"; import {Request, Response} from "express"; import {NextFunction, ParamsDictionary, Query} from "express-serve-static-core"; +import {PlayMeta, PlayObject} from "../../../core/Atomic.js"; export type SourceType = 'spotify' | 'plex' | 'tautulli' | 'subsonic' | 'jellyfin' | 'lastfm' | 'deezer' | 'ytmusic' | 'mpris' | 'mopidy' | 'listenbrainz' | 'jriver' | 'kodi'; export const sourceTypes: SourceType[] = ['spotify', 'plex', 'tautulli', 'subsonic', 'jellyfin', 'lastfm', 'deezer', 'ytmusic', 'mpris', 'mopidy', 'listenbrainz', 'jriver', 'kodi']; @@ -69,85 +69,6 @@ export const asPlayerStateData = (obj: object): obj is PlayerStateData => { return 'platformId' in obj && 'play' in obj; } -export interface PlayProgress { - timestamp: Dayjs - position?: number - positionPercent?: number -} -export type ListenRange = [PlayProgress, PlayProgress] - -export interface TrackData { - artists?: string[] - album?: string - track?: string - /** - * The length of the track, in seconds - * */ - duration?: number - - meta?: { - brainz?: { - artist?: string - albumArtist?: string - album?: string - track?: string - releaseGroup?: string - } - } -} - -export interface PlayData extends TrackData { - /** - * The date the track was played at - * */ - playDate?: Dayjs - /** Number of seconds the track was listened to */ - listenedFor?: number - listenRanges?: ListenRange[] -} - -export interface PlayMeta { - source?: string - - /** - * Specifies from what facet/data from the source this play was parsed from IE history, now playing, etc... - * */ - parsedFrom?: string - /** - * Unique ID for this track, given by the Source - * */ - trackId?: string - - /** - * Atomic ID for this instance of played tracked IE a unique ID for "this track played at this time" - * */ - playId?: string - newFromSource?: boolean - url?: { - web: string - [key: string]: string - } - user?: string - mediaType?: string - server?: string - library?: string - /** - * The position the "player" is at in the track at the time the play was reported, in seconds - * */ - trackProgressPosition?: number - /** - * A unique identifier for the device playing this track - * */ - deviceId?: string - - [key: string]: any -} - -export interface PlayObject { - data: PlayData, - meta: PlayMeta -} - export interface FormatPlayObjectOptions { newFromSource?: boolean parsedFrom?: string @@ -173,17 +94,6 @@ export const NO_USER = 'SingleUser'; export const SINGLE_USER_PLATFORM_ID: PlayPlatformId = [NO_DEVICE, NO_USER]; -export interface TrackStringOptions { - include?: ('time' | 'artist' | 'track' | 'timeFromNow' | 'trackId')[] - transformers?: { - artists?: (a: string[]) => T | string - track?: (t: string, hasExistingParts?: boolean) => T | string - time?: (t: Dayjs) => T | string - timeFromNow?: (t: Dayjs) => T | string - reducer?: (arr: (T|string)[]) => T //(acc: T, curr: T | string) => T - } -} - export interface ScrobbledPlayObject { play: PlayObject scrobble: PlayObject @@ -282,27 +192,6 @@ export type ExpressRequest = Request>; export type ExpressHandler = (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => Promise>> -export interface SourceStatusData { - status: string; - type: "spotify" | "plex" | "tautulli" | "subsonic" | "jellyfin" | "lastfm" | "deezer" | "ytmusic" | "mpris" | "mopidy" | "listenbrainz" | "jriver" | "kodi"; - display: string; - tracksDiscovered: number; - name: string; - canPoll: boolean; - hasAuth: boolean; - hasAuthInteraction: boolean; - authed: boolean; -} - -export interface ClientStatusData { - status: string; - type: "maloja" | "lastfm" | "listenbrainz"; - display: string; - tracksDiscovered: number; - name: string; - hasAuth: boolean; -} - export interface numberFormatOptions { toFixed: number, defaultVal?: any, diff --git a/src/common/infrastructure/config/aioConfig.ts b/src/server/common/infrastructure/config/aioConfig.ts similarity index 100% rename from src/common/infrastructure/config/aioConfig.ts rename to src/server/common/infrastructure/config/aioConfig.ts diff --git a/src/common/infrastructure/config/client/clients.ts b/src/server/common/infrastructure/config/client/clients.ts similarity index 100% rename from src/common/infrastructure/config/client/clients.ts rename to src/server/common/infrastructure/config/client/clients.ts diff --git a/src/common/infrastructure/config/client/index.ts b/src/server/common/infrastructure/config/client/index.ts similarity index 100% rename from src/common/infrastructure/config/client/index.ts rename to src/server/common/infrastructure/config/client/index.ts diff --git a/src/common/infrastructure/config/client/lastfm.ts b/src/server/common/infrastructure/config/client/lastfm.ts similarity index 100% rename from src/common/infrastructure/config/client/lastfm.ts rename to src/server/common/infrastructure/config/client/lastfm.ts diff --git a/src/common/infrastructure/config/client/listenbrainz.ts b/src/server/common/infrastructure/config/client/listenbrainz.ts similarity index 100% rename from src/common/infrastructure/config/client/listenbrainz.ts rename to src/server/common/infrastructure/config/client/listenbrainz.ts diff --git a/src/common/infrastructure/config/client/maloja.ts b/src/server/common/infrastructure/config/client/maloja.ts similarity index 100% rename from src/common/infrastructure/config/client/maloja.ts rename to src/server/common/infrastructure/config/client/maloja.ts diff --git a/src/common/infrastructure/config/common.ts b/src/server/common/infrastructure/config/common.ts similarity index 100% rename from src/common/infrastructure/config/common.ts rename to src/server/common/infrastructure/config/common.ts diff --git a/src/common/infrastructure/config/health/webhooks.ts b/src/server/common/infrastructure/config/health/webhooks.ts similarity index 100% rename from src/common/infrastructure/config/health/webhooks.ts rename to src/server/common/infrastructure/config/health/webhooks.ts diff --git a/src/common/infrastructure/config/source/deezer.ts b/src/server/common/infrastructure/config/source/deezer.ts similarity index 100% rename from src/common/infrastructure/config/source/deezer.ts rename to src/server/common/infrastructure/config/source/deezer.ts diff --git a/src/common/infrastructure/config/source/index.ts b/src/server/common/infrastructure/config/source/index.ts similarity index 100% rename from src/common/infrastructure/config/source/index.ts rename to src/server/common/infrastructure/config/source/index.ts diff --git a/src/common/infrastructure/config/source/jellyfin.ts b/src/server/common/infrastructure/config/source/jellyfin.ts similarity index 100% rename from src/common/infrastructure/config/source/jellyfin.ts rename to src/server/common/infrastructure/config/source/jellyfin.ts diff --git a/src/common/infrastructure/config/source/jriver.ts b/src/server/common/infrastructure/config/source/jriver.ts similarity index 100% rename from src/common/infrastructure/config/source/jriver.ts rename to src/server/common/infrastructure/config/source/jriver.ts diff --git a/src/common/infrastructure/config/source/kodi.ts b/src/server/common/infrastructure/config/source/kodi.ts similarity index 100% rename from src/common/infrastructure/config/source/kodi.ts rename to src/server/common/infrastructure/config/source/kodi.ts diff --git a/src/common/infrastructure/config/source/lastfm.ts b/src/server/common/infrastructure/config/source/lastfm.ts similarity index 100% rename from src/common/infrastructure/config/source/lastfm.ts rename to src/server/common/infrastructure/config/source/lastfm.ts diff --git a/src/common/infrastructure/config/source/listenbrainz.ts b/src/server/common/infrastructure/config/source/listenbrainz.ts similarity index 100% rename from src/common/infrastructure/config/source/listenbrainz.ts rename to src/server/common/infrastructure/config/source/listenbrainz.ts diff --git a/src/common/infrastructure/config/source/mopidy.ts b/src/server/common/infrastructure/config/source/mopidy.ts similarity index 100% rename from src/common/infrastructure/config/source/mopidy.ts rename to src/server/common/infrastructure/config/source/mopidy.ts diff --git a/src/common/infrastructure/config/source/mpris.ts b/src/server/common/infrastructure/config/source/mpris.ts similarity index 100% rename from src/common/infrastructure/config/source/mpris.ts rename to src/server/common/infrastructure/config/source/mpris.ts diff --git a/src/common/infrastructure/config/source/plex.ts b/src/server/common/infrastructure/config/source/plex.ts similarity index 100% rename from src/common/infrastructure/config/source/plex.ts rename to src/server/common/infrastructure/config/source/plex.ts diff --git a/src/common/infrastructure/config/source/sources.ts b/src/server/common/infrastructure/config/source/sources.ts similarity index 100% rename from src/common/infrastructure/config/source/sources.ts rename to src/server/common/infrastructure/config/source/sources.ts diff --git a/src/common/infrastructure/config/source/spotify.ts b/src/server/common/infrastructure/config/source/spotify.ts similarity index 100% rename from src/common/infrastructure/config/source/spotify.ts rename to src/server/common/infrastructure/config/source/spotify.ts diff --git a/src/common/infrastructure/config/source/subsonic.ts b/src/server/common/infrastructure/config/source/subsonic.ts similarity index 100% rename from src/common/infrastructure/config/source/subsonic.ts rename to src/server/common/infrastructure/config/source/subsonic.ts diff --git a/src/common/infrastructure/config/source/tautulli.ts b/src/server/common/infrastructure/config/source/tautulli.ts similarity index 100% rename from src/common/infrastructure/config/source/tautulli.ts rename to src/server/common/infrastructure/config/source/tautulli.ts diff --git a/src/common/infrastructure/config/source/ytmusic.ts b/src/server/common/infrastructure/config/source/ytmusic.ts similarity index 100% rename from src/common/infrastructure/config/source/ytmusic.ts rename to src/server/common/infrastructure/config/source/ytmusic.ts diff --git a/src/common/infrastructure/typings/lastfm-node-client.d.ts b/src/server/common/infrastructure/typings/lastfm-node-client.d.ts similarity index 100% rename from src/common/infrastructure/typings/lastfm-node-client.d.ts rename to src/server/common/infrastructure/typings/lastfm-node-client.d.ts diff --git a/src/common/infrastructure/typings/passport-deezer.d.ts b/src/server/common/infrastructure/typings/passport-deezer.d.ts similarity index 100% rename from src/common/infrastructure/typings/passport-deezer.d.ts rename to src/server/common/infrastructure/typings/passport-deezer.d.ts diff --git a/src/common/logging.ts b/src/server/common/logging.ts similarity index 99% rename from src/common/logging.ts rename to src/server/common/logging.ts index 8622bd20..e64fa269 100644 --- a/src/common/logging.ts +++ b/src/server/common/logging.ts @@ -11,8 +11,6 @@ import DailyRotateFile from 'winston-daily-rotate-file'; import dayjs from "dayjs"; import stringify from 'safe-stable-stringify'; import {SPLAT, LEVEL, MESSAGE} from 'triple-beam'; -import {Symbol} from "typescript-json-schema"; -import {truncateStringToLength} from "../utils/StringUtils.js"; const {combine, printf, timestamp, label, splat, errors} = format; diff --git a/src/common/schema/aio-client.json b/src/server/common/schema/aio-client.json similarity index 100% rename from src/common/schema/aio-client.json rename to src/server/common/schema/aio-client.json diff --git a/src/common/schema/aio-source.json b/src/server/common/schema/aio-source.json similarity index 100% rename from src/common/schema/aio-source.json rename to src/server/common/schema/aio-source.json diff --git a/src/common/schema/aio.json b/src/server/common/schema/aio.json similarity index 100% rename from src/common/schema/aio.json rename to src/server/common/schema/aio.json diff --git a/src/common/schema/client.json b/src/server/common/schema/client.json similarity index 100% rename from src/common/schema/client.json rename to src/server/common/schema/client.json diff --git a/src/common/schema/source.json b/src/server/common/schema/source.json similarity index 100% rename from src/common/schema/source.json rename to src/server/common/schema/source.json diff --git a/src/index.ts b/src/server/index.ts similarity index 98% rename from src/index.ts rename to src/server/index.ts index ddda03f5..5611417b 100644 --- a/src/index.ts +++ b/src/server/index.ts @@ -19,7 +19,7 @@ import { remoteHostIdentifiers, sleep } from "./utils.js"; -import {makeClientCheckMiddle, makeSourceCheckMiddle} from "./server/middleware.js"; +import {makeClientCheckMiddle, makeSourceCheckMiddle} from "./api/middleware.js"; import TautulliSource from "./sources/TautulliSource.js"; import PlexSource, {plexRequestMiddle} from "./sources/PlexSource.js"; import JellyfinSource from "./sources/JellyfinSource.js"; @@ -33,9 +33,7 @@ import AbstractSource from "./sources/AbstractSource.js"; import { ExpressHandler, LogInfo, - LogLevel, - PlayObject, - TrackStringOptions + LogLevel } from "./common/infrastructure/Atomic.js"; import SpotifySource from "./sources/SpotifySource.js"; import {JellyfinNotifier} from "./sources/ingressNotifiers/JellyfinNotifier.js"; @@ -45,9 +43,12 @@ import {AIOConfig} from "./common/infrastructure/config/aioConfig.js"; import {getRoot} from "./ioc.js"; import {formatLogToHtml, getLogger, isLogLineMinLevel} from "./common/logging.js"; import {MESSAGE} from "triple-beam"; -import {setupApi} from "./server/api.js"; +import {setupApi} from "./api/api.js"; import {Transform} from "stream"; -import {buildTrackString, longestString, truncateStringToLength} from "./utils/StringUtils.js"; +import {PlayObject, TrackStringOptions} from "../core/Atomic.js"; +import {buildTrackString, longestString, truncateStringToLength} from "../core/StringUtils.js"; + +const buildDir = path.join(process.cwd() + "/build"); dayjs.extend(utc) @@ -67,6 +68,13 @@ let io: Server | undefined = undefined; app.use(router); app.use(bodyParser.json()); +app.use( + bodyParser.urlencoded({ + extended: true, + }) +); + +app.use(express.static(buildDir)); app.use(session({secret: 'keyboard cat', resave: false, saveUninitialized: false})); app.use(passport.initialize()); @@ -85,6 +93,7 @@ initLogger.stream().on('log', (log: LogInfo) => { let logger: Logger; +const f = projectDir; const configDir = process.env.CONFIG_DIR || path.resolve(projectDir, `./config`); @@ -649,6 +658,10 @@ const configDir = process.env.CONFIG_DIR || path.resolve(projectDir, `./config`) logger.info(`Some sources are not ready, open ${localUrl} to continue`); } + app.get("/*", function (req, res) { + res.sendFile(path.join(buildDir, "index.html")); + }); + app.set('views', path.resolve(projectDir, 'src/views')); app.set('view engine', 'ejs'); logger.info(`Server started at ${localUrl}`); diff --git a/src/ioc.ts b/src/server/ioc.ts similarity index 100% rename from src/ioc.ts rename to src/server/ioc.ts diff --git a/src/notifier/AbstractWebhookNotifier.ts b/src/server/notifier/AbstractWebhookNotifier.ts similarity index 100% rename from src/notifier/AbstractWebhookNotifier.ts rename to src/server/notifier/AbstractWebhookNotifier.ts diff --git a/src/notifier/GotifyWebhookNotifier.ts b/src/server/notifier/GotifyWebhookNotifier.ts similarity index 100% rename from src/notifier/GotifyWebhookNotifier.ts rename to src/server/notifier/GotifyWebhookNotifier.ts diff --git a/src/notifier/Notifiers.ts b/src/server/notifier/Notifiers.ts similarity index 100% rename from src/notifier/Notifiers.ts rename to src/server/notifier/Notifiers.ts diff --git a/src/notifier/NtfyWebhookNotifier.ts b/src/server/notifier/NtfyWebhookNotifier.ts similarity index 100% rename from src/notifier/NtfyWebhookNotifier.ts rename to src/server/notifier/NtfyWebhookNotifier.ts diff --git a/src/sources/AbstractSource.ts b/src/server/sources/AbstractSource.ts similarity index 98% rename from src/sources/AbstractSource.ts rename to src/server/sources/AbstractSource.ts index a159ffd1..3d5e6bc2 100644 --- a/src/sources/AbstractSource.ts +++ b/src/server/sources/AbstractSource.ts @@ -11,7 +11,7 @@ import { GroupedFixedPlays, GroupedPlays, InternalConfig, NO_DEVICE, NO_USER, - PlayObject, PlayPlatformId, PlayUserId, ProgressAwarePlayObject, SINGLE_USER_PLATFORM_ID, + PlayPlatformId, PlayUserId, ProgressAwarePlayObject, SINGLE_USER_PLATFORM_ID, SourceType } from "../common/infrastructure/Atomic.js"; import {Logger} from '@foxxmd/winston'; @@ -19,7 +19,8 @@ import {SourceConfig} from "../common/infrastructure/config/source/sources.js"; import {EventEmitter} from "events"; import {FixedSizeList} from "fixed-size-list"; import TupleMap from "../common/TupleMap.js"; -import {buildTrackString} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; export interface RecentlyPlayedOptions { limit?: number diff --git a/src/sources/DeezerSource.ts b/src/server/sources/DeezerSource.ts similarity index 98% rename from src/sources/DeezerSource.ts rename to src/server/sources/DeezerSource.ts index 0f78d2a1..5cd74289 100644 --- a/src/sources/DeezerSource.ts +++ b/src/server/sources/DeezerSource.ts @@ -4,8 +4,9 @@ import {Strategy as DeezerStrategy} from 'passport-deezer'; import AbstractSource, {RecentlyPlayedOptions} from "./AbstractSource.js"; import dayjs from "dayjs"; import {DeezerSourceConfig} from "../common/infrastructure/config/source/deezer.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import EventEmitter from "events"; +import {PlayObject} from "../../core/Atomic.js"; export default class DeezerSource extends AbstractSource { workingCredsPath; diff --git a/src/sources/JRiverSource.ts b/src/server/sources/JRiverSource.ts similarity index 96% rename from src/sources/JRiverSource.ts rename to src/server/sources/JRiverSource.ts index 17889adf..c425fe57 100644 --- a/src/sources/JRiverSource.ts +++ b/src/server/sources/JRiverSource.ts @@ -1,5 +1,5 @@ import MemorySource from "./MemorySource.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import dayjs from "dayjs"; import {URL} from "url"; import normalizeUrl from 'normalize-url'; @@ -7,6 +7,7 @@ import {EventEmitter} from "events"; import {RecentlyPlayedOptions} from "./AbstractSource.js"; import {JRiverSourceConfig} from "../common/infrastructure/config/source/jriver.js"; import {Info, JRiverApiClient, PLAYER_STATE} from "../apis/JRiverApiClient.js"; +import {PlayObject} from "../../core/Atomic.js"; export class JRiverSource extends MemorySource { declare config: JRiverSourceConfig; diff --git a/src/sources/JellyfinSource.ts b/src/server/sources/JellyfinSource.ts similarity index 98% rename from src/sources/JellyfinSource.ts rename to src/server/sources/JellyfinSource.ts index fb2b3cca..bf945d7b 100644 --- a/src/sources/JellyfinSource.ts +++ b/src/server/sources/JellyfinSource.ts @@ -8,12 +8,13 @@ import { comparePlayTemporally, temporalPlayComparisonSummary, doubleReturnNewline } from "../utils.js"; import {JellySourceConfig} from "../common/infrastructure/config/source/jellyfin.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject, PlayPlatformId} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig, PlayPlatformId} from "../common/infrastructure/Atomic.js"; import EventEmitter from "events"; import {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.js"; import {Logger} from "@foxxmd/winston"; import {JellyfinPlayerState} from "./PlayerState/JellyfinPlayerState.js"; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString, truncateStringToLength} from "../../core/StringUtils.js"; const shortDeviceId = truncateStringToLength(10, ''); diff --git a/src/sources/KodiSource.ts b/src/server/sources/KodiSource.ts similarity index 94% rename from src/sources/KodiSource.ts rename to src/server/sources/KodiSource.ts index e972ac89..90d6d006 100644 --- a/src/sources/KodiSource.ts +++ b/src/server/sources/KodiSource.ts @@ -1,9 +1,10 @@ import MemorySource from "./MemorySource.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import {EventEmitter} from "events"; import {RecentlyPlayedOptions} from "./AbstractSource.js"; import {KodiSourceConfig} from "../common/infrastructure/config/source/kodi.js"; import {KodiApiClient} from "../apis/KodiApiClient.js"; +import {PlayObject} from "../../core/Atomic.js"; export class KodiSource extends MemorySource { declare config: KodiSourceConfig; diff --git a/src/sources/LastfmSource.ts b/src/server/sources/LastfmSource.ts similarity index 96% rename from src/sources/LastfmSource.ts rename to src/server/sources/LastfmSource.ts index f52c53d3..4274253c 100644 --- a/src/sources/LastfmSource.ts +++ b/src/server/sources/LastfmSource.ts @@ -2,9 +2,10 @@ import AbstractSource, {RecentlyPlayedOptions} from "./AbstractSource.js"; import LastfmApiClient from "../apis/LastfmApiClient.js"; import {sortByOldestPlayDate} from "../utils.js"; import {LastfmClientConfig} from "../common/infrastructure/config/client/lastfm.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import {UserGetRecentTracksResponse} from "lastfm-node-client"; import EventEmitter from "events"; +import {PlayObject} from "../../core/Atomic.js"; export default class LastfmSource extends AbstractSource { diff --git a/src/sources/ListenbrainzSource.ts b/src/server/sources/ListenbrainzSource.ts similarity index 100% rename from src/sources/ListenbrainzSource.ts rename to src/server/sources/ListenbrainzSource.ts diff --git a/src/sources/MPRISSource.ts b/src/server/sources/MPRISSource.ts similarity index 98% rename from src/sources/MPRISSource.ts rename to src/server/sources/MPRISSource.ts index 4129c4f0..fd1d0705 100644 --- a/src/sources/MPRISSource.ts +++ b/src/server/sources/MPRISSource.ts @@ -7,12 +7,13 @@ import { PlaybackStatus, PlayerInfo, PROPERTIES_IFACE } from "../common/infrastructure/config/source/mpris.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import MemorySource from "./MemorySource.js"; import {RecentlyPlayedOptions} from "./AbstractSource.js"; import {removeDuplicates} from "../utils.js"; import EventEmitter from "events"; import {ErrorWithCause} from "pony-cause"; +import {PlayObject} from "../../core/Atomic.js"; export class MPRISSource extends MemorySource { diff --git a/src/sources/MemorySource.ts b/src/server/sources/MemorySource.ts similarity index 99% rename from src/sources/MemorySource.ts rename to src/server/sources/MemorySource.ts index 91ddc4ce..fc6a48ad 100644 --- a/src/sources/MemorySource.ts +++ b/src/server/sources/MemorySource.ts @@ -16,7 +16,7 @@ import { asPlayerStateData, DeviceId, GroupedPlays, PlayerStateData, - PlayObject, PlayPlatformId, PlayUserId, + PlayPlatformId, PlayUserId, ProgressAwarePlayObject, ScrobbleThresholdResult } from "../common/infrastructure/Atomic.js"; @@ -24,7 +24,8 @@ import TupleMap from "../common/TupleMap.js"; import {AbstractPlayerState, PlayerStateOptions} from "./PlayerState/AbstractPlayerState.js"; import {GenericPlayerState} from "./PlayerState/GenericPlayerState.js"; import {Logger} from "@foxxmd/winston"; -import {buildTrackString} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; export default class MemorySource extends AbstractSource { /* diff --git a/src/sources/MopidySource.ts b/src/server/sources/MopidySource.ts similarity index 97% rename from src/sources/MopidySource.ts rename to src/server/sources/MopidySource.ts index 7562c46a..0acc09a5 100644 --- a/src/sources/MopidySource.ts +++ b/src/server/sources/MopidySource.ts @@ -4,7 +4,6 @@ import { FormatPlayObjectOptions, InternalConfig, PlayerStateData, - PlayObject, SINGLE_USER_PLATFORM_ID } from "../common/infrastructure/Atomic.js"; import dayjs from "dayjs"; @@ -15,10 +14,8 @@ import {EventEmitter} from "events"; import pEvent from 'p-event'; import winston from '@foxxmd/winston'; import {RecentlyPlayedOptions} from "./AbstractSource.js"; -import request from "superagent"; -import {removeDuplicates} from "../utils.js"; -import {SubsonicSource} from "./SubsonicSource.js"; -import {buildTrackString} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString} from "../../core/StringUtils.js"; export class MopidySource extends MemorySource { declare config: MopidySourceConfig; diff --git a/src/sources/PlayerState/AbstractPlayerState.ts b/src/server/sources/PlayerState/AbstractPlayerState.ts similarity index 98% rename from src/sources/PlayerState/AbstractPlayerState.ts rename to src/server/sources/PlayerState/AbstractPlayerState.ts index fe916b1e..0b3ce76a 100644 --- a/src/sources/PlayerState/AbstractPlayerState.ts +++ b/src/server/sources/PlayerState/AbstractPlayerState.ts @@ -1,8 +1,6 @@ import { CALCULATED_PLAYER_STATUSES, CalculatedPlayerStatus, - ListenRange, PlayData, - PlayObject, PlayPlatformId, REPORTED_PLAYER_STATUSES, ReportedPlayerStatus @@ -11,7 +9,8 @@ import dayjs, {Dayjs} from "dayjs"; import {formatNumber, genGroupIdStr, playObjDataMatch, progressBar} from "../../utils.js"; import {Logger} from "@foxxmd/winston"; import {ListenProgress} from "./ListenProgress.js"; -import {buildTrackString} from "../../utils/StringUtils.js"; +import {ListenRange, PlayData, PlayObject} from "../../../core/Atomic.js"; +import {buildTrackString} from "../../../core/StringUtils.js"; export interface PlayerStateIntervals { staleInterval?: number diff --git a/src/sources/PlayerState/GenericPlayerState.ts b/src/server/sources/PlayerState/GenericPlayerState.ts similarity index 100% rename from src/sources/PlayerState/GenericPlayerState.ts rename to src/server/sources/PlayerState/GenericPlayerState.ts diff --git a/src/sources/PlayerState/JellyfinPlayerState.ts b/src/server/sources/PlayerState/JellyfinPlayerState.ts similarity index 81% rename from src/sources/PlayerState/JellyfinPlayerState.ts rename to src/server/sources/PlayerState/JellyfinPlayerState.ts index 3e9978ac..2bd2962e 100644 --- a/src/sources/PlayerState/JellyfinPlayerState.ts +++ b/src/server/sources/PlayerState/JellyfinPlayerState.ts @@ -1,7 +1,8 @@ import {GenericPlayerState} from "./GenericPlayerState.js"; import {Logger} from "@foxxmd/winston"; -import {PlayObject, PlayPlatformId, ReportedPlayerStatus} from "../../common/infrastructure/Atomic.js"; +import {PlayPlatformId, ReportedPlayerStatus} from "../../common/infrastructure/Atomic.js"; import {PlayerStateOptions} from "./AbstractPlayerState.js"; +import {PlayObject} from "../../../core/Atomic.js"; export class JellyfinPlayerState extends GenericPlayerState { constructor(logger: Logger, platformId: PlayPlatformId, opts?: PlayerStateOptions) { diff --git a/src/sources/PlayerState/ListenProgress.ts b/src/server/sources/PlayerState/ListenProgress.ts similarity index 88% rename from src/sources/PlayerState/ListenProgress.ts rename to src/server/sources/PlayerState/ListenProgress.ts index ead3da93..36e495de 100644 --- a/src/sources/PlayerState/ListenProgress.ts +++ b/src/server/sources/PlayerState/ListenProgress.ts @@ -1,5 +1,6 @@ import dayjs, {Dayjs} from "dayjs"; -import {PlayProgress} from "../../common/infrastructure/Atomic.js"; + +import {PlayProgress} from "../../../core/Atomic.js"; export class ListenProgress implements PlayProgress { diff --git a/src/sources/PlexSource.ts b/src/server/sources/PlexSource.ts similarity index 98% rename from src/sources/PlexSource.ts rename to src/server/sources/PlexSource.ts index 2937d4c3..2e2fea74 100644 --- a/src/sources/PlexSource.ts +++ b/src/server/sources/PlexSource.ts @@ -7,10 +7,11 @@ import AbstractSource from "./AbstractSource.js"; import formidable from 'formidable'; import concatStream from 'concat-stream'; import {PlexSourceConfig} from "../common/infrastructure/config/source/plex.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject, SourceType} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig, SourceType} from "../common/infrastructure/Atomic.js"; import EventEmitter from "events"; import winston from '@foxxmd/winston'; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {truncateStringToLength} from "../../core/StringUtils.js"; const shortDeviceId = truncateStringToLength(10, ''); diff --git a/src/sources/ScrobbleSources.ts b/src/server/sources/ScrobbleSources.ts similarity index 100% rename from src/sources/ScrobbleSources.ts rename to src/server/sources/ScrobbleSources.ts diff --git a/src/sources/SpotifySource.ts b/src/server/sources/SpotifySource.ts similarity index 98% rename from src/sources/SpotifySource.ts rename to src/server/sources/SpotifySource.ts index af2b1bef..fd8b6361 100644 --- a/src/sources/SpotifySource.ts +++ b/src/server/sources/SpotifySource.ts @@ -12,7 +12,7 @@ import { InternalConfig, NO_USER, PlayerStateData, - PlayObject, ReportedPlayerStatus, SourceData + ReportedPlayerStatus, SourceData } from "../common/infrastructure/Atomic.js"; import PlayHistoryObject = SpotifyApi.PlayHistoryObject; import EventEmitter from "events"; @@ -23,7 +23,8 @@ import AlbumObjectSimplified = SpotifyApi.AlbumObjectSimplified; import UserDevice = SpotifyApi.UserDevice; import MemorySource from "./MemorySource.js"; import {ErrorWithCause} from "pony-cause"; -import {buildTrackString, truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {buildTrackString, truncateStringToLength} from "../../core/StringUtils.js"; const scopes = ['user-read-recently-played', 'user-read-currently-playing', 'user-read-playback-state', 'user-read-playback-position']; const state = 'random'; diff --git a/src/sources/SubsonicSource.ts b/src/server/sources/SubsonicSource.ts similarity index 97% rename from src/sources/SubsonicSource.ts rename to src/server/sources/SubsonicSource.ts index a59e2e9b..8f5262fd 100644 --- a/src/sources/SubsonicSource.ts +++ b/src/server/sources/SubsonicSource.ts @@ -5,10 +5,10 @@ import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; import {parseRetryAfterSecsFromObj, removeDuplicates, sleep} from "../utils.js"; import MemorySource from "./MemorySource.js"; import {SubSonicSourceConfig} from "../common/infrastructure/config/source/subsonic.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import {RecentlyPlayedOptions} from "./AbstractSource.js"; import EventEmitter from "events"; -import {buildTrackString} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; dayjs.extend(isSameOrAfter); diff --git a/src/sources/TautulliSource.ts b/src/server/sources/TautulliSource.ts similarity index 92% rename from src/sources/TautulliSource.ts rename to src/server/sources/TautulliSource.ts index 8b46d0a9..b249aa6a 100644 --- a/src/sources/TautulliSource.ts +++ b/src/server/sources/TautulliSource.ts @@ -1,11 +1,12 @@ import dayjs from "dayjs"; import PlexSource from "./PlexSource.js"; import {TautulliSourceConfig} from "../common/infrastructure/config/source/tautulli.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import {combinePartsToString} from "../utils.js"; import EventEmitter from "events"; import {Request} from "express"; -import {truncateStringToLength} from "../utils/StringUtils.js"; +import {PlayObject} from "../../core/Atomic.js"; +import {truncateStringToLength} from "../../core/StringUtils.js"; const shortDeviceId = truncateStringToLength(10, ''); diff --git a/src/sources/YTMusicSource.ts b/src/server/sources/YTMusicSource.ts similarity index 98% rename from src/sources/YTMusicSource.ts rename to src/server/sources/YTMusicSource.ts index 6c5a041e..7e09942c 100644 --- a/src/sources/YTMusicSource.ts +++ b/src/server/sources/YTMusicSource.ts @@ -1,13 +1,14 @@ import YouTubeMusic from "youtube-music-ts-api"; import AbstractSource, {RecentlyPlayedOptions} from "./AbstractSource.js"; -import {FormatPlayObjectOptions, InternalConfig, PlayObject} from "../common/infrastructure/Atomic.js"; +import {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.js"; import {IYouTubeMusicAuthenticated} from "youtube-music-ts-api/interfaces-primary"; import dayjs from "dayjs"; import {parseDurationFromTimestamp, playObjDataMatch} from "../utils.js"; import {IPlaylistDetail, ITrackDetail} from "youtube-music-ts-api/interfaces-supplementary"; import {YTMusicSourceConfig} from "../common/infrastructure/config/source/ytmusic.js"; import EventEmitter from "events"; +import {PlayObject} from "../../core/Atomic.js"; export default class YTMusicSource extends AbstractSource { apiInstance?: IYouTubeMusicAuthenticated diff --git a/src/sources/ingressNotifiers/IngressNotifier.ts b/src/server/sources/ingressNotifiers/IngressNotifier.ts similarity index 100% rename from src/sources/ingressNotifiers/IngressNotifier.ts rename to src/server/sources/ingressNotifiers/IngressNotifier.ts diff --git a/src/sources/ingressNotifiers/JellyfinNotifier.ts b/src/server/sources/ingressNotifiers/JellyfinNotifier.ts similarity index 100% rename from src/sources/ingressNotifiers/JellyfinNotifier.ts rename to src/server/sources/ingressNotifiers/JellyfinNotifier.ts diff --git a/src/sources/ingressNotifiers/PlexNotifier.ts b/src/server/sources/ingressNotifiers/PlexNotifier.ts similarity index 100% rename from src/sources/ingressNotifiers/PlexNotifier.ts rename to src/server/sources/ingressNotifiers/PlexNotifier.ts diff --git a/src/sources/ingressNotifiers/TautulliNotifier.ts b/src/server/sources/ingressNotifiers/TautulliNotifier.ts similarity index 100% rename from src/sources/ingressNotifiers/TautulliNotifier.ts rename to src/server/sources/ingressNotifiers/TautulliNotifier.ts diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json new file mode 100644 index 00000000..3bbed55d --- /dev/null +++ b/src/server/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "sourceMap": true, + "resolveJsonModule": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": ["es2020", "dom"], + "module": "commonjs", + "target": "es2020", + "esModuleInterop": true, + + "typeRoots": [ + "../../node_modules/@types", + "../../src/common/infrastructure/typings" + ], + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "**/*.js" + ], + "exclude": [ + "../../web", + "../../node_modules", + "../../coverage", + "../../tests/*.ts", + "../../_site", + "../../docsite", + "../../build", "../client" + ] +} diff --git a/src/utils.ts b/src/server/utils.ts similarity index 99% rename from src/utils.ts rename to src/server/utils.ts index bc3fc71e..bb252226 100644 --- a/src/utils.ts +++ b/src/server/utils.ts @@ -8,13 +8,11 @@ import Ajv, {Schema} from 'ajv'; import { asPlayerStateData, DEFAULT_SCROBBLE_DURATION_THRESHOLD, - ListenRange, lowGranularitySources, NO_DEVICE, NO_USER, numberFormatOptions, PlayerStateData, - PlayObject, PlayPlatformId, ProgressAwarePlayObject, RegExResult, @@ -29,6 +27,7 @@ import {ScrobbleThresholds} from "./common/infrastructure/config/source/index.js import {replaceResultTransformer, stripIndentTransformer, TemplateTag, trimResultTransformer} from 'common-tags'; import is from "@sindresorhus/is"; import {Duration} from "dayjs/plugin/duration.js"; +import {ListenRange, PlayObject} from "../core/Atomic.js"; dayjs.extend(utc); diff --git a/src/views/recent.ejs b/src/server/views/recent.ejs similarity index 100% rename from src/views/recent.ejs rename to src/server/views/recent.ejs diff --git a/src/views/status.ejs b/src/server/views/status.ejs similarity index 100% rename from src/views/status.ejs rename to src/server/views/status.ejs diff --git a/web/src/setupTests.ts b/src/setupTests.ts similarity index 100% rename from web/src/setupTests.ts rename to src/setupTests.ts diff --git a/web/tailwind.config.js b/tailwind.config.js similarity index 100% rename from web/tailwind.config.js rename to tailwind.config.js diff --git a/tsconfig.json b/tsconfig.json index 88e445a6..62cefc6e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,31 +1,30 @@ { "compilerOptions": { - "sourceMap": true, - "resolveJsonModule": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": ["es2020", "dom"], - "module": "commonjs", - "target": "es2020", - "esModuleInterop": true, - - "typeRoots": [ - "./node_modules/@types", - "./src/common/infrastructure/typings" + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" }, "include": [ - "**/*.ts", - "**/*.tsx", - "**/*.js" + "src" ], "exclude": [ "web", - "node_modules", - "coverage", - "tests/*.ts", - "_site", - "docsite", - "web" - ] + "src/server" + ], } diff --git a/web/.gitignore b/web/.gitignore deleted file mode 100644 index 4d29575d..00000000 --- a/web/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/web/README.md b/web/README.md deleted file mode 100644 index b87cb004..00000000 --- a/web/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/web/package.json b/web/package.json deleted file mode 100644 index 0758a728..00000000 --- a/web/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "web", - "version": "0.1.0", - "private": true, - "dependencies": { - "@react-nano/use-event-source": "^0.13.0", - "@tanstack/react-query": "^4.32.1", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.39", - "@types/react": "^18.2.18", - "@types/react-dom": "^18.2.7", - "ky": "^0.33.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.15.0", - "react-scripts": "5.0.1", - "tailwindcss": "^3.3.3", - "typescript": "^4.9.5", - "web-vitals": "^2.1.4" - }, - "devDependencies": { - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@types/react-window": "^1.8.5" - }, - "proxy": "http://localhost:9079", - "scripts": { - "start": "BROWSER=none PORT=9078 react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} diff --git a/web/src/logs/LogLine.tsx b/web/src/logs/LogLine.tsx deleted file mode 100644 index a40804a9..00000000 --- a/web/src/logs/LogLine.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React, {PropsWithChildren} from 'react'; - -const breakSymbol = '
'; - -const replaceLevel = (chunk: string) => { - return chunk.toString().replace('\n', breakSymbol) - .replace(/(debug)\s/gi, '$1 ') - .replace(/(warn)\s/gi, '$1 ') - .replace(/(info)\s/gi, '$1 ') - .replace(/(verbose)\s/gi, '$1 ') - .replace(/(error)\s/gi, '$1 ') - .trim(); -} -const getClass = (level: string) => { - switch(level) { - case 'debug': - return 'debug blue'; - case 'warn': - return 'warn yellow'; - case 'info': - return 'info green'; - case 'verbose': - return 'verbose purple'; - case 'error': - return 'error red'; - } -} -const LogLine = (props: PropsWithChildren<{level: string, message: string}>) => { - return
-}; - -export default LogLine; diff --git a/web/src/logs/LogsSection.css b/web/src/logs/LogsSection.css deleted file mode 100644 index e14237f2..00000000 --- a/web/src/logs/LogsSection.css +++ /dev/null @@ -1,8 +0,0 @@ -.connected.loading { - display: inline; -} -.loading { - height: 35px; - fill: white; - display: none; -} diff --git a/web/src/logs/LogsSection.tsx b/web/src/logs/LogsSection.tsx deleted file mode 100644 index 5a883e92..00000000 --- a/web/src/logs/LogsSection.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, {useState} from 'react'; -import './LogsSection.css'; -import {FixedSizeList} from "fixed-size-list"; -import { useEventSource, useEventSourceListener } from "@react-nano/use-event-source"; -import LogLine from "./LogLine"; - -let logBuffer: {message: string, id: string, level: string}[] = []; - -const list = new FixedSizeList<{message: string, id: string, level: string}>(50); - -const LogsSection = () => { - const [logList, setLogList] = useState(logBuffer); - - const [eventSource, eventSourceStatus] = useEventSource("logs/stream", false); - useEventSourceListener(eventSource, ['messsage','stream'], evt => { - const data = JSON.parse(evt.data); - // @ts-ignore - list.add({message: data.message, id: evt.lastEventId}); - setLogList(Array.from(list.data)); - //console.log(evt); - }, [setLogList]); - - return ( -
-
-
-

Log (Most Recent) - {/*https://codepen.io/nikhil8krishnan/pen/rVoXJa*/} - - - - - -

-
-
-
Level : INFO
-
Sort : ASC
-
Limit : 50
-
-
- { - logList.map(x => ) - } -
-
-
-
-
-
-
-
- ); -} - -export default LogsSection; diff --git a/web/src/reportWebVitals.js b/web/src/reportWebVitals.js deleted file mode 100644 index b48657f1..00000000 --- a/web/src/reportWebVitals.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const reportWebVitals = (onPerfEntry) => { - if (onPerfEntry && onPerfEntry instanceof Function) { - Promise.resolve().then(() => __importStar(require('web-vitals'))).then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; -exports.default = reportWebVitals; -//# sourceMappingURL=reportWebVitals.js.map \ No newline at end of file diff --git a/web/src/reportWebVitals.js.map b/web/src/reportWebVitals.js.map deleted file mode 100644 index 6e1f0ace..00000000 --- a/web/src/reportWebVitals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reportWebVitals.js","sourceRoot":"","sources":["reportWebVitals.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,eAAe,GAAG,CAAC,WAA2B,EAAE,EAAE;IACtD,IAAI,WAAW,IAAI,WAAW,YAAY,QAAQ,EAAE;QAClD,kDAAO,YAAY,IAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACxE,MAAM,CAAC,WAAW,CAAC,CAAC;YACpB,MAAM,CAAC,WAAW,CAAC,CAAC;YACpB,MAAM,CAAC,WAAW,CAAC,CAAC;YACpB,MAAM,CAAC,WAAW,CAAC,CAAC;YACpB,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;KACJ;AACH,CAAC,CAAC;AAEF,kBAAe,eAAe,CAAC"} \ No newline at end of file diff --git a/web/src/setupProxy.js b/web/src/setupProxy.js deleted file mode 100644 index e8b6897d..00000000 --- a/web/src/setupProxy.js +++ /dev/null @@ -1,11 +0,0 @@ -const { createProxyMiddleware } = require('http-proxy-middleware'); - -module.exports = function(app) { - app.use( - /\/(dashboard|tautulli|plex|jellyfin|client|source|health)|(.+(deezer|callback))/i, - createProxyMiddleware({ - target: 'http://localhost:9079', - changeOrigin: true, - }) - ); -}; diff --git a/web/src/setupTests.js b/web/src/setupTests.js deleted file mode 100644 index ccf6a2f4..00000000 --- a/web/src/setupTests.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -require("@testing-library/jest-dom"); -//# sourceMappingURL=setupTests.js.map \ No newline at end of file diff --git a/web/src/setupTests.js.map b/web/src/setupTests.js.map deleted file mode 100644 index d517e193..00000000 --- a/web/src/setupTests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"setupTests.js","sourceRoot":"","sources":["setupTests.ts"],"names":[],"mappings":";;AAAA,iEAAiE;AACjE,gCAAgC;AAChC,8CAA8C;AAC9C,0DAA0D;AAC1D,qCAAmC"} \ No newline at end of file diff --git a/web/tsconfig.json b/web/tsconfig.json deleted file mode 100644 index 4a501cc1..00000000 --- a/web/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": [ - "src" - ] -} diff --git a/webpack.config.server.js b/webpack.config.server.js new file mode 100644 index 00000000..108d6093 --- /dev/null +++ b/webpack.config.server.js @@ -0,0 +1,39 @@ +const path = require("path"); +const nodeExternals = require("webpack-node-externals"); + +// Used this article to get CRA and express backed to co-exist on same port for both dev/prod +// https://spin.atomicobject.com/2020/08/17/cra-express-share-code/ + +const entry = { server: "./src/server/index.ts" }; + +module.exports = { + mode: process.env.NODE_ENV ? process.env.NODE_ENV : "development", + target: "node", + devtool: "inline-source-map", + entry: entry, + output: { + path: path.resolve(__dirname, "build"), + filename: "[name].js", + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + }, + // don't compile node_modules + externals: [nodeExternals()], + module: { + rules: [ + { + test: /\.tsx?$/, + use: [ + { + loader: "ts-loader", + options: { + // use the tsconfig in the server directory + configFile: "src/server/tsconfig.json", + }, + }, + ], + }, + ], + }, +}; diff --git a/yarn.lock b/yarn.lock index 7feecc2e..2b6fbd6e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.0.1": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" - integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -39,12 +39,13 @@ resolved "https://registry.yarnpkg.com/@awaitjs/express/-/express-0.6.3.tgz#fc0af0918ad4d5aff436f7b84b0ab5209fab5acf" integrity sha512-x7N92+Rmy/WHEaXXunV2ArVa/AqzkJlouc8pokuVF9h6DeUtbkPaEKVYKMDEFs2u5Hbw2XfwGVyLf69yr2UG5g== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" + integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== dependencies: - "@babel/highlight" "^7.22.5" + "@babel/highlight" "^7.22.10" + chalk "^2.4.2" "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" @@ -52,20 +53,20 @@ integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" - integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" + integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.6" - "@babel/parser" "^7.22.7" + "@babel/helpers" "^7.22.10" + "@babel/parser" "^7.22.10" "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.8" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -73,20 +74,20 @@ semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz#75f8aa978d1e76c87cc6f26c1ea16ae58804d390" - integrity sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.10.tgz#bfdf3d1b32ad573fe7c1c3447e0b485e3a41fd09" + integrity sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" - integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== +"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" + integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -99,16 +100,16 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" - integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" + integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" - integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" + integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== dependencies: "@babel/compat-data" "^7.22.9" "@babel/helper-validator-option" "^7.22.5" @@ -116,10 +117,10 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6", "@babel/helper-create-class-features-plugin@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" - integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.10", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" + integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" @@ -208,7 +209,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5": +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== @@ -263,36 +264,36 @@ integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== "@babel/helper-wrap-function@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" - integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.10" -"@babel/helpers@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" - integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== +"@babel/helpers@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" + integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== dependencies: "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" - "@babel/types" "^7.22.5" + "@babel/traverse" "^7.22.10" + "@babel/types" "^7.22.10" -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== +"@babel/highlight@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" + integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" @@ -319,15 +320,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7" - integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz#d6a8c3a9018e1b13e6647f869c5ea56ff2b585d4" + integrity sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-create-class-features-plugin" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/plugin-syntax-decorators" "^7.22.5" + "@babel/plugin-syntax-decorators" "^7.22.10" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" @@ -367,14 +368,6 @@ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -403,10 +396,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a" - integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" + integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -544,14 +537,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.7": - version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" - integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== +"@babel/plugin-transform-async-generator-functions@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz#45946cd17f915b10e65c29b8ed18a0a50fc648c8" + integrity sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -570,10 +563,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" - integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== +"@babel/plugin-transform-block-scoping@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" + integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -617,14 +610,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" - integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== +"@babel/plugin-transform-destructuring@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" + integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== @@ -810,10 +803,10 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" - integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== +"@babel/plugin-transform-optional-chaining@^7.22.10", "@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz#076d28a7e074392e840d4ae587d83445bac0372a" + integrity sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -891,13 +884,13 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" - integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.1" + regenerator-transform "^0.15.2" "@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" @@ -907,15 +900,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.16.4": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" - integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" + integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== dependencies: "@babel/helper-module-imports" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -955,19 +948,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-typescript@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" - integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" + integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.9" + "@babel/helper-create-class-features-plugin" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" - integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -996,12 +989,12 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" - integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.10.tgz#3263b9fe2c8823d191d28e61eac60a79f9ce8a0f" + integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.10" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" @@ -1026,15 +1019,15 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-generator-functions" "^7.22.10" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.10" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.5" "@babel/plugin-transform-classes" "^7.22.6" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.10" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" "@babel/plugin-transform-dynamic-import" "^7.22.5" @@ -1057,38 +1050,36 @@ "@babel/plugin-transform-object-rest-spread" "^7.22.5" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-optional-chaining" "^7.22.10" "@babel/plugin-transform-parameters" "^7.22.5" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.5" "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" "@babel/plugin-transform-reserved-words" "^7.22.5" "@babel/plugin-transform-shorthand-properties" "^7.22.5" "@babel/plugin-transform-spread" "^7.22.5" "@babel/plugin-transform-sticky-regex" "^7.22.5" "@babel/plugin-transform-template-literals" "^7.22.5" "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" "@babel/plugin-transform-unicode-property-regex" "^7.22.5" "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.10" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" core-js-compat "^3.31.0" semver "^6.3.1" -"@babel/preset-modules@^0.1.5": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" - integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" @@ -1121,11 +1112,11 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" @@ -1136,26 +1127,26 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": - version "7.22.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" - integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== +"@babel/traverse@^7.22.10", "@babel/traverse@^7.7.2": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" + integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.7" + "@babel/code-frame" "^7.22.10" + "@babel/generator" "^7.22.10" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/types" "^7.22.5" + "@babel/parser" "^7.22.10" + "@babel/types" "^7.22.10" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.5" @@ -1298,6 +1289,11 @@ enabled "2.0.x" kuler "^2.0.0" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1310,10 +1306,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" - integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1325,10 +1321,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^8.46.0": - version "8.46.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" - integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== +"@eslint/js@^8.47.0": + version "8.47.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d" + integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== "@foxxmd/winston@3.3.31": version "3.3.31" @@ -1346,6 +1342,18 @@ triple-beam "^1.3.0" winston-transport "^4.4.0" +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" @@ -1626,12 +1634,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== @@ -1649,12 +1652,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -1668,12 +1666,12 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@kenyip/backoff-strategies@^1.0.4": version "1.0.4" @@ -1719,9 +1717,9 @@ integrity sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow== "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.10" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" - integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + version "0.5.11" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" + integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" @@ -1781,9 +1779,26 @@ picomatch "^2.2.2" "@rushstack/eslint-patch@^1.1.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz#31b9c510d8cada9683549e1dbb4284cca5001faf" - integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz#16ab6c727d8c2020a5b6e4a176a243ecd88d8d69" + integrity sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -1939,17 +1954,17 @@ dependencies: defer-to-connect "^2.0.0" -"@tanstack/query-core@4.32.1": - version "4.32.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.32.1.tgz#6e364c33433b61f4dcef003725d4208e42b23860" - integrity sha512-VEAGHboOFWN/bvf/7cCoeLQfld0AA8n0V/kfc77W+FvxnnSwJufEh6gfjqpX5bRE/DEYfYDYdNtuL3KM+lIs8Q== +"@tanstack/query-core@4.32.6": + version "4.32.6" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.32.6.tgz#cf7df91ab1542e67a82624fefb12a55f580b4c01" + integrity sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA== "@tanstack/react-query@^4.32.1": - version "4.32.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.32.1.tgz#8ba6ab4e0ee4513a0fe06f4452f1b400eb4f91fb" - integrity sha512-lPTfOq6bR6DorPaS018gTMd3zs8r06tlERiVY6BRP9SnDkkl4ckqeANava/jPLWrSZP+EA15loQUTmvZs6k2GA== + version "4.32.6" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.32.6.tgz#f88c2d57f423d4cd295c501df2edeb3285a301bd" + integrity sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg== dependencies: - "@tanstack/query-core" "4.32.1" + "@tanstack/query-core" "4.32.6" use-sync-external-store "^1.2.0" "@testing-library/dom@^8.5.0": @@ -2148,9 +2163,9 @@ "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.44.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.1.tgz#d1811559bb6bcd1a76009e3f7883034b78a0415e" - integrity sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg== + version "8.44.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" + integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2291,24 +2306,24 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/node@*", "@types/node@>=10.0.0": - version "20.4.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" - integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== + version "20.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.0.tgz#7fc8636d5f1aaa3b21e6245e97d56b7f56702313" + integrity sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q== "@types/node@^12.12.54": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^16.18.39", "@types/node@^16.9.2": - version "16.18.39" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.39.tgz#aa39a1a87a40ef6098ee69689a1acb0c1b034832" - integrity sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ== +"@types/node@^16.9.2": + version "16.18.40" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.40.tgz#968d64746d20cac747a18ca982c0f1fe518c031c" + integrity sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA== "@types/node@^18.0.0": - version "18.17.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.1.tgz#84c32903bf3a09f7878c391d31ff08f6fe7d8335" - integrity sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw== + version "18.17.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.5.tgz#c58b12bca8c2a437b38c15270615627e96dd0bc5" + integrity sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2362,9 +2377,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.2.18": - version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.18.tgz#c8b233919eef1bdc294f6f34b37f9727ad677516" - integrity sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ== + version "18.2.20" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.20.tgz#1605557a83df5c8a2cc4eeb743b3dfc0eb6aaeb2" + integrity sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2724,6 +2739,21 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3111,6 +3141,13 @@ async@^3.1.0, async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3122,12 +3159,12 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.13: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -3162,6 +3199,14 @@ axios@1.3.1: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axobject-query@^3.1.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -3228,7 +3273,7 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.4.4: +babel-plugin-polyfill-corejs2@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== @@ -3237,7 +3282,7 @@ babel-plugin-polyfill-corejs2@^0.4.4: "@babel/helper-define-polyfill-provider" "^0.4.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.2: +babel-plugin-polyfill-corejs3@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== @@ -3245,7 +3290,7 @@ babel-plugin-polyfill-corejs3@^0.8.2: "@babel/helper-define-polyfill-provider" "^0.4.2" core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.5.1: +babel-plugin-polyfill-regenerator@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== @@ -3447,7 +3492,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: version "4.21.10" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== @@ -3551,10 +3596,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: - version "1.0.30001518" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz#b3ca93904cb4699c01218246c4d77a71dbe97150" - integrity sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001521" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz#e9930cf499f7c1e80334b6c1fbca52e00d889e56" + integrity sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -3566,7 +3611,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0, chalk@^2.4.1: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3611,7 +3656,7 @@ check-types@^11.1.1: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== -chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@^3.4.2, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3671,6 +3716,15 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-response@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" @@ -3747,7 +3801,7 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10: +colorette@^2.0.10, colorette@^2.0.14: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3772,6 +3826,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.20.0, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -4583,9 +4642,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.477: - version "1.4.480" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.480.tgz#40e32849ca50bc23ce29c1516c5adb3fddac919d" - integrity sha512-IXTgg+bITkQv/FLP9FjX6f9KFCs5hQWeh5uNSKxB9mqYj/JXhHDbu+ekS43LVvbkL3eW6/oZy4+r9Om6lan1Uw== + version "1.4.492" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz#83fed8beb64ec60578069e15dddd17b13a77ca56" + integrity sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ== emittery@^0.10.2: version "0.10.2" @@ -4634,7 +4693,7 @@ engine.io-parser@~5.2.1: resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== -engine.io@~6.5.0: +engine.io@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== @@ -4650,7 +4709,7 @@ engine.io@~6.5.0: engine.io-parser "~5.2.1" ws "~8.11.0" -enhanced-resolve@^5.15.0: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== @@ -4668,6 +4727,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +envinfo@^7.7.3: + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4682,7 +4746,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.21.3: version "1.22.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== @@ -4747,6 +4811,22 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" +es-iterator-helpers@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.12.tgz#272f7270f270f4d63dd8aa718228ffa901fd086e" + integrity sha512-T6Ldv67RYULYtZ1k1omngDTVQSTVNX/ZSjDiwlw0PMokhy8kq2LFElleaEjpvlSaXh9ugJ4zrBgbQ7L+Bjdm3Q== + dependencies: + asynciterator.prototype "^1.0.0" + es-abstract "^1.21.3" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + globalthis "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.0" + safe-array-concat "^1.0.0" + es-module-lexer@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" @@ -4851,13 +4931,13 @@ eslint-config-react-app@^7.0.1: eslint-plugin-testing-library "^5.0.1" eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-module-utils@^2.8.0: version "2.8.0" @@ -4933,14 +5013,15 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.27.1: - version "7.33.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz#bc27cccf860ae45413a4a4150bf0977345c1ceab" - integrity sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -4954,9 +5035,9 @@ eslint-plugin-react@^7.27.1: string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: - version "5.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz#0bad7668e216e20dd12f8c3652ca353009163121" - integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q== + version "5.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" + integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== dependencies: "@typescript-eslint/utils" "^5.58.0" @@ -4981,10 +5062,10 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" - integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -4998,14 +5079,14 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^4.0.0" eslint@^8.3.0: - version "8.46.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" - integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== + version "8.47.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806" + integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.1" - "@eslint/js" "^8.46.0" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "^8.47.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5016,7 +5097,7 @@ eslint@^8.3.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.2" + eslint-visitor-keys "^3.4.3" espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" @@ -5260,6 +5341,11 @@ fast-safe-stringify@^2.0.4, fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1 resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -5414,7 +5500,7 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -5709,9 +5795,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -6059,6 +6145,11 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -6127,6 +6218,11 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -6164,6 +6260,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -6191,10 +6294,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.12.0, is-core-module@^2.12.1, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -6215,6 +6318,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -6232,6 +6342,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6281,6 +6398,13 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -6389,6 +6513,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -6441,6 +6570,17 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.0.tgz#690c88b043d821f783843aaf725d7ac3b62e3b46" + integrity sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== + dependencies: + define-properties "^1.1.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + has-tostringtag "^1.0.0" + reflect.getprototypeof "^1.0.3" + iti@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/iti/-/iti-0.6.0.tgz#e763b4089fd8e5cbd1eb753a9d93e80ad11f3d9b" @@ -7016,6 +7156,17 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1" integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== +joi@^17.7.0: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7526,7 +7677,7 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -7609,7 +7760,7 @@ minimatch@^7.1.3: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7765,6 +7916,22 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +nodemon@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.1.tgz#affe822a2c5f21354466b2fc8ae83277d27dadc7" + integrity sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + 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" + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -7772,6 +7939,13 @@ nopt@^5.0.0: dependencies: abbrev "1" +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -8829,9 +9003,9 @@ postcss@^7.0.35: source-map "^0.6.1" postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: - version "8.4.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" - integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== + version "8.4.28" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.28.tgz#c6cc681ed00109072816e1557f889ef51cf950a5" + integrity sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8930,6 +9104,11 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -9209,6 +9388,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + recursive-readdir@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" @@ -9224,6 +9410,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz#2738fd896fcc3477ffbd4190b40c2458026b6928" + integrity sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -9236,15 +9434,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -9371,21 +9574,12 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.3, resolve@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.3: - version "1.22.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283" - integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== - dependencies: - is-core-module "^2.12.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9462,7 +9656,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.8.1: +rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -9604,7 +9798,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9690,6 +9884,13 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -9738,6 +9939,13 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -9774,15 +9982,15 @@ socket.io-parser@~4.2.4: debug "~4.3.1" socket.io@^4.6.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.1.tgz#9009f31bf7be25478895145e92fbc972ad1db900" - integrity sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw== + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" + integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== dependencies: accepts "~1.3.4" base64id "~2.0.0" cors "~2.8.5" debug "~4.3.2" - engine.io "~6.5.0" + engine.io "~6.5.2" socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" @@ -10152,9 +10360,9 @@ superagent@^6.1.0: semver "^7.3.2" superagent@^8.0.9: - version "8.0.9" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.9.tgz#2c6fda6fadb40516515f93e9098c0eb1602e0535" - integrity sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA== + version "8.1.2" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.1.2.tgz#03cb7da3ec8b32472c9d20f6c2a57c7f3765f30b" + integrity sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA== dependencies: component-emitter "^1.3.0" cookiejar "^2.1.4" @@ -10167,7 +10375,7 @@ superagent@^8.0.9: qs "^6.11.0" semver "^7.3.8" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -10419,6 +10627,13 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + tough-cookie@^4.0.0: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" @@ -10476,6 +10691,16 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-loader@^9.4.4: + version "9.4.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" + integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + ts-node@^10.7.0, ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" @@ -10681,6 +10906,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -10865,6 +11095,17 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" +wait-on@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" + integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== + dependencies: + axios "^0.27.2" + joi "^17.7.0" + lodash "^4.17.21" + minimist "^1.2.7" + rxjs "^7.8.0" + walker@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -10907,6 +11148,25 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" @@ -10962,6 +11222,19 @@ webpack-manifest-plugin@^4.0.2: tapable "^2.0.0" webpack-sources "^2.2.0" +webpack-merge@^5.7.3: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-node-externals@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" + integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== + webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -11073,6 +11346,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -11115,6 +11406,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + winston-compat@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/winston-compat/-/winston-compat-0.1.5.tgz#2eb7f578d4dc390c9c93f943ec2275015ee42148" -- 2.51.2