From 999a55c65f78d0a1a0938c354a8453f2aa39fcd0 Mon Sep 17 00:00:00 2001 From: molvqingtai Date: Mon, 30 Sep 2024 21:39:47 +0800 Subject: [PATCH] feat: support danmaku --- package.json | 20 +- pnpm-lock.yaml | 1019 +++++++++-------- src/app/content/App.tsx | 23 +- .../content/components/DanmakuContainer.tsx | 19 + src/app/content/components/DanmakuMessage.tsx | 32 + src/app/content/components/MessageInput.tsx | 5 +- src/app/content/index.tsx | 5 +- src/app/content/views/AppButton/index.tsx | 2 +- src/app/content/views/Main/index.tsx | 2 +- src/app/content/views/Setup/index.tsx | 9 +- src/app/options/components/Layout.tsx | 2 +- src/app/options/components/ProfileForm.tsx | 36 +- src/app/options/main.tsx | 4 +- .../magicui/{blur-fade.tsx => BlurFade.tsx} | 0 ...lsating-button.tsx => PulsatingButton.tsx} | 0 .../{word-pull-up.tsx => WordPullUp.tsx} | 0 src/components/ui/checkbox.tsx | 28 + src/domain/Danmaku.ts | 145 +++ src/domain/MessageList.ts | 12 +- src/domain/Room.ts | 111 +- src/domain/UserInfo.ts | 15 +- src/domain/externs/Danmaku.ts | 30 + src/domain/externs/PeerRoom.ts | 7 +- src/domain/externs/Storage.ts | 11 +- src/domain/impls/Danmaku.ts | 80 ++ src/domain/impls/PeerRoom.ts | 15 +- src/domain/impls/PeerRoom2.ts | 11 +- src/domain/impls/Storage.ts | 26 +- src/domain/modules/StorageEffect.ts | 37 +- src/utils/webExtensionDriver.ts | 3 +- wxt.config.ts | 2 +- 31 files changed, 1116 insertions(+), 595 deletions(-) create mode 100644 src/app/content/components/DanmakuContainer.tsx create mode 100644 src/app/content/components/DanmakuMessage.tsx rename src/components/magicui/{blur-fade.tsx => BlurFade.tsx} (100%) rename src/components/magicui/{pulsating-button.tsx => PulsatingButton.tsx} (100%) rename src/components/magicui/{word-pull-up.tsx => WordPullUp.tsx} (100%) create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/domain/Danmaku.ts create mode 100644 src/domain/externs/Danmaku.ts create mode 100644 src/domain/impls/Danmaku.ts diff --git a/package.json b/package.json index bf0cb36..1086dda 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@lottiefiles/dotlottie-react": "^0.9.0", "@perfsee/jsonr": "^1.13.0", "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-hover-card": "^1.1.1", "@radix-ui/react-icons": "^1.3.0", @@ -64,8 +65,9 @@ "@webext-core/proxy-service": "^1.2.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "danmaku": "^2.0.7", "date-fns": "^4.1.0", - "framer-motion": "^11.7.0", + "framer-motion": "^11.9.0", "idb-keyval": "^6.2.1", "lucide-react": "^0.446.0", "nanoid": "^5.0.7", @@ -86,14 +88,13 @@ "tailwind-merge": "^2.5.2", "trystero": "^0.20.0", "type-fest": "^4.26.1", - "unstorage": "^1.12.0", - "valibot": "^0.42.1", - "webextension-polyfill": "^0.12.0" + "unstorage": "1.11.0", + "valibot": "^0.42.1" }, "devDependencies": { "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", - "@eslint-react/eslint-plugin": "^1.14.2", + "@eslint-react/eslint-plugin": "^1.14.3", "@eslint/js": "^9.11.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", @@ -101,12 +102,11 @@ "@types/eslint": "^9.6.1", "@types/eslint-plugin-tailwindcss": "^3.17.0", "@types/eslint__js": "^8.42.3", - "@types/node": "^22.7.2", - "@types/react": "^18.3.9", + "@types/node": "^22.7.4", + "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", - "@types/webextension-polyfill": "^0.12.1", "@typescript-eslint/parser": "^8.7.0", - "@vitejs/plugin-react": "^4.3.1", + "@vitejs/plugin-react": "^4.3.2", "autoprefixer": "^10.4.20", "cross-env": "^7.0.3", "eslint": "^9.11.1", @@ -122,7 +122,7 @@ "postcss-rem-to-responsive-pixel": "^6.0.2", "prettier": "^3.3.3", "rimraf": "^5.0.10", - "semantic-release": "^24.1.1", + "semantic-release": "^24.1.2", "tailwindcss": "^3.4.13", "tailwindcss-animate": "^1.0.7", "typescript": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eff4fe5..d25c66a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,34 +19,37 @@ importers: version: 1.13.0 '@radix-ui/react-avatar': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@radix-ui/react-label': specifier: ^2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-radio-group': specifier: ^1.2.0 - version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-scroll-area': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.1.0 - version: 1.1.0(@types/react@18.3.9)(react@18.3.1) + version: 1.1.0(@types/react@18.3.10)(react@18.3.1) '@radix-ui/react-switch': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@resreq/event-hub': specifier: ^1.6.0 version: 1.6.0 @@ -68,12 +71,15 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + danmaku: + specifier: ^2.0.7 + version: 2.0.7 date-fns: specifier: ^4.1.0 version: 4.1.0 framer-motion: - specifier: ^11.7.0 - version: 11.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^11.9.0 + version: 11.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) idb-keyval: specifier: ^6.2.1 version: 6.2.1 @@ -97,7 +103,7 @@ importers: version: 7.53.0(react@18.3.1) react-markdown: specifier: ^9.0.1 - version: 9.0.1(@types/react@18.3.9)(react@18.3.1) + version: 9.0.1(@types/react@18.3.10)(react@18.3.1) react-use: specifier: ^17.5.1 version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -135,36 +141,33 @@ importers: specifier: ^4.26.1 version: 4.26.1 unstorage: - specifier: ^1.12.0 - version: 1.12.0(idb-keyval@6.2.1) + specifier: 1.11.0 + version: 1.11.0(@planetscale/database@1.19.0)(idb-keyval@6.2.1)(ioredis@5.4.1) valibot: specifier: ^0.42.1 version: 0.42.1(typescript@5.6.2) - webextension-polyfill: - specifier: ^0.12.0 - version: 0.12.0 devDependencies: '@commitlint/cli': specifier: ^19.5.0 - version: 19.5.0(@types/node@22.7.3)(typescript@5.6.2) + version: 19.5.0(@types/node@22.7.4)(typescript@5.6.2) '@commitlint/config-conventional': specifier: ^19.5.0 version: 19.5.0 '@eslint-react/eslint-plugin': - specifier: ^1.14.2 - version: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + specifier: ^1.14.3 + version: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@eslint/js': specifier: ^9.11.1 version: 9.11.1 '@semantic-release/changelog': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.1.1(typescript@5.6.2)) + version: 6.0.3(semantic-release@24.1.2(typescript@5.6.2)) '@semantic-release/exec': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.1.1(typescript@5.6.2)) + version: 6.0.3(semantic-release@24.1.2(typescript@5.6.2)) '@semantic-release/git': specifier: ^10.0.1 - version: 10.0.1(semantic-release@24.1.1(typescript@5.6.2)) + version: 10.0.1(semantic-release@24.1.2(typescript@5.6.2)) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -175,23 +178,20 @@ importers: specifier: ^8.42.3 version: 8.42.3 '@types/node': - specifier: ^22.7.2 - version: 22.7.3 + specifier: ^22.7.4 + version: 22.7.4 '@types/react': - specifier: ^18.3.9 - version: 18.3.9 + specifier: ^18.3.10 + version: 18.3.10 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 - '@types/webextension-polyfill': - specifier: ^0.12.1 - version: 0.12.1 '@typescript-eslint/parser': specifier: ^8.7.0 version: 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.4.5(@types/node@22.7.3)) + specifier: ^4.3.2 + version: 4.3.2(vite@5.4.5(@types/node@22.7.4)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) @@ -238,8 +238,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 semantic-release: - specifier: ^24.1.1 - version: 24.1.1(typescript@5.6.2) + specifier: ^24.1.2 + version: 24.1.2(typescript@5.6.2) tailwindcss: specifier: ^3.4.13 version: 3.4.13 @@ -254,13 +254,13 @@ importers: version: 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) vite-plugin-svgr: specifier: ^4.2.0 - version: 4.2.0(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.5(@types/node@22.7.3)) + version: 4.2.0(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.5(@types/node@22.7.4)) webext-bridge: specifier: ^6.0.1 version: 6.0.1 wxt: specifier: ^0.19.10 - version: 0.19.10(@types/node@22.7.3)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4) + version: 0.19.10(@types/node@22.7.4)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4) packages: @@ -771,14 +771,14 @@ packages: resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.14.2': - resolution: {integrity: sha512-waFjfqN9estBOSPHB2QzLm0s+10rEK86qzww/BkSLAORZLSftxQ1YrAL7vECBw+7G8RI1ehEh6s5ZFkBedUirA==} + '@eslint-react/ast@1.14.3': + resolution: {integrity: sha512-JU0619vNfl0RaqbsyyEfLJWKupJOmf5JmHt4sCAD6Y1LCW80Pi0ZbBXeCUTdCR36mA8IJxm9PoLFliQyDYj6uw==} - '@eslint-react/core@1.14.2': - resolution: {integrity: sha512-DpyKNgYB+bYrBEhvlTzqcifzNuYH9GF0y4lyIeWD8Pr72M5zjMD8NgpzT6h+2Vx0TVcW12Ej8Kd86BsEqhmZPQ==} + '@eslint-react/core@1.14.3': + resolution: {integrity: sha512-1T/Zubn9PSwJHNN+4SnXXPb6ZjL1ILl9hN2pkPClh8IyBoCTM+u/BHTfxI3aVF5I8yWLNDaiG7nkaxmxoBEOfQ==} - '@eslint-react/eslint-plugin@1.14.2': - resolution: {integrity: sha512-q8bIJYfMr4YBfLlqG+cIStp+8/J1trgSqkbZQy6C6+DVP/AtWB+Gqq3a5qshpbJ0WVbtbZ4Yed61hxhZCnxsZA==} + '@eslint-react/eslint-plugin@1.14.3': + resolution: {integrity: sha512-U06zO3F56RAYXI0ZKTEpdwyWllV+muvi2gdC1SLARwk4AOmLAV8ke+iHW5EXBfNkCJQ3SgKRan4tpQqqwfEsMA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -787,20 +787,20 @@ packages: typescript: optional: true - '@eslint-react/jsx@1.14.2': - resolution: {integrity: sha512-Uu2URP5q935fK2NK59BZqjIwrRkD3zarCqmlZfig0Hy2vrllf8mileKkC7kAoIFhc8A6ilGLwaRdMWvEAVbR2A==} + '@eslint-react/jsx@1.14.3': + resolution: {integrity: sha512-LJqS63/S8koDJNIqKZ/yLuFvVk4RiK7K3emjUFx+UXHrIdKwFDMpFkksVVbxqeMX70E+toMXgMepABE0pA54ag==} - '@eslint-react/shared@1.14.2': - resolution: {integrity: sha512-VTN5QflFLgFHWKgnWwt/8sMedeT+7mn4/yrQ6ZrHhia95hDAW9fprMJtNR3AkJ30vnc/1x9I0KUisEvT1u3Cgw==} + '@eslint-react/shared@1.14.3': + resolution: {integrity: sha512-GP+mjNZBGXq2CuwyVTE2+74K3tBixxNeaG3ho3ovpQ7e8NlTD3TOZk5vZyOJaeRqaOJoJa54PURe12Qt6loCdw==} - '@eslint-react/tools@1.14.2': - resolution: {integrity: sha512-AgtqWGZEywBfECIbmrtqLeJdPRQkCsfgUzmKxEjHTgMV4nqt5nKirYVnAUxS5/HSs/OqNUM6l+awFFCnCEuLjQ==} + '@eslint-react/tools@1.14.3': + resolution: {integrity: sha512-NtewO4fWxzGtVCjAhD6NG4FwLev5Xq87KWpW92brPF+AvTzkr04abt3/14CpojJlW9L9SMK6FsX9tFVP7ZBqJQ==} - '@eslint-react/types@1.14.2': - resolution: {integrity: sha512-YPfdPYUHTXw+5KT+WgLJrRQAJcTyQ2rzUDAUq7Cl2x71J88USXzja8D7KNDFA9S+eeF5eaUVc9LJo3Uz7eq4Dw==} + '@eslint-react/types@1.14.3': + resolution: {integrity: sha512-Hi3rBCX0pAxoQs3MQYX/rt4Fxdz97U0pTjSQsm03dGUBb/BEVgrVK9SEZkCqpfPZ7NXrVhuiYudoJRUylNZyCw==} - '@eslint-react/var@1.14.2': - resolution: {integrity: sha512-OOxwTPcWoNJbpaWnULpq+QJzsdZveU/QCHZ6Lb1oNIdVPBc6nCKz3PH97hqYFpk3q+gnnNx2q6qhNIAfeu/8Ug==} + '@eslint-react/var@1.14.3': + resolution: {integrity: sha512-APJJVSyrDrvJn3t4qXBg1XpWMxmW5AEym56a9/ILzLtgOWFsDj6gJCy4o2g5UB2AZqtfS6YS5IfU5B1G/wYtiw==} '@eslint/config-array@0.18.0': resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} @@ -1061,6 +1061,9 @@ packages: resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1337,6 +1340,10 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@planetscale/database@1.19.0': + resolution: {integrity: sha512-Tv4jcFUFAFjOWrGSio49H6R2ijALv0ZzVBfJKIdm+kl9X046Fh4LLawrF9OMsglVbK6ukqMJsUCeucGAFTBcMA==} + engines: {node: '>=16'} + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -1411,6 +1418,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-checkbox@1.1.1': + resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collection@1.1.0': resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} peerDependencies: @@ -1880,11 +1900,11 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/github@10.3.5': - resolution: {integrity: sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==} + '@semantic-release/github@11.0.0': + resolution: {integrity: sha512-Uon6G6gJD8U1JNvPm7X0j46yxNRJ8Ui6SgK4Zw5Ktu8RgjEft3BGn+l/RX1TTzhhO3/uUcKuqM+/9/ETFxWS/Q==} engines: {node: '>=20.8.1'} peerDependencies: - semantic-release: '>=20.1.0' + semantic-release: '>=24.1.0' '@semantic-release/npm@12.0.1': resolution: {integrity: sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==} @@ -2098,8 +2118,8 @@ packages: '@types/murmurhash3js-revisited@3.0.3': resolution: {integrity: sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==} - '@types/node@22.7.3': - resolution: {integrity: sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA==} + '@types/node@22.7.4': + resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2113,8 +2133,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.9': - resolution: {integrity: sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ==} + '@types/react@18.3.10': + resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} '@types/readable-stream@4.0.15': resolution: {integrity: sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==} @@ -2131,9 +2151,6 @@ packages: '@types/webextension-polyfill@0.10.7': resolution: {integrity: sha512-10ql7A0qzBmFB+F+qAke/nP1PIonS0TXZAOMVOxEUsm+lGSW6uwVcISFNa0I4Oyj0884TZVWGGMIWeXOVSNFHw==} - '@types/webextension-polyfill@0.12.1': - resolution: {integrity: sha512-xPTFWwQ8BxPevPF2IKsf4hpZNss4LxaOLZXypQH4E63BDLmcwX/RMGdI4tB4VO4Nb6xDBH3F/p4gz4wvof1o9w==} - '@types/webextension-polyfill@0.8.3': resolution: {integrity: sha512-GN+Hjzy9mXjWoXKmaicTegv3FJ0WFZ3aYz77Wk8TMp1IY3vEzvzj1vnsa0ggV7vMI1i+PUxe4qqnIJKCzf9aTg==} @@ -2203,8 +2220,8 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react@4.3.1': - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + '@vitejs/plugin-react@4.3.2': + resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 @@ -2738,6 +2755,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2927,6 +2948,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + danmaku@2.0.7: + resolution: {integrity: sha512-etJEa9tdfW6cp5pn5qLCr1oE9v+uSE7bZxeQUMFKjHNV0Z7JCIVO126NZ5KyKgeOZx3jXAXLkS4UH/CgIx4BPQ==} + dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} @@ -3033,6 +3057,10 @@ packages: resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} engines: {node: '>=16'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -3238,8 +3266,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-debug@1.14.2: - resolution: {integrity: sha512-5DlSAx4dHhqbGpPMOyEu7lhdWExwxI1e/3MeKSJBfigQamdA0dIZi/K0ZkeVqbSS8ItU+G/Ba1ek6vYCtadNvA==} + eslint-plugin-react-debug@1.14.3: + resolution: {integrity: sha512-qEsGT5LGFtYR1Hs9nqfrCqgE8MxrTe5VA7LO7Old8epgHgpgOGIuSIdIKYu7dxlEFGAXFB3JLW7ieYJYcgobbQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3248,8 +3276,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.14.2: - resolution: {integrity: sha512-qG1WqsOHj4BdoOBPt3gwtEbeTc43EKKqDzxcB4gRbT6euBxU0EluEMtcFO/bAy9950iehD7rRSvuLs7voE+bNg==} + eslint-plugin-react-dom@1.14.3: + resolution: {integrity: sha512-tVA7RQI6Jxomeqrckqi/y1gEmcdI29b268p7K8WjRUWNUDXbZR6vEyaLBqzI8+ykO1HsK8+QhOKUHgUKHjOZBQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3258,8 +3286,8 @@ packages: typescript: optional: true - eslint-plugin-react-hooks-extra@1.14.2: - resolution: {integrity: sha512-SMDEluUIFQMPksKtmHVT2etaKqGIN7Rvcp9R/MB1bFcO1sh5ON2dDHXcZUTomZHriTEn/fm6pANe44jk20l4jQ==} + eslint-plugin-react-hooks-extra@1.14.3: + resolution: {integrity: sha512-G6mFfYiKgKbGJOUlmvcsN+n0hNiRGa9pNenv4hSlbm3TJFmlrLG+cHvOa9xe88AvaLJHfF5obgF8X/zhSekIfA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3268,8 +3296,8 @@ packages: typescript: optional: true - eslint-plugin-react-naming-convention@1.14.2: - resolution: {integrity: sha512-LWJm5kF7hWL7OcJnn+dTmC/l75RV4n7gH5QRH4kjcsVRs/Ky/kTcmBQTlC+CsaMUsy9jro6VBzj7Rk9/IO5vcQ==} + eslint-plugin-react-naming-convention@1.14.3: + resolution: {integrity: sha512-qj7XpwYQAKNCTloWA9vPNYDRMsiLa5H/jlF3mH17Is+j/pLH97NRG9CQXbh6kEdLbBFSsHwTDvyP22+CPVZhiA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3278,8 +3306,8 @@ packages: typescript: optional: true - eslint-plugin-react-web-api@1.14.2: - resolution: {integrity: sha512-Qq2AJmGsNaabYaWtZweLSTfVGoyPPrz+A7L+h4ecq0TzvnlfSPWFyfQF4biBsZt+V4RrkBpQ4cB9Cqn7TEsEMQ==} + eslint-plugin-react-web-api@1.14.3: + resolution: {integrity: sha512-1G/WIUe+ZIPW8px1lmn7ib5fy6LcuwoHDsnq9G92iE8MFXYPA0Pry0ZKaB2lAsjP8rUROv1L9B457QjyCpro2g==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3288,8 +3316,8 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.14.2: - resolution: {integrity: sha512-iiizpXxc//MoOwOqk6J55BMuywrDhZW2wvdM1XK1H8D5OEekyEzZQLPtOaVT0WyO+6tCdvmegKaX/J+4mVcuAg==} + eslint-plugin-react-x@1.14.3: + resolution: {integrity: sha512-VKyF4v1kWp9P6vI7JDJfonmny0HOQiS5v/rMLyldK9UC8k+efJN7dUtLE2Kt7TfxggE5gf+v4rsDB2Opvt5Tvg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3515,8 +3543,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@11.8.0: - resolution: {integrity: sha512-q/axN/PFRdKmzPK6PO2OhbLUMWXXZuiejdM1/3FhC2hm4YIetc+qeco2EvWm4u1/UTFmevclE492wGFNfSZ4eQ==} + framer-motion@11.9.0: + resolution: {integrity: sha512-nCfGxvsQecVLjjYDu35G2F5ls+ArE3FBfhxV0RSiisMaUKqteq5DMBFNRKwMyVj+VqKTNhawt+BV480YCHKFlQ==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 @@ -3939,6 +3967,10 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -4379,8 +4411,8 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} + listhen@1.8.0: + resolution: {integrity: sha512-Wj5hk++HPDqnG/0nc9++oXf8M3GlzObC6AJJJ9VYAVhVTdeW+t3HyeiKhK6Ro0GPhVd8lOYM75zsckrtzLB2Gw==} hasBin: true listr2@8.2.4: @@ -4419,9 +4451,15 @@ packages: lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} @@ -5580,6 +5618,14 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -5743,8 +5789,8 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - semantic-release@24.1.1: - resolution: {integrity: sha512-4Ax2GxD411jUe9IdhOjMLuN+6wAj+aKjvOGngByrpD/iKL+UKN/2puQglhyI4gxNyy9XzEBMzBwbqpnEwbXGEg==} + semantic-release@24.1.2: + resolution: {integrity: sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==} engines: {node: '>=20.8.1'} hasBin: true @@ -5947,6 +5993,9 @@ packages: stacktrace-js@2.0.2: resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -6217,8 +6266,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-pattern@5.3.1: - resolution: {integrity: sha512-1RUMKa8jYQdNfmnK4jyzBK3/PS/tnjcZ1CW0v1vWDeYe5RBklc/nquw03MEoB66hVBm4BnlCfmOqDVxHyT1DpA==} + ts-pattern@5.4.0: + resolution: {integrity: sha512-hgfOMfjlrARCnYtGD/xEAkFHDXuSyuqjzFSltyQCbN689uNvoQL20TVN2XFcLMjfNuwSsQGU+xtH6MrjIwhwUg==} tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} @@ -6382,19 +6431,19 @@ packages: webpack-sources: optional: true - unstorage@1.12.0: - resolution: {integrity: sha512-ARZYTXiC+e8z3lRM7/qY9oyaOkaozCeNd2xoz7sYK9fv7OLGhVsf+BZbmASqiK/HTZ7T6eAlnVq9JynZppyk3w==} + unstorage@1.11.0: + resolution: {integrity: sha512-d7ggFP/5h0AUIMbeQit8M3VuyIBFVMk2Ew5NOaCrKEsNzJRHym+0EhGD074ItIPuAEq8Q1EX3+NrizlJH700+g==} peerDependencies: - '@azure/app-configuration': ^1.7.0 - '@azure/cosmos': ^4.1.1 + '@azure/app-configuration': ^1.6.0 + '@azure/cosmos': ^4.0.0 '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.4.1 + '@azure/identity': ^4.2.0 '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.24.0 - '@capacitor/preferences': ^6.0.2 + '@azure/storage-blob': ^12.18.0 + '@capacitor/preferences': ^6.0.0 '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.0 + '@planetscale/database': ^1.18.0 + '@upstash/redis': ^1.31.3 '@vercel/kv': ^1.0.1 idb-keyval: ^6.2.1 ioredis: ^5.4.1 @@ -6966,11 +7015,11 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@19.5.0(@types/node@22.7.3)(typescript@5.6.2)': + '@commitlint/cli@19.5.0(@types/node@22.7.4)(typescript@5.6.2)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@22.7.3)(typescript@5.6.2) + '@commitlint/load': 19.5.0(@types/node@22.7.4)(typescript@5.6.2) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.0 @@ -7017,7 +7066,7 @@ snapshots: '@commitlint/rules': 19.5.0 '@commitlint/types': 19.5.0 - '@commitlint/load@19.5.0(@types/node@22.7.3)(typescript@5.6.2)': + '@commitlint/load@19.5.0(@types/node@22.7.4)(typescript@5.6.2)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -7025,7 +7074,7 @@ snapshots: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.6.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.3)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.4)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7240,80 +7289,80 @@ snapshots: '@eslint-community/regexpp@4.11.1': {} - '@eslint-react/ast@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/ast@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) birecord: 0.1.1 string-ts: 2.2.0 - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/core@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) birecord: 0.1.1 short-unique-id: 5.2.0 - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/eslint-plugin@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/eslint-plugin@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) - eslint-plugin-react-debug: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - eslint-plugin-react-dom: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - eslint-plugin-react-hooks-extra: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - eslint-plugin-react-naming-convention: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - eslint-plugin-react-web-api: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - eslint-plugin-react-x: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-debug: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-dom: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-hooks-extra: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-naming-convention: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-web-api: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + eslint-plugin-react-x: 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/jsx@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/shared@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/tools': 1.14.2 + '@eslint-react/tools': 1.14.3 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) picomatch: 4.0.2 transitivePeerDependencies: @@ -7321,11 +7370,11 @@ snapshots: - supports-color - typescript - '@eslint-react/tools@1.14.2': {} + '@eslint-react/tools@1.14.3': {} - '@eslint-react/types@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/types@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/tools': 1.14.2 + '@eslint-react/tools': 1.14.3 '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) transitivePeerDependencies: @@ -7333,15 +7382,15 @@ snapshots: - supports-color - typescript - '@eslint-react/var@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': + '@eslint-react/var@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 transitivePeerDependencies: - eslint - supports-color @@ -7723,7 +7772,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.13 - '@types/node': 22.7.3 + '@types/node': 22.7.4 '@grpc/proto-loader@0.7.13': dependencies: @@ -7740,6 +7789,9 @@ snapshots: '@humanwhocodes/retry@0.3.0': {} + '@ioredis/commands@1.2.0': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -8158,6 +8210,9 @@ snapshots: '@pkgr/core@0.1.1': {} + '@planetscale/database@1.19.0': + optional: true + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -8197,354 +8252,370 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.9)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.9 - - '@radix-ui/react-context@1.1.0(@types/react@18.3.9)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.9 - - '@radix-ui/react-direction@1.1.0(@types/react@18.3.9)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.9 - - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.9)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.9 - - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.9 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-hover-card@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 '@radix-ui/react-icons@1.3.0(react@18.3.1)': dependencies: react: 18.3.1 - '@radix-ui/react-id@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.9)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.9)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.9)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.9)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.9)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 '@radix-ui/rect@1.1.0': {} @@ -8627,15 +8698,15 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/changelog@6.0.3(semantic-release@24.1.2(typescript@5.6.2))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.2.0 lodash: 4.17.21 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) - '@semantic-release/commit-analyzer@13.0.0(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/commit-analyzer@13.0.0(semantic-release@24.1.2(typescript@5.6.2))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -8645,7 +8716,7 @@ snapshots: import-from-esm: 1.3.4 lodash-es: 4.17.21 micromatch: 4.0.8 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) transitivePeerDependencies: - supports-color @@ -8653,7 +8724,7 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/exec@6.0.3(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/exec@6.0.3(semantic-release@24.1.2(typescript@5.6.2))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 @@ -8661,11 +8732,11 @@ snapshots: execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) transitivePeerDependencies: - supports-color - '@semantic-release/git@10.0.1(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/git@10.0.1(semantic-release@24.1.2(typescript@5.6.2))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 @@ -8675,11 +8746,11 @@ snapshots: lodash: 4.17.21 micromatch: 4.0.8 p-reduce: 2.1.0 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) transitivePeerDependencies: - supports-color - '@semantic-release/github@10.3.5(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/github@11.0.0(semantic-release@24.1.2(typescript@5.6.2))': dependencies: '@octokit/core': 6.1.2 '@octokit/plugin-paginate-rest': 11.3.3(@octokit/core@6.1.2) @@ -8696,12 +8767,12 @@ snapshots: lodash-es: 4.17.21 mime: 4.0.4 p-filter: 4.1.0 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) url-join: 5.0.0 transitivePeerDependencies: - supports-color - '@semantic-release/npm@12.0.1(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/npm@12.0.1(semantic-release@24.1.2(typescript@5.6.2))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 @@ -8714,11 +8785,11 @@ snapshots: rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.0.2 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) semver: 7.6.3 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.1(semantic-release@24.1.1(typescript@5.6.2))': + '@semantic-release/release-notes-generator@14.0.1(semantic-release@24.1.2(typescript@5.6.2))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -8730,7 +8801,7 @@ snapshots: into-stream: 7.0.0 lodash-es: 4.17.21 read-package-up: 11.0.0 - semantic-release: 24.1.1(typescript@5.6.2) + semantic-release: 24.1.2(typescript@5.6.2) transitivePeerDependencies: - supports-color @@ -8908,7 +8979,7 @@ snapshots: '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 '@types/debug@4.1.12': dependencies: @@ -8916,7 +8987,7 @@ snapshots: '@types/dns-packet@5.6.5': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 '@types/eslint-plugin-tailwindcss@3.17.0': dependencies: @@ -8967,7 +9038,7 @@ snapshots: '@types/murmurhash3js-revisited@3.0.3': {} - '@types/node@22.7.3': + '@types/node@22.7.4': dependencies: undici-types: 6.19.8 @@ -8979,16 +9050,16 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - '@types/react@18.3.9': + '@types/react@18.3.10': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/readable-stream@4.0.15': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 safe-buffer: 5.1.2 '@types/semver@7.5.8': {} @@ -8999,17 +9070,15 @@ snapshots: '@types/webextension-polyfill@0.10.7': {} - '@types/webextension-polyfill@0.12.1': {} - '@types/webextension-polyfill@0.8.3': {} '@types/ws@8.5.12': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 optional: true '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)': @@ -9095,14 +9164,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@22.7.3))': + '@vitejs/plugin-react@4.3.2(vite@5.4.5(@types/node@22.7.4))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.5(@types/node@22.7.3) + vite: 5.4.5(@types/node@22.7.4) transitivePeerDependencies: - supports-color @@ -9625,7 +9694,7 @@ snapshots: chrome-launcher@1.1.0: dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.1 @@ -9706,6 +9775,9 @@ snapshots: clsx@2.1.1: {} + cluster-key-slot@1.1.2: + optional: true + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -9817,9 +9889,9 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.3)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): + cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.4)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 cosmiconfig: 9.0.0(typescript@5.6.2) jiti: 1.21.6 typescript: 5.6.2 @@ -9891,6 +9963,8 @@ snapshots: csstype@3.1.3: {} + danmaku@2.0.7: {} + dargs@8.1.0: {} data-view-buffer@1.0.1: @@ -9999,6 +10073,9 @@ snapshots: delay@6.0.0: {} + denque@2.1.0: + optional: true + dequal@2.0.3: {} destr@2.0.3: {} @@ -10276,121 +10353,121 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 9.1.0(eslint@9.11.1(jiti@2.0.0)) - eslint-plugin-react-debug@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-debug@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) string-ts: 2.2.0 - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-dom@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-hooks-extra@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-naming-convention@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-web-api@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) birecord: 0.1.1 eslint: 9.11.1(jiti@2.0.0) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): + eslint-plugin-react-x@1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/tools': 1.14.2 - '@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - '@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/ast': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/core': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/shared': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/tools': 1.14.3 + '@eslint-react/types': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) + '@eslint-react/var': 1.14.3(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.7.0 '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) '@typescript-eslint/types': 8.7.0 '@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) eslint: 9.11.1(jiti@2.0.0) is-immutable-type: 5.0.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2) - ts-pattern: 5.3.1 + ts-pattern: 5.4.0 optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -10701,7 +10778,7 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@11.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.7.0 optionalDependencies: @@ -11138,6 +11215,21 @@ snapshots: dependencies: loose-envify: 1.4.0 + ioredis@5.4.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.7 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + optional: true + iron-webcrypto@1.2.1: {} is-absolute@0.1.7: @@ -11579,7 +11671,7 @@ snapshots: transitivePeerDependencies: - supports-color - listhen@1.7.2: + listhen@1.8.0: dependencies: '@parcel/watcher': 2.4.1 '@parcel/watcher-wasm': 2.4.1 @@ -11591,7 +11683,7 @@ snapshots: get-port-please: 3.1.2 h3: 1.12.0 http-shutdown: 1.2.2 - jiti: 1.21.6 + jiti: 2.0.0 mlly: 1.7.1 node-forge: 1.3.1 pathe: 1.1.2 @@ -11644,8 +11736,14 @@ snapshots: lodash.castarray@4.4.0: {} + lodash.defaults@4.2.0: + optional: true + lodash.escaperegexp@4.1.2: {} + lodash.isarguments@3.1.0: + optional: true + lodash.isplainobject@4.0.6: {} lodash.isstring@4.0.1: {} @@ -12776,7 +12874,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.7.3 + '@types/node': 22.7.4 long: 5.2.3 protons-runtime@5.5.0: @@ -12858,10 +12956,10 @@ snapshots: dependencies: react: 18.3.1 - react-markdown@9.0.1(@types/react@18.3.9)(react@18.3.1): + react-markdown@9.0.1(@types/react@18.3.10)(react@18.3.1): dependencies: '@types/hast': 3.0.4 - '@types/react': 18.3.9 + '@types/react': 18.3.10 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 @@ -12877,33 +12975,33 @@ snapshots: react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.6(@types/react@18.3.9)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.9)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - react-remove-scroll@2.5.7(@types/react@18.3.9)(react@18.3.1): + react-remove-scroll@2.5.7(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.9)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.9)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.10)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.9)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.9)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.10)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - react-style-singleton@2.2.1(@types/react@18.3.9)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.10)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 react-universal-interface@0.6.2(react@18.3.1)(tslib@2.7.0): dependencies: @@ -12990,6 +13088,14 @@ snapshots: dependencies: picomatch: 2.3.1 + redis-errors@1.2.0: + optional: true + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + optional: true + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: @@ -13191,13 +13297,13 @@ snapshots: scule@1.3.0: {} - semantic-release@24.1.1(typescript@5.6.2): + semantic-release@24.1.2(typescript@5.6.2): dependencies: - '@semantic-release/commit-analyzer': 13.0.0(semantic-release@24.1.1(typescript@5.6.2)) + '@semantic-release/commit-analyzer': 13.0.0(semantic-release@24.1.2(typescript@5.6.2)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 10.3.5(semantic-release@24.1.1(typescript@5.6.2)) - '@semantic-release/npm': 12.0.1(semantic-release@24.1.1(typescript@5.6.2)) - '@semantic-release/release-notes-generator': 14.0.1(semantic-release@24.1.1(typescript@5.6.2)) + '@semantic-release/github': 11.0.0(semantic-release@24.1.2(typescript@5.6.2)) + '@semantic-release/npm': 12.0.1(semantic-release@24.1.2(typescript@5.6.2)) + '@semantic-release/release-notes-generator': 14.0.1(semantic-release@24.1.2(typescript@5.6.2)) aggregate-error: 5.0.0 cosmiconfig: 9.0.0(typescript@5.6.2) debug: 4.3.7 @@ -13427,6 +13533,9 @@ snapshots: stack-generator: 2.0.10 stacktrace-gps: 3.1.2 + standard-as-callback@2.1.0: + optional: true + std-env@3.7.0: {} stdin-discarder@0.1.0: @@ -13741,7 +13850,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-pattern@5.3.1: {} + ts-pattern@5.4.0: {} tslib@2.7.0: {} @@ -13932,20 +14041,22 @@ snapshots: acorn: 8.12.1 webpack-virtual-modules: 0.6.2 - unstorage@1.12.0(idb-keyval@6.2.1): + unstorage@1.11.0(@planetscale/database@1.19.0)(idb-keyval@6.2.1)(ioredis@5.4.1): dependencies: anymatch: 3.1.3 chokidar: 3.6.0 destr: 2.0.3 h3: 1.12.0 - listhen: 1.7.2 + listhen: 1.8.0 lru-cache: 10.4.3 mri: 1.2.0 node-fetch-native: 1.6.4 ofetch: 1.3.4 ufo: 1.5.4 optionalDependencies: + '@planetscale/database': 1.19.0 idb-keyval: 6.2.1 + ioredis: 5.4.1 transitivePeerDependencies: - uWebSockets.js @@ -13988,20 +14099,20 @@ snapshots: url-join@5.0.0: {} - use-callback-ref@1.3.2(@types/react@18.3.9)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 - use-sidecar@1.1.2(@types/react@18.3.9)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.10)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.9 + '@types/react': 18.3.10 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -14044,12 +14155,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.1(@types/node@22.7.3): + vite-node@2.1.1(@types/node@22.7.4): dependencies: cac: 6.7.14 debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.5(@types/node@22.7.3) + vite: 5.4.5(@types/node@22.7.4) transitivePeerDependencies: - '@types/node' - less @@ -14061,24 +14172,24 @@ snapshots: - supports-color - terser - vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.5(@types/node@22.7.3)): + vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.5(@types/node@22.7.4)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@svgr/core': 8.1.0(typescript@5.6.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.2)) - vite: 5.4.5(@types/node@22.7.3) + vite: 5.4.5(@types/node@22.7.4) transitivePeerDependencies: - rollup - supports-color - typescript - vite@5.4.5(@types/node@22.7.3): + vite@5.4.5(@types/node@22.7.4): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.21.3 optionalDependencies: - '@types/node': 22.7.3 + '@types/node': 22.7.4 fsevents: 2.3.3 watchpack@2.4.1: @@ -14263,7 +14374,7 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 6.0.4 - wxt@0.19.10(@types/node@22.7.3)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4): + wxt@0.19.10(@types/node@22.7.4)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4): dependencies: '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.21.3) '@types/chrome': 0.0.269 @@ -14307,8 +14418,8 @@ snapshots: publish-browser-extension: 2.2.1 scule: 1.3.0 unimport: 3.12.0(rollup@4.21.3) - vite: 5.4.5(@types/node@22.7.3) - vite-node: 2.1.1(@types/node@22.7.3) + vite: 5.4.5(@types/node@22.7.4) + vite-node: 2.1.1(@types/node@22.7.4) web-ext-run: 0.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) webextension-polyfill: 0.12.0 transitivePeerDependencies: diff --git a/src/app/content/App.tsx b/src/app/content/App.tsx index 30e22b4..4b00b1c 100644 --- a/src/app/content/App.tsx +++ b/src/app/content/App.tsx @@ -8,9 +8,9 @@ import RoomDomain from '@/domain/Room' import UserInfoDomain from '@/domain/UserInfo' import Setup from '@/app/content/views/Setup' import MessageListDomain from '@/domain/MessageList' -import { useEffect, useState } from 'react' +import { useEffect, useRef, useState } from 'react' import { Toaster } from 'sonner' -import { indexDBStorage } from '@/domain/impls/Storage' +import { browserSyncStorage, indexDBStorage } from '@/domain/impls/Storage' import { APP_OPEN_STATUS_STORAGE_KEY } from '@/constants/config' import LogoIcon0 from '@/assets/images/logo-0.svg' import LogoIcon1 from '@/assets/images/logo-1.svg' @@ -21,16 +21,21 @@ import LogoIcon5 from '@/assets/images/logo-5.svg' import LogoIcon6 from '@/assets/images/logo-6.svg' import { getDay } from 'date-fns' +import DanmakuContainer from './components/DanmakuContainer' +import DanmakuDomain from '@/domain/Danmaku' +import { browser } from 'wxt/browser' export default function App() { const send = useRemeshSend() const roomDomain = useRemeshDomain(RoomDomain()) const userInfoDomain = useRemeshDomain(UserInfoDomain()) const messageListDomain = useRemeshDomain(MessageListDomain()) + const danmakuDomain = useRemeshDomain(DanmakuDomain()) + const danmakuIsEnabled = useRemeshQuery(danmakuDomain.query.IsEnabledQuery()) + const userInfo = useRemeshQuery(userInfoDomain.query.UserInfoQuery()) const userInfoSetFinished = useRemeshQuery(userInfoDomain.query.UserInfoSetIsFinishedQuery()) const userInfoLoadFinished = useRemeshQuery(userInfoDomain.query.UserInfoLoadIsFinishedQuery()) - const messageListLoadFinished = useRemeshQuery(messageListDomain.query.MessageListLoadIsFinishedQuery()) - + const messageListLoadFinished = useRemeshQuery(messageListDomain.query.LoadIsFinishedQuery()) const notUserInfo = userInfoLoadFinished && !userInfoSetFinished const DayLogo = [LogoIcon0, LogoIcon1, LogoIcon2, LogoIcon3, LogoIcon4, LogoIcon5, LogoIcon6][getDay(Date())] @@ -63,6 +68,15 @@ export default function App() { getAppOpenStatus() }, []) + const danmakuContainerRef = useRef(null) + + useEffect(() => { + danmakuIsEnabled && send(danmakuDomain.command.MountCommand(danmakuContainerRef.current!)) + return () => { + danmakuIsEnabled && send(danmakuDomain.command.DestroyCommand()) + } + }, [danmakuIsEnabled]) + return ( <> @@ -75,6 +89,7 @@ export default function App() { + ) } diff --git a/src/app/content/components/DanmakuContainer.tsx b/src/app/content/components/DanmakuContainer.tsx new file mode 100644 index 0000000..78a8434 --- /dev/null +++ b/src/app/content/components/DanmakuContainer.tsx @@ -0,0 +1,19 @@ +import { cn } from '@/utils' +import { forwardRef } from 'react' + +export interface DanmakuContainerProps { + className?: string +} + +const DanmakuContainer = forwardRef(({ className }, ref) => { + return ( +
+ ) +}) + +DanmakuContainer.displayName = 'DanmakuContainer' + +export default DanmakuContainer diff --git a/src/app/content/components/DanmakuMessage.tsx b/src/app/content/components/DanmakuMessage.tsx new file mode 100644 index 0000000..8e5f7cf --- /dev/null +++ b/src/app/content/components/DanmakuMessage.tsx @@ -0,0 +1,32 @@ +import { Avatar, AvatarFallback } from '@/components/ui/Avatar' +import { Button } from '@/components/ui/Button' +import { TextMessage } from '@/domain/Room' +import { cn } from '@/utils' +import { AvatarImage } from '@radix-ui/react-avatar' +import { FC } from 'react' + +export interface PromptItemProps { + data: TextMessage + className?: string +} + +const DanmakuMessage: FC = ({ data, className }) => { + return ( + + ) +} + +DanmakuMessage.displayName = 'DanmakuMessage' + +export default DanmakuMessage diff --git a/src/app/content/components/MessageInput.tsx b/src/app/content/components/MessageInput.tsx index 9c114f6..cd09ade 100644 --- a/src/app/content/components/MessageInput.tsx +++ b/src/app/content/components/MessageInput.tsx @@ -1,6 +1,5 @@ -import { type ChangeEvent, type KeyboardEvent } from 'react' +import { forwardRef, type ChangeEvent, type KeyboardEvent } from 'react' -import React from 'react' import { Textarea } from '@/components/ui/Textarea' import { Markdown } from '@/components/ui/Markdown' import { cn } from '@/utils' @@ -17,7 +16,7 @@ export interface MessageInputProps { onEnter?: (value: string) => void } -const MessageInput = React.forwardRef( +const MessageInput = forwardRef( ({ value = '', className, maxLength = 500, onInput, onEnter, preview, autoFocus, disabled }, ref) => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter' && !(e.shiftKey || e.ctrlKey || e.altKey || e.metaKey)) { diff --git a/src/app/content/index.tsx b/src/app/content/index.tsx index f2047b6..61b2e09 100644 --- a/src/app/content/index.tsx +++ b/src/app/content/index.tsx @@ -7,8 +7,9 @@ import { defineContentScript } from 'wxt/sandbox' import { createShadowRootUi } from 'wxt/client' import App from './App' -import { IndexDBStorageImpl, BrowserSyncStorageImpl } from '@/domain/impls/Storage' +import { IndexDBStorageImpl, BrowserSyncStorageImpl, indexDBStorage } from '@/domain/impls/Storage' import { PeerRoomImpl } from '@/domain/impls/PeerRoom' +import { DanmakuImpl } from '@/domain/impls/Danmaku' // import { PeerRoomImpl } from '@/domain/impls/PeerRoom2' import '@/assets/styles/tailwind.css' import '@/assets/styles/sonner.css' @@ -22,7 +23,7 @@ export default defineContentScript({ excludeMatches: ['*://localhost/*', '*://127.0.0.1/*'], async main(ctx) { const store = Remesh.store({ - externs: [IndexDBStorageImpl, BrowserSyncStorageImpl, PeerRoomImpl, ToastImpl] + externs: [IndexDBStorageImpl, BrowserSyncStorageImpl, PeerRoomImpl, ToastImpl, DanmakuImpl] // inspectors: __DEV__ ? [RemeshLogger()] : [] }) diff --git a/src/app/content/views/AppButton/index.tsx b/src/app/content/views/AppButton/index.tsx index 2a5aa55..76f8bb3 100644 --- a/src/app/content/views/AppButton/index.tsx +++ b/src/app/content/views/AppButton/index.tsx @@ -1,4 +1,4 @@ -import { type ReactNode, type FC, useState, type MouseEvent, useRef, useEffect } from 'react' +import { type ReactNode, type FC, useState, type MouseEvent, useRef } from 'react' import { SettingsIcon, MoonIcon, SunIcon } from 'lucide-react' import { motion, AnimatePresence } from 'framer-motion' diff --git a/src/app/content/views/Main/index.tsx b/src/app/content/views/Main/index.tsx index 696fce2..4268b53 100644 --- a/src/app/content/views/Main/index.tsx +++ b/src/app/content/views/Main/index.tsx @@ -7,7 +7,7 @@ import PromptItem from '../../components/PromptItem' import UserInfoDomain from '@/domain/UserInfo' import RoomDomain, { MessageType } from '@/domain/Room' import MessageListDomain from '@/domain/MessageList' -import BlurFade from '@/components/magicui/blur-fade' +import BlurFade from '@/components/magicui/BlurFade' const Main: FC = () => { const send = useRemeshSend() diff --git a/src/app/content/views/Setup/index.tsx b/src/app/content/views/Setup/index.tsx index ceab001..f8bafac 100644 --- a/src/app/content/views/Setup/index.tsx +++ b/src/app/content/views/Setup/index.tsx @@ -9,9 +9,9 @@ import { FC, useEffect, useState } from 'react' import { useRemeshDomain, useRemeshSend } from 'remesh-react' import Timer from '@resreq/timer' import ExampleImage from '@/assets/images/example.jpg' -import PulsatingButton from '@/components/magicui/pulsating-button' -import BlurFade from '@/components/magicui/blur-fade' -import WordPullUp from '@/components/magicui/word-pull-up' +import PulsatingButton from '@/components/magicui/PulsatingButton' +import BlurFade from '@/components/magicui/BlurFade' +import WordPullUp from '@/components/magicui/WordPullUp' import { motion } from 'framer-motion' const mockTextList = [ @@ -41,7 +41,8 @@ const generateUserInfo = async (): Promise => { name: generateRandomName(), avatar: await generateRandomAvatar(MAX_AVATAR_SIZE), createTime: Date.now(), - themeMode: checkSystemDarkMode() ? 'dark' : 'system' + themeMode: checkSystemDarkMode() ? 'dark' : 'system', + danmakuEnabled: true } } diff --git a/src/app/options/components/Layout.tsx b/src/app/options/components/Layout.tsx index 091ffa6..0d93a5a 100644 --- a/src/app/options/components/Layout.tsx +++ b/src/app/options/components/Layout.tsx @@ -1,4 +1,4 @@ -import Meteors from '@/components/magicui/meteors' +import Meteors from '@/components/magicui/Meteors' import { FC, ReactNode } from 'react' export interface LayoutProps { diff --git a/src/app/options/components/ProfileForm.tsx b/src/app/options/components/ProfileForm.tsx index b9d6ef5..86b8c9f 100644 --- a/src/app/options/components/ProfileForm.tsx +++ b/src/app/options/components/ProfileForm.tsx @@ -15,15 +15,16 @@ import { Label } from '@/components/ui/Label' import { RefreshCcwIcon } from 'lucide-react' import { MAX_AVATAR_SIZE } from '@/constants/config' import ToastDomain from '@/domain/Toast' -import BlurFade from '@/components/magicui/blur-fade' -import debounce from './../../../utils/debounce' +import BlurFade from '@/components/magicui/BlurFade' +import { Checkbox } from '@/components/ui/checkbox' const defaultUserInfo: UserInfo = { id: nanoid(), name: '', avatar: '', createTime: Date.now(), - themeMode: checkSystemDarkMode() ? 'dark' : 'system' + themeMode: checkSystemDarkMode() ? 'dark' : 'system', + danmakuEnabled: true } const formSchema = v.object({ @@ -49,7 +50,8 @@ const formSchema = v.object({ themeMode: v.pipe( v.string(), v.union([v.literal('system'), v.literal('light'), v.literal('dark')], 'Please select extension theme mode.') - ) + ), + danmakuEnabled: v.boolean() }) const ProfileForm = () => { @@ -89,7 +91,7 @@ const ProfileForm = () => { return (
- + { )} /> + ( + + {/* Username */} + +
+ + + Enable Danmaku + +
+
+ Danmaku messages will scroll across the screen. + +
+ )} + /> , + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/src/domain/Danmaku.ts b/src/domain/Danmaku.ts new file mode 100644 index 0000000..d9f0527 --- /dev/null +++ b/src/domain/Danmaku.ts @@ -0,0 +1,145 @@ +import { Remesh } from 'remesh' +import { DanmakuExtern } from './externs/Danmaku' +import { TextMessage } from './Room' +import UserInfoDomain from './UserInfo' +import { map } from 'rxjs' + +const DanmakuDomain = Remesh.domain({ + name: 'DanmakuDomain', + impl: (domain) => { + const danmaku = domain.getExtern(DanmakuExtern) + const userInfoDomain = domain.getDomain(UserInfoDomain()) + + const MountState = domain.state({ + name: 'Danmaku.MountState', + default: false + }) + const DanmakuEnabledState = domain.state({ + name: 'Danmaku.EnabledState', + default: false + }) + + const IsEnabledQuery = domain.query({ + name: 'Danmaku.IsOpenQuery', + impl: ({ get }) => { + return get(DanmakuEnabledState()) + } + }) + + const EnableCommand = domain.command({ + name: 'Danmaku.EnableCommand', + impl: () => { + return DanmakuEnabledState().new(true) + } + }) + + const DisableCommand = domain.command({ + name: 'Danmaku.DisableCommand', + impl: () => { + return DanmakuEnabledState().new(false) + } + }) + + const IsMountedQuery = domain.query({ + name: 'Danmaku.IsMountedQuery', + impl: ({ get }) => get(MountState()) + }) + + const PushCommand = domain.command({ + name: 'Danmaku.PushCommand', + impl: (_, message: TextMessage) => { + danmaku.push(message) + return [PushEvent(message)] + } + }) + + const UnshiftCommand = domain.command({ + name: 'Danmaku.UnshiftCommand', + impl: (_, message: TextMessage) => { + danmaku.unshift(message) + return [UnshiftEvent(message)] + } + }) + + const ClearCommand = domain.command({ + name: 'Danmaku.ClearCommand', + impl: () => { + danmaku.clear() + return [ClearEvent()] + } + }) + + const MountCommand = domain.command({ + name: 'Danmaku.ClearCommand', + impl: (_, container: HTMLElement) => { + danmaku.mount(container) + return [MountEvent(container)] + } + }) + + const DestroyCommand = domain.command({ + name: 'Danmaku.DestroyCommand', + impl: () => { + danmaku.destroy() + return [DestroyEvent()] + } + }) + + const PushEvent = domain.event({ + name: 'Danmaku.PushEvent' + }) + + const UnshiftEvent = domain.event({ + name: 'Danmaku.UnshiftEvent' + }) + + const ClearEvent = domain.event({ + name: 'Danmaku.ClearEvent' + }) + + const MountEvent = domain.event({ + name: 'Danmaku.MountEvent' + }) + + const DestroyEvent = domain.event({ + name: 'Danmaku.DestroyEvent' + }) + + domain.effect({ + name: 'Danmaku.OnUserInfoEffect', + impl: ({ fromEvent }) => { + const onUserInfo$ = fromEvent(userInfoDomain.event.UpdateUserInfoEvent) + return onUserInfo$.pipe( + map((userInfo) => { + return userInfo?.danmakuEnabled ? EnableCommand() : DisableCommand() + }) + ) + } + }) + + return { + query: { + IsMountedQuery, + IsEnabledQuery + }, + command: { + EnableCommand, + DisableCommand, + PushCommand, + UnshiftCommand, + ClearCommand, + MountCommand, + DestroyCommand + }, + event: { + PushEvent, + UnshiftEvent, + ClearEvent, + MountEvent, + DestroyEvent + } + } + } +}) + +export default DanmakuDomain diff --git a/src/domain/MessageList.ts b/src/domain/MessageList.ts index 8f0ee4b..a7916c8 100644 --- a/src/domain/MessageList.ts +++ b/src/domain/MessageList.ts @@ -48,8 +48,8 @@ const MessageListDomain = Remesh.domain({ key: (message) => message.id }) - const MessageListLoadStatusModule = StatusModule(domain, { - name: 'MessageListLoadStatusModule' + const LoadStatusModule = StatusModule(domain, { + name: 'Message.ListLoadStatusModule' }) const ListQuery = MessageListModule.query.ItemListQuery @@ -58,6 +58,8 @@ const MessageListDomain = Remesh.domain({ const HasItemQuery = MessageListModule.query.HasItemByKeyQuery + const LoadIsFinishedQuery = LoadStatusModule.query.IsFinishedQuery + const ChangeListEvent = domain.event({ name: 'MessageList.ChangeListEvent', impl: ({ get }) => { @@ -144,16 +146,14 @@ const MessageListDomain = Remesh.domain({ storageEffect .set(SyncToStorageEvent) - .get< - Message[] - >((value) => [SyncToStateCommand(value ?? []), MessageListLoadStatusModule.command.SetFinishedCommand()]) + .get((value) => [SyncToStateCommand(value ?? []), LoadStatusModule.command.SetFinishedCommand()]) return { query: { HasItemQuery, ItemQuery, ListQuery, - MessageListLoadIsFinishedQuery: MessageListLoadStatusModule.query.IsFinishedQuery + LoadIsFinishedQuery }, command: { CreateItemCommand, diff --git a/src/domain/Room.ts b/src/domain/Room.ts index 16d3410..1c589c0 100644 --- a/src/domain/Room.ts +++ b/src/domain/Room.ts @@ -1,5 +1,5 @@ import { Remesh } from 'remesh' -import { map, merge, of, EMPTY, mergeMap, fromEvent, Observable, tap, fromEventPattern } from 'rxjs' +import { map, merge, of, EMPTY, mergeMap, fromEvent, fromEventPattern } from 'rxjs' import { NormalMessage, type MessageUser } from './MessageList' import { PeerRoomExtern } from '@/domain/externs/PeerRoom' import MessageListDomain, { MessageType } from '@/domain/MessageList' @@ -7,7 +7,8 @@ import UserInfoDomain from '@/domain/UserInfo' import { desert, upsert } from '@/utils' import { nanoid } from 'nanoid' import StatusModule from '@/domain/modules/Status' -import { ToastExtern } from './externs/Toast' +import { ToastExtern } from '@/domain/externs/Toast' +import DanmakuDomain from '@/domain/Danmaku' export { MessageType } @@ -50,6 +51,7 @@ const RoomDomain = Remesh.domain({ impl: (domain) => { const messageListDomain = domain.getDomain(MessageListDomain()) const userInfoDomain = domain.getDomain(UserInfoDomain()) + const danmakuDomain = domain.getDomain(DanmakuDomain()) const peerRoom = domain.getExtern(PeerRoomExtern) const toast = domain.getExtern(ToastExtern) @@ -65,12 +67,12 @@ const RoomDomain = Remesh.domain({ } }) - const RoomJoinStatusModule = StatusModule(domain, { - name: 'RoomJoinStatusModule' + const JoinStatusModule = StatusModule(domain, { + name: 'Room.JoinStatusModule' }) const UserListState = domain.state({ - name: 'RoomUserListState', + name: 'Room.UserListState', default: [] }) @@ -81,8 +83,10 @@ const RoomDomain = Remesh.domain({ } }) + const JoinIsFinishedQuery = JoinStatusModule.query.IsFinishedQuery + const JoinRoomCommand = domain.command({ - name: 'RoomJoinRoomCommand', + name: 'Room.JoinRoomCommand', impl: ({ get }) => { peerRoom.joinRoom() const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! @@ -101,14 +105,14 @@ const RoomDomain = Remesh.domain({ type: MessageType.Prompt, date: Date.now() }), - RoomJoinStatusModule.command.SetFinishedCommand(), + JoinStatusModule.command.SetFinishedCommand(), JoinRoomEvent(peerRoom.roomId) ] } }) const LeaveRoomCommand = domain.command({ - name: 'RoomLeaveRoomCommand', + name: 'Room.LeaveRoomCommand', impl: ({ get }) => { peerRoom.leaveRoom() const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! @@ -126,16 +130,21 @@ const RoomDomain = Remesh.domain({ type: 'delete', user: { peerId: peerRoom.peerId, joinTime: Date.now(), userId, username, userAvatar } }), - RoomJoinStatusModule.command.SetInitialCommand(), + JoinStatusModule.command.SetInitialCommand(), LeaveRoomEvent(peerRoom.roomId) ] } }) const SendTextMessageCommand = domain.command({ - name: 'RoomSendTextMessageCommand', + name: 'Room.SendTextMessageCommand', impl: ({ get }, message: string) => { - const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! + const { + id: userId, + name: username, + avatar: userAvatar, + danmakuEnabled + } = get(userInfoDomain.query.UserInfoQuery())! const textMessage: TextMessage = { id: nanoid(), @@ -154,13 +163,17 @@ const RoomDomain = Remesh.domain({ hateUsers: [] } - peerRoom.sendMessage(textMessage) - return [messageListDomain.command.CreateItemCommand(listMessage), SendTextMessageEvent(textMessage)] + peerRoom.sendMessage(textMessage) + return [ + messageListDomain.command.CreateItemCommand(listMessage), + danmakuEnabled ? PushDanmakuCommand(textMessage) : null, + SendTextMessageEvent(textMessage) + ] } }) const SendLikeMessageCommand = domain.command({ - name: 'RoomSendLikeMessageCommand', + name: 'Room.SendLikeMessageCommand', impl: ({ get }, messageId: string) => { const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! const localMessage = get(messageListDomain.query.ItemQuery(messageId)) as NormalMessage @@ -176,13 +189,13 @@ const RoomDomain = Remesh.domain({ ...localMessage, likeUsers: desert(localMessage.likeUsers, likeMessage, 'userId') } - peerRoom.sendMessage(likeMessage) + peerRoom.sendMessage(likeMessage) return [messageListDomain.command.UpdateItemCommand(listMessage), SendLikeMessageEvent(likeMessage)] } }) const SendHateMessageCommand = domain.command({ - name: 'RoomSendHateMessageCommand', + name: 'Room.SendHateMessageCommand', impl: ({ get }, messageId: string) => { const { id: userId, name: username, avatar: userAvatar } = get(userInfoDomain.query.UserInfoQuery())! const localMessage = get(messageListDomain.query.ItemQuery(messageId)) as NormalMessage @@ -198,13 +211,13 @@ const RoomDomain = Remesh.domain({ ...localMessage, hateUsers: desert(localMessage.hateUsers, hateMessage, 'userId') } - peerRoom.sendMessage(hateMessage) + peerRoom.sendMessage(hateMessage) return [messageListDomain.command.UpdateItemCommand(listMessage), SendHateMessageEvent(hateMessage)] } }) const SendJoinMessageCommand = domain.command({ - name: 'RoomSendJoinMessageCommand', + name: 'Room.SendJoinMessageCommand', impl: ({ get }, targetPeerId: string) => { const self = get(UserListQuery()).find((user) => user.peerId === peerRoom.peerId)! @@ -214,13 +227,13 @@ const RoomDomain = Remesh.domain({ type: SendType.Join } - peerRoom.sendMessage(syncUserMessage, targetPeerId) + peerRoom.sendMessage(syncUserMessage, targetPeerId) return [SendJoinMessageEvent(syncUserMessage)] } }) const UpdateUserListCommand = domain.command({ - name: 'RoomUpdateUserListCommand', + name: 'Room.UpdateUserListCommand', impl: ({ get }, action: { type: 'create' | 'delete'; user: RoomUser }) => { const userList = get(UserListState()) if (action.type === 'create') { @@ -231,44 +244,58 @@ const RoomDomain = Remesh.domain({ } }) + const PushDanmakuCommand = domain.command({ + name: 'Room.PushDanmakuCommand', + impl: (_, message: TextMessage) => { + return [danmakuDomain.command.PushCommand(message)] + } + }) + + // const UnshiftDanmakuCommand = domain.command({ + // name: 'Room.PushDanmakuCommand', + // impl: (_, message: TextMessage) => { + // return [danmakuDomain.command.UnshiftCommand(message)] + // } + // }) + const SendJoinMessageEvent = domain.event({ - name: 'RoomSendJoinMessageEvent' + name: 'Room.SendJoinMessageEvent' }) const SendTextMessageEvent = domain.event({ - name: 'RoomSendTextMessageEvent' + name: 'Room.SendTextMessageEvent' }) const SendLikeMessageEvent = domain.event({ - name: 'RoomSendLikeMessageEvent' + name: 'Room.SendLikeMessageEvent' }) const SendHateMessageEvent = domain.event({ - name: 'RoomSendHateMessageEvent' + name: 'Room.SendHateMessageEvent' }) const JoinRoomEvent = domain.event({ - name: 'RoomJoinRoomEvent' + name: 'Room.JoinRoomEvent' }) const LeaveRoomEvent = domain.event({ - name: 'RoomLeaveRoomEvent' + name: 'Room.LeaveRoomEvent' }) const OnMessageEvent = domain.event({ - name: 'RoomOnMessageEvent' + name: 'Room.OnMessageEvent' }) const OnJoinRoomEvent = domain.event({ - name: 'RoomOnJoinRoomEvent' + name: 'Room.OnJoinRoomEvent' }) const OnLeaveRoomEvent = domain.event({ - name: 'RoomOnLeaveRoomEvent' + name: 'Room.OnLeaveRoomEvent' }) domain.effect({ - name: 'RoomOnJoinRoomEffect', + name: 'Room.OnJoinRoomEffect', impl: () => { const onJoinRoom$ = fromEventPattern(peerRoom.onJoinRoom).pipe( mergeMap((peerId) => { @@ -285,14 +312,16 @@ const RoomDomain = Remesh.domain({ }) domain.effect({ - name: 'RoomOnMessageEffect', + name: 'Room.OnMessageEffect', impl: ({ get }) => { const onMessage$ = fromEventPattern(peerRoom.onMessage).pipe( mergeMap((message) => { // console.log('onMessage', message) + const { danmakuEnabled } = get(userInfoDomain.query.UserInfoQuery())! + const messageEvent$ = of(OnMessageEvent(message)) - const commandEvent$ = (() => { + const messageCommand$ = (() => { switch (message.type) { case SendType.Join: { const userList = get(UserListQuery()) @@ -326,7 +355,8 @@ const RoomDomain = Remesh.domain({ date: Date.now(), likeUsers: [], hateUsers: [] - }) + }), + danmakuEnabled ? PushDanmakuCommand(message) : null ) case SendType.Like: case SendType.Hate: { @@ -355,7 +385,8 @@ const RoomDomain = Remesh.domain({ return EMPTY } })() - return merge(messageEvent$, commandEvent$) + + return merge(messageEvent$, messageCommand$) }) ) return onMessage$ @@ -363,7 +394,7 @@ const RoomDomain = Remesh.domain({ }) domain.effect({ - name: 'RoomOnLeaveRoomEffect', + name: 'Room.OnLeaveRoomEffect', impl: ({ get }) => { const onLeaveRoom$ = fromEventPattern(peerRoom.onLeaveRoom).pipe( map((peerId) => { @@ -392,7 +423,7 @@ const RoomDomain = Remesh.domain({ }) domain.effect({ - name: 'RoomOnErrorEffect', + name: 'Room.OnErrorEffect', impl: () => { const onRoomError$ = fromEventPattern(peerRoom.onError).pipe( map((error) => { @@ -407,11 +438,11 @@ const RoomDomain = Remesh.domain({ // TODO: Move this to a service worker in the future, so we don't need to send a leave room message every time the page refreshes domain.effect({ - name: 'RoomOnUnloadEffect', + name: 'Room.OnUnloadEffect', impl: ({ get }) => { - const beforeUnload$ = fromEvent(window, 'beforeunload').pipe( + const beforeUnload$ = fromEvent(window, 'beforedestroy').pipe( map(() => { - return get(RoomJoinStatusModule.query.IsFinishedQuery()) ? LeaveRoomCommand() : null + return get(JoinStatusModule.query.IsFinishedQuery()) ? LeaveRoomCommand() : null }) ) return beforeUnload$ @@ -422,7 +453,7 @@ const RoomDomain = Remesh.domain({ query: { PeerIdQuery, UserListQuery, - RoomJoinIsFinishedQuery: RoomJoinStatusModule.query.IsFinishedQuery + JoinIsFinishedQuery }, command: { JoinRoomCommand, diff --git a/src/domain/UserInfo.ts b/src/domain/UserInfo.ts index f7a3329..b215ede 100644 --- a/src/domain/UserInfo.ts +++ b/src/domain/UserInfo.ts @@ -10,6 +10,7 @@ export interface UserInfo { avatar: string createTime: number themeMode: 'system' | 'light' | 'dark' + danmakuEnabled: boolean } const UserInfoDomain = Remesh.domain({ @@ -27,10 +28,10 @@ const UserInfoDomain = Remesh.domain({ }) const UserInfoLoadStatusModule = StatusModule(domain, { - name: 'UserInfoLoadStatusModule' + name: 'UserInfo.LoadStatusModule' }) const UserInfoSetStatusModule = StatusModule(domain, { - name: 'UserInfoSetStatusModule' + name: 'UserInfo.SetStatusModule' }) const UserInfoQuery = domain.query({ @@ -43,8 +44,6 @@ const UserInfoDomain = Remesh.domain({ const UpdateUserInfoCommand = domain.command({ name: 'UserInfo.UpdateUserInfoCommand', impl: (_, userInfo: UserInfo | null) => { - console.log('111', userInfo) - return [ UserInfoState().new(userInfo), UpdateUserInfoEvent(), @@ -81,16 +80,16 @@ const UserInfoDomain = Remesh.domain({ UserInfoState().new(userInfo), UpdateUserInfoEvent(), SyncToStateEvent(userInfo), - userInfo && UserInfoSetStatusModule.command.SetFinishedCommand() + userInfo + ? UserInfoSetStatusModule.command.SetFinishedCommand() + : UserInfoSetStatusModule.command.SetInitialCommand() ] } }) storageEffect .set(SyncToStorageEvent) - .get((value) => { - return [SyncToStateCommand(value), UserInfoLoadStatusModule.command.SetFinishedCommand()] - }) + .get((value) => [SyncToStateCommand(value), UserInfoLoadStatusModule.command.SetFinishedCommand()]) .watch((value) => [SyncToStateCommand(value)]) return { diff --git a/src/domain/externs/Danmaku.ts b/src/domain/externs/Danmaku.ts new file mode 100644 index 0000000..782eeba --- /dev/null +++ b/src/domain/externs/Danmaku.ts @@ -0,0 +1,30 @@ +import { Remesh } from 'remesh' +import { TextMessage } from '../Room' + +export interface Danmaku { + push: (message: TextMessage) => void + unshift: (message: TextMessage) => void + clear: () => void + mount: (root: HTMLElement) => void + destroy: () => void +} + +export const DanmakuExtern = Remesh.extern({ + default: { + mount: () => { + throw new Error('"mount" not implemented.') + }, + destroy() { + throw new Error('"destroy" not implemented.') + }, + clear: () => { + throw new Error('"clear" not implemented.') + }, + push: () => { + throw new Error('"push" not implemented.') + }, + unshift: () => { + throw new Error('"unshift" not implemented.') + } + } +}) diff --git a/src/domain/externs/PeerRoom.ts b/src/domain/externs/PeerRoom.ts index ff388e5..5d79063 100644 --- a/src/domain/externs/PeerRoom.ts +++ b/src/domain/externs/PeerRoom.ts @@ -1,13 +1,12 @@ import { Remesh } from 'remesh' - -export type PeerMessage = object | Blob | ArrayBuffer | ArrayBufferView +import { RoomMessage } from '../Room' export interface PeerRoom { readonly peerId: string readonly roomId: string joinRoom: () => PeerRoom - sendMessage: (message: T, id?: string) => PeerRoom - onMessage: (callback: (message: T) => void) => PeerRoom + sendMessage: (message: RoomMessage, id?: string) => PeerRoom + onMessage: (callback: (message: RoomMessage) => void) => PeerRoom leaveRoom: () => PeerRoom onJoinRoom: (callback: (id: string) => void) => PeerRoom onLeaveRoom: (callback: (id: string) => void) => PeerRoom diff --git a/src/domain/externs/Storage.ts b/src/domain/externs/Storage.ts index 2b42806..029058e 100644 --- a/src/domain/externs/Storage.ts +++ b/src/domain/externs/Storage.ts @@ -1,10 +1,9 @@ import { Remesh } from 'remesh' -import { type Promisable } from 'type-fest' export type StorageValue = null | string | number | boolean | object export type WatchEvent = 'update' | 'remove' export type WatchCallback = (event: WatchEvent, key: string) => any -export type Unwatch = () => Promisable +export type Unwatch = () => Promise export interface Storage { name: string @@ -31,10 +30,10 @@ export const IndexDBStorageExtern = Remesh.extern({ clear: async () => { throw new Error('"clear" not implemented.') }, - watch: () => { + watch: async () => { throw new Error('"watch" not implemented.') }, - unwatch: () => { + unwatch: async () => { throw new Error('"unwatch" not implemented.') } } @@ -55,10 +54,10 @@ export const BrowserSyncStorageExtern = Remesh.extern({ clear: async () => { throw new Error('"clear" not implemented.') }, - watch: () => { + watch: async () => { throw new Error('"watch" not implemented.') }, - unwatch: () => { + unwatch: async () => { throw new Error('"unwatch" not implemented.') } } diff --git a/src/domain/impls/Danmaku.ts b/src/domain/impls/Danmaku.ts new file mode 100644 index 0000000..d71da95 --- /dev/null +++ b/src/domain/impls/Danmaku.ts @@ -0,0 +1,80 @@ +import { DanmakuExtern } from '@/domain/externs/Danmaku' + +import { TextMessage } from '@/domain/Room' +import { createElement } from 'react' +import _Danmaku from 'danmaku' +import DanmakuMessage from '@/app/content/components/DanmakuMessage' +import { createRoot } from 'react-dom/client' + +// import { create } from 'danmaku' +// const manager = create({ +// trackHeight: '20%', +// plugin: { +// init(manager) { +// 'shadow shadow-slate-200 bg-slate-100'.split(' ').forEach((c) => { +// manager.container.node.classList.add(c) +// }) +// }, +// $createNode(dm) { +// if (!dm.node) return +// createRoot(dm.node).render(createElement(DanmakuMessage, { data: dm.data })) +// } +// } +// }) + +// manager.mount(document.body) +// manager.startPlaying() + +export class Danmaku { + private container?: Element + private _danmaku?: _Danmaku + + mount(container: HTMLElement) { + this.container = container + + this._danmaku = new _Danmaku({ + container + }) + } + + destroy() { + if (!this.container) { + throw new Error('Danmaku not mounted') + } + this._danmaku!.destroy() + } + + push(message: TextMessage) { + if (!this.container) { + throw new Error('Danmaku not mounted') + } + + const root = document.createElement('div') + createRoot(root).render(createElement(DanmakuMessage, { data: message })) + + // Wait for React render to complete + requestIdleCallback(() => { + this._danmaku!.emit({ + render() { + return root.firstElementChild! as HTMLElement + } + }) + }) + } + + unshift(message: TextMessage) { + if (!this.container) { + throw new Error('Danmaku not mounted') + } + // console.log(message) + } + + clear() { + if (!this.container) { + throw new Error('Danmaku not mounted') + } + this._danmaku!.clear() + } +} + +export const DanmakuImpl = DanmakuExtern.impl(new Danmaku()) diff --git a/src/domain/impls/PeerRoom.ts b/src/domain/impls/PeerRoom.ts index b731b2e..cf2b8e0 100644 --- a/src/domain/impls/PeerRoom.ts +++ b/src/domain/impls/PeerRoom.ts @@ -2,9 +2,10 @@ import { type DataPayload, type Room, joinRoom, selfId } from 'trystero' // import { joinRoom } from 'trystero/firebase' -import { PeerRoomExtern, type PeerMessage } from '@/domain/externs/PeerRoom' +import { PeerRoomExtern } from '@/domain/externs/PeerRoom' import { stringToHex } from '@/utils' import EventHub from '@resreq/event-hub' +import { RoomMessage } from '../Room' export interface Config { peerId?: string @@ -44,37 +45,37 @@ class PeerRoom extends EventHub { return this } - sendMessage(message: T, id?: string) { + sendMessage(message: RoomMessage, id?: string) { if (!this.room) { this.once('action', () => { if (!this.room) { this.emit('error', new Error('Room not joined')) } else { const [send] = this.room.makeAction('MESSAGE') - send(message as DataPayload, id) + send(message as any as DataPayload, id) } }) } else { const [send] = this.room.makeAction('MESSAGE') - send(message as DataPayload, id) + send(message as any as DataPayload, id) } return this } - onMessage(callback: (message: T) => void) { + onMessage(callback: (message: RoomMessage) => void) { if (!this.room) { this.once('action', () => { if (!this.room) { this.emit('error', new Error('Room not joined')) } else { const [, on] = this.room.makeAction('MESSAGE') - on((message) => callback(message as T)) + on((message) => callback(message as any as RoomMessage)) } }) } else { const [, on] = this.room.makeAction('MESSAGE') - on((message) => callback(message as T)) + on((message) => callback(message as any as RoomMessage)) } return this } diff --git a/src/domain/impls/PeerRoom2.ts b/src/domain/impls/PeerRoom2.ts index 9c172fd..6de1200 100644 --- a/src/domain/impls/PeerRoom2.ts +++ b/src/domain/impls/PeerRoom2.ts @@ -1,9 +1,10 @@ import { Artico, Room } from '@rtco/client' -import { PeerRoomExtern, type PeerMessage } from '@/domain/externs/PeerRoom' +import { PeerRoomExtern } from '@/domain/externs/PeerRoom' import { stringToHex } from '@/utils' import { nanoid } from 'nanoid' import EventHub from '@resreq/event-hub' +import { RoomMessage } from '../Room' export interface Config { peerId?: string roomId: string @@ -43,7 +44,7 @@ class PeerRoom extends EventHub { return this } - sendMessage(message: T, id?: string) { + sendMessage(message: RoomMessage, id?: string) { if (!this.room) { this.once('action', () => { if (!this.room) { @@ -58,17 +59,17 @@ class PeerRoom extends EventHub { return this } - onMessage(callback: (message: T) => void) { + onMessage(callback: (message: RoomMessage) => void) { if (!this.room) { this.once('action', () => { if (!this.room) { this.emit('error', new Error('Room not joined')) } else { - this.room.on('message', (message) => callback(JSON.parse(message) as T)) + this.room.on('message', (message) => callback(JSON.parse(message) as RoomMessage)) } }) } else { - this.room.on('message', (message) => callback(JSON.parse(message) as T)) + this.room.on('message', (message) => callback(JSON.parse(message) as RoomMessage)) } return this } diff --git a/src/domain/impls/Storage.ts b/src/domain/impls/Storage.ts index 3808753..6b0eccd 100644 --- a/src/domain/impls/Storage.ts +++ b/src/domain/impls/Storage.ts @@ -3,6 +3,8 @@ import indexedDbDriver from 'unstorage/drivers/indexedb' import { IndexDBStorageExtern, BrowserSyncStorageExtern } from '@/domain/externs/Storage' import { STORAGE_NAME } from '@/constants/config' import { webExtensionDriver } from '@/utils/webExtensionDriver' +import { browser } from 'wxt/browser' +import { Storage } from '@/domain/externs/Storage' export const indexDBStorage = createStorage({ driver: indexedDbDriver({ base: `${STORAGE_NAME}:` }) @@ -18,7 +20,7 @@ export const IndexDBStorageImpl = IndexDBStorageExtern.impl({ set: indexDBStorage.setItem, remove: indexDBStorage.removeItem, clear: indexDBStorage.clear, - watch: indexDBStorage.watch, + watch: indexDBStorage.watch as Storage['watch'], unwatch: indexDBStorage.unwatch }) @@ -28,6 +30,26 @@ export const BrowserSyncStorageImpl = BrowserSyncStorageExtern.impl({ set: browserSyncStorage.setItem, remove: browserSyncStorage.removeItem, clear: browserSyncStorage.clear, - watch: browserSyncStorage.watch, + watch: browserSyncStorage.watch as Storage['watch'], unwatch: browserSyncStorage.unwatch }) + +// export const BrowserSyncStorageImpl = BrowserSyncStorageExtern.impl({ +// name: STORAGE_NAME, +// get: async (key: string) => { +// const res = await browser.storage.sync.get(key) +// return res[key] ?? null +// }, +// set: async (key, value) => { +// await browser.storage.sync.set({ [key]: value ?? null }) +// }, +// remove: browserSyncStorage.removeItem, +// clear: browserSyncStorage.clear, +// watch: async (callback) => { +// browser.storage.sync.onChanged.addListener(callback) +// return async () => { +// return browser.storage.sync.onChanged.removeListener(callback) +// } +// }, +// unwatch: browserSyncStorage.unwatch +// }) diff --git a/src/domain/modules/StorageEffect.ts b/src/domain/modules/StorageEffect.ts index 90e9d0a..d65689e 100644 --- a/src/domain/modules/StorageEffect.ts +++ b/src/domain/modules/StorageEffect.ts @@ -1,18 +1,7 @@ import { type RemeshEvent, type RemeshAction, type RemeshDomainContext, type RemeshExtern } from 'remesh' -import { defer, from, fromEventPattern, map, Observable, switchMap } from 'rxjs' -import { type Promisable } from 'type-fest' +import { defer, from, map, Observable, switchMap } from 'rxjs' -export type StorageValue = null | string | number | boolean | object -export type WatchEvent = 'update' | 'remove' -export type WatchCallback = (event: WatchEvent, key: string) => any -export type Unwatch = () => Promisable - -export interface Storage { - get: (key: string) => Promise - set: (key: string, value: T) => Promise - watch: (callback: WatchCallback) => Promise - unwatch?: Unwatch -} +import { Storage, StorageValue } from '@/domain/externs/Storage' export interface Options { domain: RemeshDomainContext @@ -60,20 +49,14 @@ export default class StorageEffect { this.domain.effect({ name: 'WatchStorageToStateEffect', impl: () => { - return defer(() => { - let unwatch: Unwatch - return new Observable((observer) => { - this.storage - .watch(() => observer.next()) - .then((_unwatch) => { - unwatch = _unwatch - }) - return () => unwatch?.() - }).pipe( - switchMap(() => from(this.storage.get(this.key))), - map(callback) - ) - }) + // TODO: Report the bug to https://github.com/unjs/unstorage + return new Observable((observer) => { + const unwatchPromise = this.storage.watch(() => observer.next()) + return () => unwatchPromise.then((unwatch) => unwatch()) + }).pipe( + switchMap(() => from(this.storage.get(this.key))), + map(callback) + ) } }) return this diff --git a/src/utils/webExtensionDriver.ts b/src/utils/webExtensionDriver.ts index 2622ec3..8f9abc1 100644 --- a/src/utils/webExtensionDriver.ts +++ b/src/utils/webExtensionDriver.ts @@ -1,5 +1,5 @@ import { type Driver, type WatchCallback, defineDriver } from 'unstorage' -import browser, { type Storage as BrowserStorage } from 'webextension-polyfill' +import { browser, type Storage as BrowserStorage } from 'wxt/browser' export interface WebExtensionDriverOptions { storageArea: 'sync' | 'local' | 'managed' | 'session' @@ -67,6 +67,7 @@ export const webExtensionDriver: (opts: WebExtensionDriverOptions) => Driver = d watch(callback) { checkPermission() _listeners.add(callback) + if (_listeners.size === 1) { browser.storage[opts.storageArea].onChanged.addListener(_storageListener) } diff --git a/wxt.config.ts b/wxt.config.ts index 4ed47e4..5e6b05e 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -11,7 +11,7 @@ export default defineConfig({ runner: { startUrls: ['https://www.example.com/'] }, - manifest: ({ browser, manifestVersion }) => { + manifest: ({ browser }) => { const common = { name: displayName, permissions: ['storage'],