diff --git a/.dockerignore b/.dockerignore index 690649c..6bc862a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,10 @@ -**/node_modules -**/dist -**/__pycache__ -**/.ruff_cache -poetry.lock -config.yaml \ No newline at end of file +**/.git/ +**/.github/ +**/.ruff_cache/ +**/__pycache__/ +**/dist/ +**/node_modules/ +**/pyproject.toml +**/poetry.lock +**/requirements-dev.txt +**/config.yaml \ No newline at end of file diff --git a/Caddyfile b/Caddyfile index bcbb14b..b277ebc 100644 --- a/Caddyfile +++ b/Caddyfile @@ -1,12 +1,8 @@ { - # 下线宽限期 - grace_period 3s + grace_period 5s - # 日志 log { - level INFO output stdout - format console } } @@ -14,9 +10,9 @@ handle { header Content-Security-Policy "default-src 'self' wa.sscreator.com 'unsafe-inline' data:" - root * ./static try_files {path} /index.html file_server { + # TODO: 由于 Bun 标准库实现问题,暂时禁用 Brotli 压缩 precompressed gzip } } diff --git a/Dockerfile.backend b/Dockerfile.backend index 7d9af55..2176cb3 100644 --- a/Dockerfile.backend +++ b/Dockerfile.backend @@ -1,18 +1,16 @@ -FROM python:3.10.8-slim +FROM python:3.10-slim ENV TZ Asia/Shanghai WORKDIR /app COPY backend/requirements.txt . - RUN pip install \ -r requirements.txt \ --no-cache-dir \ --no-compile \ - --disable-pip-version-check \ - --quiet + --disable-pip-version-check -COPY /backend /app +COPY backend . CMD ["python", "main.py"] diff --git a/Dockerfile.frontend b/Dockerfile.frontend index 59f54d8..d6ec0f0 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -2,16 +2,15 @@ FROM oven/bun:1-alpine AS build WORKDIR /app -COPY frontend/package.json frontend/bun.lockb /app - +COPY frontend/package.json frontend/bun.lockb . RUN bun install --prod --frozen-lockfile -COPY frontend /app - +COPY frontend . RUN bun run build -FROM caddy:2.7.4-alpine +FROM caddy:2.7-alpine WORKDIR /app -COPY --from=build /app/dist ./static \ No newline at end of file +COPY Caddyfile /etc/caddy/Caddyfile +COPY --from=build /app/dist . \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..afd9b1e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 叶子 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/backend/poetry.lock b/backend/poetry.lock index 6fc5581..57e0d49 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -94,18 +94,17 @@ test = ["pytest (>=6)"] [[package]] name = "faker" -version = "24.11.0" +version = "25.0.0" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" files = [ - {file = "Faker-24.11.0-py3-none-any.whl", hash = "sha256:adb98e771073a06bdc5d2d6710d8af07ac5da64c8dc2ae3b17bb32319e66fd82"}, - {file = "Faker-24.11.0.tar.gz", hash = "sha256:34b947581c2bced340c39b35f89dbfac4f356932cfff8fe893bde854903f0e6e"}, + {file = "Faker-25.0.0-py3-none-any.whl", hash = "sha256:e23a2b74888885c3d23a9237bacb823041291c03d609a39acb9ebe6c123f3986"}, + {file = "Faker-25.0.0.tar.gz", hash = "sha256:87ef41e24b39a5be66ecd874af86f77eebd26782a2681200e86c5326340a95d3"}, ] [package.dependencies] python-dateutil = ">=2.4" -typing-extensions = {version = ">=3.10.0.1", markers = "python_version <= \"3.8\""} [[package]] name = "h11" @@ -625,101 +624,79 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymongo" -version = "4.6.3" +version = "4.7.1" description = "Python driver for MongoDB " optional = false python-versions = ">=3.7" files = [ - {file = "pymongo-4.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e344d0afdd7c06c1f1e66a4736593293f432defc2191e6b411fc9c82fa8c5adc"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux1_i686.whl", hash = "sha256:731a92dfc4022db763bfa835c6bd160f2d2cba6ada75749c2ed500e13983414b"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:c4726e36a2f7e92f09f5b8e92ba4db7525daffe31a0dcbcf0533edc0ade8c7d8"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:00e6cfce111883ca63a3c12878286e0b89871f4b840290e61fb6f88ee0e687be"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:cc7a26edf79015c58eea46feb5b262cece55bc1d4929a8a9e0cbe7e6d6a9b0eb"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:4955be64d943b30f2a7ff98d818ca530f7cb37450bc6b32c37e0e74821907ef8"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:af039afc6d787502c02089759778b550cb2f25dbe2780f5b050a2e37031c3fbf"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc15a7c7a99aed7d0831eaf78a607f1db0c7a255f96e3d18984231acd72f70c"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e97c138d811e9367723fcd07c4402a9211caae20479fdd6301d57762778a69f"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebcc145c74d06296ce0cad35992185064e5cb2aadef719586778c144f0cd4d37"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:664c64b6bdb31aceb80f0556951e5e2bf50d359270732268b4e7af00a1cf5d6c"}, - {file = "pymongo-4.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4056bc421d4df2c61db4e584415f2b0f1eebb92cbf9222f7f38303467c37117"}, - {file = "pymongo-4.6.3-cp310-cp310-win32.whl", hash = "sha256:cdbea2aac1a4caa66ee912af3601557d2bda2f9f69feec83601c78c7e53ece64"}, - {file = "pymongo-4.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:6cec7279e5a1b74b257d0270a8c97943d745811066630a6bc6beb413c68c6a33"}, - {file = "pymongo-4.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:138b9fa18d40401c217bc038a48bcde4160b02d36d8632015b1804971a2eaa2f"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60931b0e07448afe8866ffff764cd5bf4b1a855dc84c7dcb3974c6aa6a377a59"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b35f8bded43ff91475305445fedf0613f880ff7e25c75ae1028e1260a9b7a86"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:872bad5c83f7eec9da11e1fef5f858c6a4c79fe4a83c7780e7b0fe95d560ae3f"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ad3e5bfcd345c0bfe9af69a82d720860b5b043c1657ffb513c18a0dee19c19"}, - {file = "pymongo-4.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e208f2ab7b495eff8fd175022abfb0abce6307ac5aee3f4de51fc1a459b71c9"}, - {file = "pymongo-4.6.3-cp311-cp311-win32.whl", hash = "sha256:4670edbb5ddd71a4d555668ef99b032a5f81b59e4145d66123aa0d831eac7883"}, - {file = "pymongo-4.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1c2761302b6cbfd12e239ce1b8061d4cf424a361d199dcb32da534985cae9350"}, - {file = "pymongo-4.6.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:722f2b709b63311c0efda4fa4c603661faa4bec6bad24a6cc41a3bc6d841bf09"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:994386a4d6ad39e18bcede6dc8d1d693ec3ed897b88f86b1841fbc37227406da"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:391aea047bba928006114282f175bc8d09c53fe1b7d8920bf888325e229302fe"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4330c022024e7994b630199cdae909123e4b0e9cf15335de71b146c0f6a2435"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01277a7e183c59081368e4efbde2b8f577014431b257959ca98d3a4e8682dd51"}, - {file = "pymongo-4.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d30d5d7963453b478016bf7b0d87d7089ca24d93dbdecfbc9aa32f1b4772160a"}, - {file = "pymongo-4.6.3-cp312-cp312-win32.whl", hash = "sha256:a023804a3ac0f85d4510265b60978522368b5815772262e61e3a2222a8b315c9"}, - {file = "pymongo-4.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2a6ae9a600bbc2dbff719c98bf5da584fb8a4f2bb23729a09be2e9c3dbc61c8a"}, - {file = "pymongo-4.6.3-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:3b909e5b1864de01510079b39bbdc480720c37747be5552b354bc73f02c24a3c"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:48c60bd32ec141c0d45d8471179430003d9fb4490da181b8165fb1dce9cc255c"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:36d7049fc183fe4edda3eae7f66ea14c660921429e082fe90b4b7f4dc6664a70"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e5c161b18660f1c9d1f78236de45520a436be65e42b7bb51f25f74ad22bdde"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:e458e6fc2b7dd40d15cda04898bd2d8c9ff7ae086c516bc261628d54eb4e3158"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:e420e74c6db4594a6d09f39b58c0772679006cb0b4fc40901ba608794d87dad2"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9c9340c7161e112e36ebb97fbba1cdbe7db3dfacb694d2918b1f155a01f3d859"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:26d036e0f5de09d0b21d0fc30314fcf2ae6359e4d43ae109aa6cf27b4ce02d30"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cf28d9c90e40d4e385b858e4095739829f466f23e08674085161d86bb4bb10"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9066dff9dc0a182478ca5885d0b8a2b820b462e19459ada109df7a3ced31b272"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1e1586ebdebe0447a24842480defac17c496430a218486c96e2da3f164c0f05"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3853fb66bf34ce1b6e573e1bbb3cb28763be9d1f57758535757faf1ab2f24a"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:462684a6f5ce6f2661c30eab4d1d459231e0eed280f338e716e31a24fc09ccb3"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a4ea44e5a913bdb7c9abd34c69e9fcfac10dfaf49765463e0dc1ea922dd2a9d"}, - {file = "pymongo-4.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:098d420a8214ad25f872de7e8b309441995d12ece0376218a04d9ed5d2222cf3"}, - {file = "pymongo-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:7330245253fbe2e09845069d2f4d35dd27f63e377034c94cb0ddac18bc8b0d82"}, - {file = "pymongo-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:151361c101600a85cb1c1e0db4e4b28318b521fcafa9b62d389f7342faaaee80"}, - {file = "pymongo-4.6.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4d167d546352869125dc86f6fda6dffc627d8a9c8963eaee665825f2520d542b"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:eaf3d594ebfd5e1f3503d81e06a5d78e33cda27418b36c2491c3d4ad4fca5972"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ee79e02a7c5ed34706ecb5dad19e6c7d267cf86d28c075ef3127c58f3081279"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af5c5112db04cf62a5d9d224a24f289aaecb47d152c08a457cca81cee061d5bd"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:6b5aec78aa4840e8d6c3881900259892ab5733a366696ca10d99d68c3d73eaaf"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:9757602fb45c8ecc1883fe6db7c59c19d87eb3c645ec9342d28a6026837da931"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:dde9fb6e105ce054339256a8b7a9775212ebb29596ef4e402d7bbc63b354d202"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:7df8b166d3db6cfead4cf55b481408d8f0935d8bd8d6dbf64507c49ef82c7200"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53451190b8628e1ce7d1fe105dc376c3f10705127bd3b51fe3e107b9ff1851e6"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75107a386d4ccf5291e75cce8ca3898430e7907f4cc1208a17c9efad33a1ea84"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a0660ce32d8459b7f12dc3ca0141528fead62d3cce31b548f96f30902074cc0"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa310096450e9c461b7dfd66cbc1c41771fe36c06200440bb3e062b1d4a06b6e"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f465cca9b178e7bb782f952dd58e9e92f8ba056e585959465f2bb50feddef5f"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c67c19f653053ef2ebd7f1837c2978400058d6d7f66ec5760373a21eaf660158"}, - {file = "pymongo-4.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c701de8e483fb5e53874aab642235361aac6de698146b02c644389eaa8c137b6"}, - {file = "pymongo-4.6.3-cp38-cp38-win32.whl", hash = "sha256:90525454546536544307e6da9c81f331a71a1b144e2d038fec587cc9f9250285"}, - {file = "pymongo-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:3e1ba5a037c526a3f4060c28f8d45d71ed9626e2bf954b0cd9a8dcc3b45172ee"}, - {file = "pymongo-4.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14a82593528cddc93cfea5ee78fac95ae763a3a4e124ca79ee0b24fbbc6da1c9"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cd6c15242d9306ff1748681c3235284cbe9f807aeaa86cd17d85e72af626e9a7"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6de33f1b2eed91b802ec7abeb92ffb981d052f3604b45588309aae9e0f6e3c02"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0182899aafe830f25cf96c5976d724efeaaf7b6646c15424ad8dd25422b2efe1"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:8d0ea740a2faa56f930dc82c5976d96c017ece26b29a1cddafb58721c7aab960"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:5c8a4982f5eb767c6fbfb8fb378683d09bcab7c3251ba64357eef600d43f6c23"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:becfa816545a48c8e740ac2fd624c1c121e1362072d68ffcf37a6b1be8ea187e"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ff7d1f449fcad23d9bc8e8dc2b9972be38bcd76d99ea5f7d29b2efa929c2a7ff"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e097f877de4d6af13a33ef938bf2a2350f424be5deabf8b857da95f5b080487a"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:705a9bfd619301ee7e985d6f91f68b15dfcb2f6f36b8cc225cc82d4260d2bce5"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ef1b4992ee1cb8bb16745e70afa0c02c5360220a7a8bb4775888721f052d0a6"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3d10bdd46cbc35a2109737d36ffbef32e7420569a87904738ad444ccb7ac2c5"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17c1c143ba77d6e21fc8b48e93f0a5ed982a23447434e9ee4fbb6d633402506b"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e51e30d67b468a2a634ade928b30cb3e420127f148a9aec60de33f39087bdc4"}, - {file = "pymongo-4.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bec8e4e88984be157408f1923d25869e1b575c07711cdbdde596f66931800934"}, - {file = "pymongo-4.6.3-cp39-cp39-win32.whl", hash = "sha256:98877a9c4ad42df8253a12d8d17a3265781d1feb5c91c767bd153f88feb0b670"}, - {file = "pymongo-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:6d5b35da9e16cda630baed790ffc3d0d01029d269523a7cec34d2ec7e6823e75"}, - {file = "pymongo-4.6.3.tar.gz", hash = "sha256:400074090b9a631f120b42c61b222fd743490c133a5d2f99c0208cefcccc964e"}, + {file = "pymongo-4.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8822614975038e0cece47d12e7634a79c2ee590a0ae78ae64c37b9c6610a14c"}, + {file = "pymongo-4.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57b5b485ef89270ed2e603814f43f0fdd9b8ba5d4039124d90878cdc2327000c"}, + {file = "pymongo-4.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e99dac3c7c2cb498937cc1767361851099da38861e921113318c87d71e3d127"}, + {file = "pymongo-4.7.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:253ed8fd6e7f4b2a1caa89e6b287b9e04f42613319ee1e1240c2db2afe1637e7"}, + {file = "pymongo-4.7.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8cee62188127a126f59ea45d3981868a5e35343be4ef4ad8712eaf42be37a00b"}, + {file = "pymongo-4.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31ed8ba3da0366346264604b3a443f5a4232cab5ed45f520bead6184cf0851a1"}, + {file = "pymongo-4.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d043ecc0c7d5591925bbc7abb67caf21c94d6e6e5d442cb49eb5d9d8ee76b"}, + {file = "pymongo-4.7.1-cp310-cp310-win32.whl", hash = "sha256:bfd5c7e5bb87171a5296fa32205adb50b27704a612036ec4395c3cd316fc0e91"}, + {file = "pymongo-4.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:5ae1aeeb405c29885266666dc7115792d647ed68cfdb6ed02e2e211d12f2e1c8"}, + {file = "pymongo-4.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e4a63ba6813a2168ebd35ea5369f6c33f7787525986cd77668b7956acc3d2a38"}, + {file = "pymongo-4.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:811a07bba9d35f1e34159ede632ac71dbc429b372a20004e32d6578af872db1a"}, + {file = "pymongo-4.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d227555be35078b53f506f6b58bd0b0e8fd4513e89e6f29e83a97efab439250"}, + {file = "pymongo-4.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daf35ab13b86aba7cc8c4b019882f1fa8d287a26f586ef5eaf60a5233d3eaa52"}, + {file = "pymongo-4.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa354933a158e57494c98b592f46d5d24d1b109e6ba05a05179cde719d9f7fd3"}, + {file = "pymongo-4.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad360630c221aee7c0841a51851496a3ca6fdea87007098a982c1aa26e34083a"}, + {file = "pymongo-4.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5119c66af8c4197c8757b4b7d98c443e5b127c224ac92fb657dbe2b512ae2713"}, + {file = "pymongo-4.7.1-cp311-cp311-win32.whl", hash = "sha256:11f74dafde63ad2dc30c01f40b4c69d9af157f8ba5224b0c9d4de7158537266f"}, + {file = "pymongo-4.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:ec94d29103317aa920dae59ed385de9604cb0ef840b5b7137b5eaa7a2042580a"}, + {file = "pymongo-4.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8b95e2163b73d03a913efa89b0f7c5012be82efd4e9dbce8aa62010a75a277c"}, + {file = "pymongo-4.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb1a884b1c6aeac5ffeb8ccb696fbc242a7ae1bba36f2328c01f76fab7221b94"}, + {file = "pymongo-4.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ccc8dd4fe9aac18dde27c33a53271c6c90159b74c43fbdab1d33d5efc36c2f5"}, + {file = "pymongo-4.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7247c1dc7d8eed4e24eb1dd92c4c58ebf1e5159500015652552acfdebdeed256"}, + {file = "pymongo-4.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45ac46f0d6bdc2baac34ced60aae27b2083170d77397330eff0ac5689ea29d38"}, + {file = "pymongo-4.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a848249d5b4763497add62f7dd7bd0ce1538129bf42f4cb132a76d24c61bf98d"}, + {file = "pymongo-4.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ff6d56ca1f0cd3687a13ce90a32a8efb3cc3a53728e5ac160c4c30d10385a72"}, + {file = "pymongo-4.7.1-cp312-cp312-win32.whl", hash = "sha256:e175d74c52b6c8414a4b4504a2dd42b0202d101b2eb9508a34c137357683864e"}, + {file = "pymongo-4.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:263c169302df636f9086b584994a51d0adfc8738fe27d7b8e2aacf46fd68b6cb"}, + {file = "pymongo-4.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:337d99f88d32a5f8056d6d2bc365ccf09d09583f3942882c50cf11b459e8fbc0"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30a9d891631d7e847b24f551b1d89ff2033539e7cd8e9af29714b4d0db7abb06"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bf96ece4999b0bbab7169cb2b9c60918b434487009e48be4bd47eeb2aa7b14"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef32a7cfe748c0c72fdad9e51459de5e0c6b16c5288b39f863abfff23503847"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c8f1dd545360ec1b79007a3ba6573af565df6fde49f6dfc53813f3f475a751"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b897b60b2d55c26f3efea0effc11b655db68125c3731274bc3953375e9ccab73"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5a58b6cd7c423ba49db10d8445756062c931ad2246ba0da1e705bf22962fd9e9"}, + {file = "pymongo-4.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ed6b3a0740efe98bb03ccf054578e9788ebcd06d021d548b8217ab2c82e45975"}, + {file = "pymongo-4.7.1-cp37-cp37m-win32.whl", hash = "sha256:85b8dd3756b73993b1e3ab6b1cba826b9e4987a094a5d5b6d37313776458cd94"}, + {file = "pymongo-4.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:297cdc87c4b4168782b571c8643540e9b0ad1d09266b43d2f5954f8632280835"}, + {file = "pymongo-4.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7b10603ba64af08f5af7eb9a69d6b24e3c69d91fdd48c54b95e284686c1c582d"}, + {file = "pymongo-4.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64b69b9cd8a6d23881a80490d575e92918f9afca43096a7d6c1013d6b3e5c75c"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c7e05454cdc5aa4702e03cad0df4205daccd6fd631bbbf0a85bbe598129a6cc"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e0a30a022ac8a9164ee5a4b761e13dbb3d10a21845f7258011e3415151fb645"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13fc201e073644acd77860d9e91ccfc27addf510563e07381cadc9a55ac3a894"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd998e9f0f7694032c1648c7f57fccaa78903df6329b8f8ae20cfa7c4ceca34"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455f9d603ed0990a787773d5718e871300bddf585ce543baf129c9f5ca3adb02"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d804eaf19a65211cc2c8c5db75be685c3f31c64cdab639794f66f13f8e258ba6"}, + {file = "pymongo-4.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a46c08ef0b273c415b1e8933f6739596be264ae700a4927f84e0b84e70fdf0eb"}, + {file = "pymongo-4.7.1-cp38-cp38-win32.whl", hash = "sha256:58989bcb94233233a71645236b972835d4f87a6bb1b7e818d38a7e6e6d4630de"}, + {file = "pymongo-4.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:d63f38454a2e23c117d3ceab3b661568f2418536825787256ad24e5baaedfd27"}, + {file = "pymongo-4.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d50969de00d3522b2c394f7e59b843871e2be4b525af92066da7f3bd02799fdc"}, + {file = "pymongo-4.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2a720e787c9b9b912db5bb4c3e7123ccff1352d6c3ac0cb2c7ee392cdc95c00"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c808098f2cdb87d4035144e536ba5fa7709d0420c17b68e6ace5da18c38ded5f"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1829a7db720ff586aaf59c806e89e0a388548063aa844d21a570a231ad8ca87"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:615c7573d7a9c4837332a673fdc5a5f214b474dd52d846bcf4cc3d011550bee1"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e935712b17e7a42831022353bac91a346a792658a54e12bec907ec11695cc899"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc32217c81d87750401fa1c2bc9450e854b23e6e30243c82d3514b8e58f39e3"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bc87db2e9563295c4e45602ab978a2fcbaba3ab89e745503b24f895cddeb755"}, + {file = "pymongo-4.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:65c45682d5ed8c6618bde22cd6716b47a197f4ef800a025213b28d13a59e5fca"}, + {file = "pymongo-4.7.1-cp39-cp39-win32.whl", hash = "sha256:67cbee427c263a4483e3249fef480788ccc16edb1a4fc330c4c6cb0cb9db94a8"}, + {file = "pymongo-4.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:1bd1eef70c1eda838b26397ef75c9580d7a97fd94b6324971d7f3d2ad3552e9a"}, + {file = "pymongo-4.7.1.tar.gz", hash = "sha256:811c41c6227b7548afcb53e1b996c25262d837b5e5f519e2ddc2c7e59d8728a5"}, ] [package.dependencies] dnspython = ">=1.16.0,<3.0.0" [package.extras] -aws = ["pymongo-auth-aws (<2.0.0)"] -encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] @@ -728,13 +705,13 @@ zstd = ["zstandard"] [[package]] name = "pyright" -version = "1.1.359" +version = "1.1.361" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.359-py3-none-any.whl", hash = "sha256:5582777be7eab73512277ac7da7b41e15bc0737f488629cb9babd96e0769be61"}, - {file = "pyright-1.1.359.tar.gz", hash = "sha256:f0eab50f3dafce8a7302caeafd6a733f39901a2bf5170bb23d77fd607c8a8dbc"}, + {file = "pyright-1.1.361-py3-none-any.whl", hash = "sha256:c50fc94ce92b5c958cfccbbe34142e7411d474da43d6c14a958667e35b9df7ea"}, + {file = "pyright-1.1.361.tar.gz", hash = "sha256:1d67933315666b05d230c85ea8fb97aaa2056e4092a13df87b7765bb9e8f1a8d"}, ] [package.dependencies] @@ -839,47 +816,48 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rich-click" -version = "1.7.4" +version = "1.8.0" description = "Format click help output nicely with rich" optional = false python-versions = ">=3.7" files = [ - {file = "rich-click-1.7.4.tar.gz", hash = "sha256:7ce5de8e4dc0333aec946113529b3eeb349f2e5d2fafee96b9edf8ee36a01395"}, - {file = "rich_click-1.7.4-py3-none-any.whl", hash = "sha256:e363655475c60fec5a3e16a1eb618118ed79e666c365a36006b107c17c93ac4e"}, + {file = "rich_click-1.8.0-py3-none-any.whl", hash = "sha256:846f504eb83a948d864888b2d73c71e52c310490c2babceac57e388aead086e2"}, + {file = "rich_click-1.8.0.tar.gz", hash = "sha256:f8cad0d67d286d6cd6fc9f69f2d6f25c6c4c2d99fb9d6cb3b8987b593dbe6fa8"}, ] [package.dependencies] click = ">=7" -rich = ">=10.7.0" +rich = ">=10.7" typing-extensions = "*" [package.extras] -dev = ["flake8", "flake8-docstrings", "mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "types-setuptools"] +dev = ["mypy", "packaging", "pre-commit", "pytest", "pytest-cov", "rich-codex", "ruff", "types-setuptools"] +docs = ["markdown-include", "mkdocs", "mkdocs-glightbox", "mkdocs-material-extensions", "mkdocs-material[imaging] (>=9.5.18,<9.6.0)", "mkdocs-rss-plugin", "mkdocstrings[python]", "rich-codex"] [[package]] name = "ruff" -version = "0.4.0" +version = "0.4.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:70b8c620cf2212744eabd6d69c4f839f2be0d8880d27beaeb0adb6aa0b316aa8"}, - {file = "ruff-0.4.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfa3e3ff53be05a8c5570c1585ea1e089f6b399ca99fcb78598d4a8234f248db"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5616cca501d1d16b932b7e607d7e1fd1b8c8c51d6ee484b7940fc1adc5bea541"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46eff08dd480b5d9b540846159fe134d70e3c45a3c913c600047cbf7f0e4e308"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d546f511431fff2b17adcf7110f3b2c2c0c8d33b0e10e5fd27fd340bc617efc"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c7b6b6b38e216036284c5779b6aa14acbf5664e3b5872533219cf93daf40ddfb"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e1cf8b064bb2a6b4922af7274fe2dffcb552d96ba716b2fbe5e2c970ed7de18"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9911c9046b94253e1fa844c0192bb764b86866a881502dee324686474d498c17"}, - {file = "ruff-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ca7a971c8f1a0b6f5ff4a819c0d1c2619536530bbd5a289af725d8b2ef1013d"}, - {file = "ruff-0.4.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:752e0f77f421141dd470a0b1bed4fd8f763aebabe32c80ed3580f740ef4ba807"}, - {file = "ruff-0.4.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:84f2a5dd8f33964d826c5377e094f7ce11e55e432cd42d3bf64efe4384224a03"}, - {file = "ruff-0.4.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0b20e7db4a672495320a8a18149b7febf4e4f97509a4657367144569ce0915fd"}, - {file = "ruff-0.4.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0b0eddd339e24dc4f7719b1cde4967f6b6bc0ad948cc183711ba8910f14aeafe"}, - {file = "ruff-0.4.0-py3-none-win32.whl", hash = "sha256:e70befd488271a2c28c80bd427f73d8855dd222fc549fa1e9967d287c5cfe781"}, - {file = "ruff-0.4.0-py3-none-win_amd64.whl", hash = "sha256:8584b9361900997ccf8d7aaa4dc4ab43e258a853ca7189d98ac929dc9ee50875"}, - {file = "ruff-0.4.0-py3-none-win_arm64.whl", hash = "sha256:fea4ec813c965e40af29ee627a1579ee1d827d77e81d54b85bdd7b42d1540cdd"}, - {file = "ruff-0.4.0.tar.gz", hash = "sha256:7457308d9ebf00d6a1c9a26aa755e477787a636c90b823f91cd7d4bea9e89260"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, + {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, + {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, + {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, + {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] [[package]] @@ -961,13 +939,13 @@ files = [ [[package]] name = "uvicorn" -version = "0.28.1" +version = "0.29.0" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.28.1-py3-none-any.whl", hash = "sha256:5162f6d652f545be91b1feeaee8180774af143965ca9dc8a47ff1dc6bafa4ad5"}, - {file = "uvicorn-0.28.1.tar.gz", hash = "sha256:08103e79d546b6cf20f67c7e5e434d2cf500a6e29b28773e407250c54fc4fa3c"}, + {file = "uvicorn-0.29.0-py3-none-any.whl", hash = "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de"}, + {file = "uvicorn-0.29.0.tar.gz", hash = "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0"}, ] [package.dependencies] @@ -1127,4 +1105,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f353e5995c01672b394c9baf4781bb86ee28184f6bfeca2b5afb1346116051f9" +content-hash = "a235e030a5f5a1db51d17f8a8d18b9c645b00e75b19dc37e03deaad488c8f1c7" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 5ed10d5..1e441ce 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,16 +1,11 @@ [tool.poetry] -name = "jtools" -version = "3.12.0" -description = "探索未知" -authors = ["yezi "] -license = "MIT" -readme = "README.md" +package-mode = false [tool.poetry.dependencies] python = "^3.8" motor = "^3.4.0" sspeedup = {version = "^0.25.0", extras = ["logging", "config", "api-litestar"]} -uvicorn = "^0.28.0" +uvicorn = "^0.29.0" httptools = "^0.6.0" uvloop = "^0.19.0" jkit = "^3.0.0a16" @@ -20,10 +15,6 @@ ruff = "^0.4.0" pyright = "^1.1.0" watchfiles = "^0.21.0" -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - [tool.ruff] target-version = "py38" diff --git a/backend/requirements-dev.txt b/backend/requirements-dev.txt index 6d163d0..66beeb6 100644 --- a/backend/requirements-dev.txt +++ b/backend/requirements-dev.txt @@ -4,7 +4,7 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" -faker==24.11.0 ; python_version >= "3.8" and python_version < "4.0" +faker==25.0.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -26,19 +26,19 @@ multidict==6.0.5 ; python_version >= "3.8" and python_version < "4.0" nodeenv==1.8.0 ; python_version >= "3.8" and python_version < "4.0" polyfactory==2.15.0 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" -pyright==1.1.359 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.1 ; python_version >= "3.8" and python_version < "4.0" +pyright==1.1.361 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -rich-click==1.7.4 ; python_version >= "3.8" and python_version < "4.0" +rich-click==1.8.0 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" -ruff==0.4.0 ; python_version >= "3.8" and python_version < "4.0" +ruff==0.4.2 ; python_version >= "3.8" and python_version < "4.0" setuptools==69.5.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sspeedup[api-litestar,config,logging]==0.25.1 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.29.0 ; python_version >= "3.8" and python_version < "4.0" uvloop==0.19.0 ; python_version >= "3.8" and python_version < "4.0" watchfiles==0.21.0 ; python_version >= "3.8" and python_version < "4.0" zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" diff --git a/backend/requirements.txt b/backend/requirements.txt index c8d921e..b8d35f9 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -4,7 +4,7 @@ click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" dnspython==2.6.1 ; python_version >= "3.8" and python_version < "4.0" exceptiongroup==1.2.1 ; python_version >= "3.8" and python_version < "3.11" -faker==24.11.0 ; python_version >= "3.8" and python_version < "4.0" +faker==25.0.0 ; python_version >= "3.8" and python_version < "4.0" h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0" h2==4.1.0 ; python_version >= "3.8" and python_version < "4.0" hpack==4.0.0 ; python_version >= "3.8" and python_version < "4.0" @@ -25,15 +25,15 @@ msgspec==0.18.6 ; python_version >= "3.8" and python_version < "4.0" multidict==6.0.5 ; python_version >= "3.8" and python_version < "4.0" polyfactory==2.15.0 ; python_version >= "3.8" and python_version < "4.0" pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" -pymongo==4.6.3 ; python_version >= "3.8" and python_version < "4.0" +pymongo==4.7.1 ; python_version >= "3.8" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" -rich-click==1.7.4 ; python_version >= "3.8" and python_version < "4.0" +rich-click==1.8.0 ; python_version >= "3.8" and python_version < "4.0" rich==13.7.1 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.8" and python_version < "4.0" sspeedup[api-litestar,config,logging]==0.25.1 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.11.0 ; python_version >= "3.8" and python_version < "4.0" -uvicorn==0.28.1 ; python_version >= "3.8" and python_version < "4.0" +uvicorn==0.29.0 ; python_version >= "3.8" and python_version < "4.0" uvloop==0.19.0 ; python_version >= "3.8" and python_version < "4.0" zipp==3.18.1 ; python_version >= "3.8" and python_version < "3.10" diff --git a/biome.json b/biome.json index 4eb9cf2..ac3dc7d 100644 --- a/biome.json +++ b/biome.json @@ -1,4 +1,4 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "$schema": "https://biomejs.dev/schemas/1.7.2/schema.json", "extends": ["frontend/biome.json"] } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d69ba64..40556c6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,28 +7,24 @@ networks: services: frontend: - image: jtools-frontend:3.12.0 + image: jtools-frontend:3.13.0 container_name: jtools-frontend build: dockerfile: Dockerfile.frontend ports: - 8602:8602 - volumes: - - ./Caddyfile:/etc/caddy/Caddyfile:ro networks: - internal deploy: resources: limits: - cpus: "0.50" - memory: 48M + memory: 32M restart_policy: condition: on-failure delay: 5s max_attempts: 3 - stop_grace_period: 5s backend: - image: jtools-backend:3.12.0 + image: jtools-backend:3.13.0 container_name: jtools-backend build: dockerfile: Dockerfile.backend @@ -43,10 +39,8 @@ services: deploy: resources: limits: - cpus: "1.00" - memory: 96M + memory: 128M restart_policy: condition: on-failure delay: 5s max_attempts: 3 - stop_grace_period: 5s diff --git a/frontend/biome.json b/frontend/biome.json index 289f682..4c2c22b 100644 --- a/frontend/biome.json +++ b/frontend/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", + "$schema": "https://biomejs.dev/schemas/1.7.2/schema.json", "linter": { "rules": { "style": { @@ -10,6 +10,9 @@ }, "suspicious": { "noExplicitAny": "off" + }, + "correctness": { + "useExhaustiveDependencies": "off" } } }, diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 871a6a9..6170897 100644 Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ diff --git a/frontend/package.json b/frontend/package.json index 3e6e62c..775bf50 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "jtools", "private": true, - "version": "3.12.0", + "version": "3.13.0", "type": "module", "scripts": { "dev": "vite", @@ -14,33 +14,28 @@ "biome-ci": "biome ci ." }, "dependencies": { - "@mantine/hooks": "^7.3.2", + "@mantine/hooks": "^7.3.0", "@preact/preset-vite": "^2.7.0", - "@preact/signals": "^1.2.2", - "@sscreator/ui": "^0.26.0", - "@unocss/preset-rem-to-px": "^0.58.6", - "@unocss/reset": "^0.58.6", + "@preact/signals": "^1.2.0", + "@sscreator/ui": "^0.27.0", + "@unocss/reset": "^0.58.0", "clsx": "^2.1.0", - "dayjs": "^1.11.10", + "dayjs": "^1.11.0", "echarts": "^5.5.0", "echarts-wordcloud": "^2.1.0", - "preact": "^10.19.3", - "react-hot-toast": "^2.4.1", - "react-qr-code": "^2.0.12", - "resize-observer": "^1.0.4", - "swr": "^2.2.4", - "unocss": "^0.58.6", - "vite": "^5.0.10", - "vite-plugin-compression": "^0.5.1", - "vite-plugin-pwa": "^0.17.4", - "workbox-window": "^7.0.0", - "wouter-preact": "^2.12.2" + "preact": "^10.21.0", + "react-hot-toast": "^2.4.0", + "react-qr-code": "^2.0.0", + "resize-observer": "^1.0.0", + "swr": "^2.2.0", + "unocss": "^0.58.0", + "vite": "^5.0.0", + "vite-plugin-compression": "^0.5.0", + "vite-plugin-pwa": "^0.20.0", + "wouter-preact": "^3.1.0" }, "devDependencies": { - "@biomejs/biome": "^1.5.3", + "@biomejs/biome": "^1.5.0", "rollup-plugin-visualizer": "^5.12.0" - }, - "overrides": { - "@rollup/plugin-node-resolve": "^15.2.3" } } diff --git a/frontend/src/api/JPEPFTNMacket.ts b/frontend/src/api/JPEPFTNMacket.ts new file mode 100644 index 0000000..e518fd7 --- /dev/null +++ b/frontend/src/api/JPEPFTNMacket.ts @@ -0,0 +1,109 @@ +import { useData } from "../hooks/useData"; + +interface GetRulesResponse { + isOpen: boolean; + buyOrderMinimumPrice: number; + sellOrderMinimumPrice: number; + FTNOrderFee: number; + goodsOrderFee: number; +} +export function useRules() { + return useData, GetRulesResponse>({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/rules", + }); +} + +interface GetCurrentPriceResponse { + buyPrice: number; + sellPrice: number; +} +export function useCurrentPrice() { + return useData, GetCurrentPriceResponse>({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/current-price", + }); +} + +interface GetCurrentAmountResponse { + buyAmount: number; + sellAmount: number; +} +export function useCurrentAmount() { + return useData, GetCurrentAmountResponse>({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/current-amount", + }); +} + +interface GetCurrentAmountDistributionRequest { + type: "buy" | "sell"; + limit?: number; +} +interface GetCurrentAmountDistributionResponse { + amountDistribution: Record; +} +export function useCurrentAmountDistribution({ + type, + limit, +}: GetCurrentAmountDistributionRequest) { + return useData< + GetCurrentAmountDistributionRequest, + GetCurrentAmountDistributionResponse + >({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/current-amount-distribution", + queryArgs: { + type, + limit, + }, + }); +} + +interface GetPriceHistoryRequest { + type: "buy" | "sell"; + range: "24h" | "7d" | "15d" | "30d"; + resolution: "5m" | "1h" | "1d"; +} +interface GetPriceHistoryResponse { + history: Record; +} +export function usePriceHistory({ + type, + range, + resolution, +}: GetPriceHistoryRequest) { + return useData({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/price-history", + queryArgs: { + type, + range, + resolution, + }, + }); +} + +interface GetAmountHistoryRequest { + type: "buy" | "sell"; + range: "24h" | "7d" | "15d" | "30d"; + resolution: "5m" | "1h" | "1d"; +} +interface GetAmountHistoryResponse { + history: Record; +} +export function useAmountHistory({ + type, + range, + resolution, +}: GetAmountHistoryRequest) { + return useData({ + method: "GET", + endpoint: "/v1/jpep/ftn-macket/amount-history", + queryArgs: { + type, + range, + resolution, + }, + }); +} diff --git a/frontend/src/api/articles.ts b/frontend/src/api/articles.ts new file mode 100644 index 0000000..c0ba08b --- /dev/null +++ b/frontend/src/api/articles.ts @@ -0,0 +1,25 @@ +import { useDataTrigger } from "../hooks/useData"; + +export interface GetWordFreqResponse { + title: string; + wordFreq: Record; +} +export function useWordFreq({ articleSlug }: { articleSlug: string }) { + return useDataTrigger, GetWordFreqResponse>({ + method: "GET", + endpoint: `/v1/articles/${articleSlug}/word-freq`, + }); +} + +export interface GetLPRecommendCheckResponse { + articleTitle: string; + canRecommendNow: boolean; + FPReward: number; + nextCanRecommendDate: number; +} +export function useLPRecommendCheck({ articleSlug }: { articleSlug: string }) { + return useDataTrigger, GetLPRecommendCheckResponse>({ + method: "GET", + endpoint: `/v1/articles/${articleSlug}/lp-recommend-check`, + }); +} diff --git a/frontend/src/api/lottery.ts b/frontend/src/api/lottery.ts new file mode 100644 index 0000000..996cc6f --- /dev/null +++ b/frontend/src/api/lottery.ts @@ -0,0 +1,86 @@ +import { useData } from "../hooks/useData"; + +interface GetRewardsResponse { + rewards: string[]; +} +export function useRewards() { + return useData, GetRewardsResponse>({ + method: "GET", + endpoint: "/v1/lottery/rewards", + }); +} + +interface GetRecordsRequest { + offset?: number; + limit?: number; + excluded_awards?: string[]; +} +interface GetRecordsItem { + time: number; + rewardName: string; + userName: string; + userUrl: string; +} +interface GetRecordsResponse { + records: GetRecordsItem[]; +} +export function useRecords({ + offset, + limit, + excluded_awards, +}: GetRecordsRequest) { + return useData({ + method: "GET", + endpoint: "/v1/lottery/records", + queryArgs: { + offset, + limit, + excluded_awards, + }, + }); +} + +interface GetSummaryRequest { + range: "1d" | "7d" | "30d" | "all"; +} +interface GetSummaryRewardItem { + rewardName: string; + winsCount: number; + winnersCount: number; + averageWinsCountPerWinner: number; + winningRate: number; + rarity: number; +} +export interface GetSummaryResponse { + rewards: GetSummaryRewardItem[]; +} +export function useSummary({ range }: GetSummaryRequest) { + return useData({ + method: "GET", + endpoint: "/v1/lottery/summary", + queryArgs: { + range, + }, + }); +} + +interface GetRewardWinsHistoryRequest { + range: "1d" | "30d" | "60d"; + resolution: "1h" | "1d"; +} +interface GetRewardWinsHistoryResponse { + history: Record; +} +export function useRewardWinsHistory({ + range, + resolution, +}: GetRewardWinsHistoryRequest) { + return useData({ + method: "GET", + endpoint: "/v1/lottery/reward-wins-history", + queryArgs: { + range, + resolution, + }, + }); +} diff --git a/frontend/src/models/responseStruct.ts b/frontend/src/api/responseStruct.ts similarity index 100% rename from frontend/src/models/responseStruct.ts rename to frontend/src/api/responseStruct.ts diff --git a/frontend/src/api/status.ts b/frontend/src/api/status.ts new file mode 100644 index 0000000..c00cf74 --- /dev/null +++ b/frontend/src/api/status.ts @@ -0,0 +1,28 @@ +import { useData } from "../hooks/useData"; + +interface GetResponse { + version: string; + downgradedTools: string[]; + unavaliableTools: string[]; +} +export function useStatus() { + return useData, GetResponse>({ + method: "GET", + endpoint: "/v1/status", + }); +} + +interface GetToolStatusResponse { + status: "NORMAL" | "UNAVAILABLE" | "DOWNGRADED"; + reason: string | null; + lastUpdateTime: number | null; + dataUpdateFreq: string | null; + dataCount: number | null; + dataSource: Record | null; +} +export function useToolStatus({ toolSlug }: { toolSlug: string }) { + return useData, GetToolStatusResponse>({ + method: "GET", + endpoint: `/v1/status/${toolSlug}`, + }); +} diff --git a/frontend/src/api/users.ts b/frontend/src/api/users.ts new file mode 100644 index 0000000..d43c8bc --- /dev/null +++ b/frontend/src/api/users.ts @@ -0,0 +1,153 @@ +import { useDataTrigger, useDataTriggerInfinite } from "../hooks/useData"; + +export interface GetVIPInfoResponse { + userName: string; + isVIP: boolean; + type: "铜牌" | "银牌" | "金牌" | "白金"; + expireDate: number; +} +export function useVIPInfo({ userSlug }: { userSlug: string }) { + return useDataTrigger, GetVIPInfoResponse>({ + method: "GET", + endpoint: `/v1/users/${userSlug}/vip-info`, + }); +} + +interface GetLotteryWinRecordsRequest { + offset?: number; + limit?: number; + excluded_awards?: string[]; +} +interface GetLotteryWinRecordItem { + time: number; + rewardName: string; +} +export interface GetLotteryWinRecordsResponse { + records: GetLotteryWinRecordItem[]; +} +export function useLotteryWinRecords({ + userSlug, + limit, + excluded_awards, +}: { userSlug: string } & GetLotteryWinRecordsRequest) { + return useDataTriggerInfinite< + GetLotteryWinRecordsRequest, + GetLotteryWinRecordsResponse + >(({ currentPage, previousPageData }) => + previousPageData && !previousPageData.records.length + ? null + : { + method: "GET", + endpoint: `/v1/users/${userSlug}/lottery-win-records`, + queryArgs: { + offset: currentPage * 20, + limit, + excluded_awards, + }, + }, + ); +} + +interface GetOnArticleRankRecordsRequest { + order_by?: "date" | "ranking"; + order_direction?: "asc" | "desc"; + offset?: number; + limit?: number; +} +interface GetOnArticleRankRecordItem { + date: number; + ranking: number; + articleTitle: string; + articleUrl: string; + FPReward: number; +} +export interface GetOnArticleRankRecordsResponse { + records: GetOnArticleRankRecordItem[]; +} +export function useOnArticleRankRecords({ + userSlug, + userName, + order_by, + order_direction, + limit, +}: { userSlug?: string; userName?: string } & GetOnArticleRankRecordsRequest) { + return useDataTriggerInfinite< + GetOnArticleRankRecordsRequest, + GetOnArticleRankRecordsResponse + >(({ currentPage, previousPageData }) => + previousPageData && !previousPageData.records.length + ? null + : { + method: "GET", + endpoint: userSlug + ? `/v1/users/${userSlug}/on-article-rank-records` + : `/v1/users/name/${userName}/on-article-rank-records`, + queryArgs: { + order_by, + order_direction, + offset: currentPage * 20, + limit, + }, + }, + ); +} + +export interface GetOnArticleRankSummaryResponse { + top10: number; + top30: number; + top50: number; + total: number; +} +export function useOnArticleRankSummary({ + userSlug, + userName, +}: { userSlug?: string; userName?: string }) { + return useDataTrigger, GetOnArticleRankSummaryResponse>( + { + method: "GET", + endpoint: userSlug + ? `/v1/users/${userSlug}/on-article-rank-summary` + : `/v1/users/name/${userName}/on-article-rank-summary`, + }, + ); +} + +interface GetNameAutocompleteRequest { + name_part: string; + limit?: number; +} +interface GetNameAutocompleteResponse { + names: string[]; +} +export function useNameAutocomplete({ + name_part, + limit, +}: GetNameAutocompleteRequest) { + return useDataTrigger< + GetNameAutocompleteRequest, + GetNameAutocompleteResponse + >({ + method: "GET", + endpoint: "/v1/users/name-autocomplete", + queryArgs: { + name_part, + limit, + }, + }); +} + +export interface GetHistoryNamesOnArticleRankSummaryResponse { + historyNamesOnrankSummary: Record; + userUrl: string; +} +export function useHistoryNamesOnArticleRankSummary({ + userName, +}: { userName: string }) { + return useDataTrigger< + Record, + GetHistoryNamesOnArticleRankSummaryResponse + >({ + method: "GET", + endpoint: `/v1/users/name/${userName}/history-names-on-article-rank-summary`, + }); +} diff --git a/frontend/src/components/FooterBlock.tsx b/frontend/src/components/FooterBlock.tsx index 44a4589..6f01c42 100644 --- a/frontend/src/components/FooterBlock.tsx +++ b/frontend/src/components/FooterBlock.tsx @@ -1,20 +1,14 @@ import { ExternalLink, Footer, InternalLink, Text } from "@sscreator/ui"; import { useLocation } from "wouter-preact"; -import { useData } from "../hooks/useData"; -import type { GetResponse } from "../models/status"; +import { useStatus } from "../api/status"; export default function FooterBlock() { const [, setLocation] = useLocation(); - const { data: toolStatus } = useData, GetResponse>({ - method: "GET", - endpoint: "/v1/status", - }); + const { data: toolStatus } = useStatus(); return (