diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ef30279..54244f2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -38,12 +38,8 @@ jobs: - uses: actions/checkout@v4 - name: Setup Python uses: ./.github/actions/setup-python - - name: Setup Node - uses: ./.github/actions/setup-node - run: uv sync --all-extras --all-packages --all-groups - - run: | - source .venv/bin/activate - pnpm run pyright + - run: uv run basedpyright mypy: runs-on: ubuntu-latest diff --git a/alicebot/adapter/__init__.py b/alicebot/adapter/__init__.py index 11af02e..cb47b85 100644 --- a/alicebot/adapter/__init__.py +++ b/alicebot/adapter/__init__.py @@ -59,7 +59,7 @@ def __init__(self, bot: "Bot") -> None: """ if not hasattr(self, "name"): self.name = self.__class__.__name__ - self.bot: Bot = bot + self.bot = bot self.handle_event = self.bot.handle_event @property diff --git a/alicebot/event.py b/alicebot/event.py index 9d9f298..f65617c 100644 --- a/alicebot/event.py +++ b/alicebot/event.py @@ -3,7 +3,7 @@ 事件类的基类。适配器开发者应实现此事件类基类的子类。 """ -from abc import ABC, abstractmethod +from abc import ABCMeta, abstractmethod from typing import TYPE_CHECKING, Any, Generic, NamedTuple, Optional, Union from typing_extensions import Self, override @@ -14,7 +14,7 @@ __all__ = ["Event", "EventHandleOption", "MessageEvent"] -class Event(ABC, BaseModel, Generic[AdapterT]): +class Event(BaseModel, Generic[AdapterT], metaclass=ABCMeta): """事件类的基类。 Attributes: @@ -51,7 +51,7 @@ class EventHandleOption(NamedTuple): handle_get: bool -class MessageEvent(Event[AdapterT], Generic[AdapterT]): +class MessageEvent(Event[AdapterT], Generic[AdapterT], metaclass=ABCMeta): """通用的消息事件类的基类。""" @abstractmethod diff --git a/alicebot/message.py b/alicebot/message.py index bff77a7..1620019 100644 --- a/alicebot/message.py +++ b/alicebot/message.py @@ -4,18 +4,10 @@ 适配器开发者可以根据需要实现此模块中消息类的子类或定义与此不同的消息类型,但建议若可行的话应尽量使用此模块中消息类的子类。 """ +import builtins from abc import ABC, abstractmethod from collections.abc import ItemsView, Iterator, KeysView, Mapping, ValuesView -from typing import ( # noqa: UP035 - Any, - Generic, - Optional, - SupportsIndex, - Type, - TypeVar, - Union, - overload, -) +from typing import Any, Generic, Optional, SupportsIndex, TypeVar, Union, overload from typing_extensions import Self, override from pydantic import BaseModel, Field, GetCoreSchemaHandler @@ -51,6 +43,7 @@ def __init__(self, *messages: BuildMessageType[MessageSegmentT]) -> None: Args: *messages: 可以被转化为消息的数据。 """ + super().__init__() segment_class = self.get_segment_class() for message in messages: if isinstance(message, list): @@ -315,7 +308,7 @@ def _replace_str(self, old: str, new: str, count: int = -1) -> Self: return temp_msg -class MessageSegment(ABC, BaseModel, Mapping[str, Any], Generic[MessageT]): +class MessageSegment(ABC, BaseModel, Mapping[str, Any], Generic[MessageT]): # pyright: ignore[reportUnsafeMultipleInheritance] """消息字段。 本类实现了所有 `Mapping` 类型的方法,这些方法全部是对 `data` 属性的操作。 @@ -332,7 +325,7 @@ class MessageSegment(ABC, BaseModel, Mapping[str, Any], Generic[MessageT]): @classmethod @abstractmethod - def get_message_class(cls) -> Type[MessageT]: # noqa: UP006 + def get_message_class(cls) -> builtins.type[MessageT]: """获取消息类。 Returns: diff --git a/docs/develop/contributing.md b/docs/develop/contributing.md index 0813a17..4186ad5 100644 --- a/docs/develop/contributing.md +++ b/docs/develop/contributing.md @@ -28,9 +28,9 @@ pnpm install ### 编辑器配置 -虽然并非强制,但建议使用 VSCode 作为编辑器对 AliceBot 项目的代码进行编辑,因为 AliceBot 具有完全的类型注解,VSCode 的 Pylance 插件具有相对较好的静态类型检查效果。 +虽然并非强制,但建议使用 VSCode 作为编辑器对 AliceBot 项目的代码进行编辑,因为 AliceBot 具有完全的类型注解,VSCode 的 BasedPyright 插件具有相对较好的静态类型检查效果。 -如果你使用 VSCode 作为编辑器,需要安装 **Python**、**Pylance** 和 **Ruff** 插件,并进行以下配置: +如果你使用 VSCode 作为编辑器,需要安装 **Python**、**BasedPyright** 和 **Ruff** 插件,并进行以下配置: ```json { @@ -58,7 +58,7 @@ AliceBot 使用 [Ruff](https://docs.astral.sh/ruff/) 作为格式化工具,如 AliceBot 具有完全的类型注解。 -在 [pyproject.toml](https://github.com/AliceBotProject/alicebot/blob/main/pyproject.toml) 文件中已经提供了针对 Pyright (Pylance 背后的类型检查器) 和 MyPy 的配置,请确保你的代码能够通过这种严格程度的类型检查。 +在 [pyproject.toml](https://github.com/AliceBotProject/alicebot/blob/main/pyproject.toml) 文件中已经提供了针对 BasedPyright 和 MyPy 的配置,请确保你的代码能够通过这种严格程度的类型检查。 如果必要,你可以在代码中使用 `# type: ignore` 注释来抑制类型检查,但请注意,请将此作为最后手段,不要轻易使用。 diff --git a/package.json b/package.json index 395279e..d81209a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "docs:serve": "vitepress serve docs", "changelog": "conventional-changelog -p angular -i docs/changelog.md -s -r 0", "markdownlint": "markdownlint-cli2 '{*.md,docs/guide/**/*.md,packages/**/*.md}'", - "pyright": "pyright", "prettier": "prettier -c .", "prettier:fix": "prettier -w .", "eslint": "eslint .", @@ -25,23 +24,22 @@ }, "dependencies": { "@iconify-json/mdi": "^1.2.3", - "unocss": "^66.1.2", + "unocss": "^66.1.3", "vitepress": "^1.6.3", - "vue": "^3.5.14" + "vue": "^3.5.16" }, "devDependencies": { - "@eslint/js": "^9.27.0", - "@types/node": "^22.15.21", - "@unocss/eslint-config": "^66.1.2", + "@eslint/js": "^9.28.0", + "@types/node": "^22.15.29", + "@unocss/eslint-config": "^66.1.3", "conventional-changelog-cli": "^5.0.0", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-vue": "^10.1.0", - "globals": "^16.1.0", + "globals": "^16.2.0", "markdownlint-cli2": "^0.18.1", "prettier": "^3.5.3", - "pyright": "1.1.400", - "typescript-eslint": "^8.32.1", + "typescript-eslint": "^8.33.0", "vue-eslint-parser": "^10.1.3" }, "pnpm": { diff --git a/packages/alicebot-adapter-apscheduler/alicebot/adapter/apscheduler/event.py b/packages/alicebot-adapter-apscheduler/alicebot/adapter/apscheduler/event.py index 6f6a52d..4fa389a 100644 --- a/packages/alicebot-adapter-apscheduler/alicebot/adapter/apscheduler/event.py +++ b/packages/alicebot-adapter-apscheduler/alicebot/adapter/apscheduler/event.py @@ -1,7 +1,7 @@ """APScheduler 适配器事件。""" # pyright: reportMissingTypeStubs = false -from typing import TYPE_CHECKING, Any, Optional, Type, Union # noqa: UP035 +from typing import TYPE_CHECKING, Any, Optional, Union from apscheduler.job import Job from apscheduler.triggers.base import BaseTrigger @@ -9,6 +9,8 @@ from alicebot.event import Event if TYPE_CHECKING: + import builtins + from alicebot.plugin import Plugin from . import APSchedulerAdapter @@ -22,7 +24,7 @@ class APSchedulerEvent(Event["APSchedulerAdapter"]): type: Optional[str] = "apscheduler" if TYPE_CHECKING: - plugin_class: Type[Plugin[Any, Any, Any]] # noqa: UP006 + plugin_class: "builtins.type[Plugin[Any, Any, Any]]" else: plugin_class: Any diff --git a/packages/alicebot-adapter-cqhttp/alicebot/adapter/cqhttp/exceptions.py b/packages/alicebot-adapter-cqhttp/alicebot/adapter/cqhttp/exceptions.py index 91a3e2c..bab82c5 100644 --- a/packages/alicebot-adapter-cqhttp/alicebot/adapter/cqhttp/exceptions.py +++ b/packages/alicebot-adapter-cqhttp/alicebot/adapter/cqhttp/exceptions.py @@ -30,6 +30,7 @@ def __init__(self, resp: dict[str, Any]) -> None: Args: resp: 返回的响应。 """ + super().__init__() self.resp = resp diff --git a/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/event/message.py b/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/event/message.py index 787a296..a0e2ae1 100644 --- a/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/event/message.py +++ b/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/event/message.py @@ -1,6 +1,7 @@ """消息事件。""" # pyright: reportIncompatibleVariableOverride=false +from abc import ABC from typing import TYPE_CHECKING, Any, Literal, Union from typing_extensions import override @@ -14,7 +15,7 @@ from .. import MiraiAdapter # noqa: TID252 -class MiraiBaseMessageEvent(MiraiEvent, BaseMessageEvent["MiraiAdapter"]): +class MiraiBaseMessageEvent(ABC, MiraiEvent, BaseMessageEvent["MiraiAdapter"]): """Mirai 消息事件基类""" messageChain: MiraiMessage diff --git a/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/exceptions.py b/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/exceptions.py index 7ad6f60..60535e5 100644 --- a/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/exceptions.py +++ b/packages/alicebot-adapter-mirai/alicebot/adapter/mirai/exceptions.py @@ -25,6 +25,7 @@ def __init__(self, code: int, resp: dict[str, Any]) -> None: code: 错误代码。 resp: 返回的响应。 """ + super().__init__() self.code = code self.resp = resp diff --git a/packages/alicebot-adapter-onebot/alicebot/adapter/onebot/exceptions.py b/packages/alicebot-adapter-onebot/alicebot/adapter/onebot/exceptions.py index ceea5d2..41d8020 100644 --- a/packages/alicebot-adapter-onebot/alicebot/adapter/onebot/exceptions.py +++ b/packages/alicebot-adapter-onebot/alicebot/adapter/onebot/exceptions.py @@ -24,6 +24,7 @@ def __init__(self, resp: Any) -> None: Args: resp: 返回的响应。 """ + super().__init__() self.resp = resp diff --git a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/api.py b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/api.py index bd7d861..263bbf7 100644 --- a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/api.py +++ b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/api.py @@ -8,6 +8,7 @@ from typing import Any, Optional, TypeVar, Union from .model import ( + AcceptedGiftTypes, BotCommand, BotCommandScope, BotDescription, @@ -23,6 +24,7 @@ ForceReply, ForumTopic, GameHighScore, + Gifts, InlineKeyboardMarkup, InlineQueryResult, InlineQueryResultsButton, @@ -34,7 +36,9 @@ InputMediaVideo, InputPaidMedia, InputPollOption, + InputProfilePhoto, InputSticker, + InputStoryContent, LabeledPrice, LinkPreviewOptions, MaskPosition, @@ -42,17 +46,22 @@ Message, MessageEntity, MessageId, + OwnedGifts, PassportElementError, Poll, + PreparedInlineMessage, ReactionType, ReplyKeyboardMarkup, ReplyKeyboardRemove, ReplyParameters, SentWebAppMessage, ShippingOption, + StarAmount, StarTransactions, Sticker, StickerSet, + Story, + StoryArea, Update, User, UserChatBoosts, @@ -69,12 +78,12 @@ async def call_api( self, api: str, *, - response_type: Optional[type[_T]] = None, + response_type: Union[type[_T], Any, None] = None, **params: Any, ) -> Any: ... -class TelegramAPI(TelegramAPIBase): +class TelegramAPI(TelegramAPIBase, ABC): async def get_updates( self, *, @@ -148,6 +157,7 @@ async def send_message( link_preview_options: Optional[LinkPreviewOptions] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -171,6 +181,7 @@ async def send_message( link_preview_options=link_preview_options, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -183,6 +194,7 @@ async def forward_message( from_chat_id: Union[int, str], message_id: int, message_thread_id: Optional[int] = None, + video_start_timestamp: Optional[int] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, ) -> Message: @@ -192,6 +204,7 @@ async def forward_message( chat_id=chat_id, message_thread_id=message_thread_id, from_chat_id=from_chat_id, + video_start_timestamp=video_start_timestamp, disable_notification=disable_notification, protect_content=protect_content, message_id=message_id, @@ -225,12 +238,14 @@ async def copy_message( from_chat_id: Union[int, str], message_id: int, message_thread_id: Optional[int] = None, + video_start_timestamp: Optional[int] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[list[MessageEntity]] = None, show_caption_above_media: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ Union[ @@ -248,12 +263,14 @@ async def copy_message( message_thread_id=message_thread_id, from_chat_id=from_chat_id, message_id=message_id, + video_start_timestamp=video_start_timestamp, caption=caption, parse_mode=parse_mode, caption_entities=caption_entities, show_caption_above_media=show_caption_above_media, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, reply_parameters=reply_parameters, reply_markup=reply_markup, ) @@ -295,6 +312,7 @@ async def send_photo( has_spoiler: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -320,6 +338,7 @@ async def send_photo( has_spoiler=has_spoiler, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -341,6 +360,7 @@ async def send_audio( thumbnail: Optional[Union[InputFile, str]] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -368,6 +388,7 @@ async def send_audio( thumbnail=thumbnail, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -387,6 +408,7 @@ async def send_document( disable_content_type_detection: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -412,6 +434,7 @@ async def send_document( disable_content_type_detection=disable_content_type_detection, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -428,6 +451,8 @@ async def send_video( width: Optional[int] = None, height: Optional[int] = None, thumbnail: Optional[Union[InputFile, str]] = None, + cover: Optional[Union[InputFile, str]] = None, + start_timestamp: Optional[int] = None, caption: Optional[str] = None, parse_mode: Optional[str] = None, caption_entities: Optional[list[MessageEntity]] = None, @@ -436,6 +461,7 @@ async def send_video( supports_streaming: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -458,6 +484,8 @@ async def send_video( width=width, height=height, thumbnail=thumbnail, + cover=cover, + start_timestamp=start_timestamp, caption=caption, parse_mode=parse_mode, caption_entities=caption_entities, @@ -466,6 +494,7 @@ async def send_video( supports_streaming=supports_streaming, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -489,6 +518,7 @@ async def send_animation( has_spoiler: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -518,6 +548,7 @@ async def send_animation( has_spoiler=has_spoiler, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -536,6 +567,7 @@ async def send_voice( duration: Optional[int] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -560,6 +592,7 @@ async def send_voice( duration=duration, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -577,6 +610,7 @@ async def send_video_note( thumbnail: Optional[Union[InputFile, str]] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -600,6 +634,7 @@ async def send_video_note( thumbnail=thumbnail, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -619,6 +654,7 @@ async def send_paid_media( show_caption_above_media: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ Union[ @@ -643,6 +679,7 @@ async def send_paid_media( show_caption_above_media=show_caption_above_media, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, reply_parameters=reply_parameters, reply_markup=reply_markup, ) @@ -661,6 +698,7 @@ async def send_media_group( message_thread_id: Optional[int] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, ) -> list[Message]: @@ -673,6 +711,7 @@ async def send_media_group( media=media, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, ) @@ -691,6 +730,7 @@ async def send_location( proximity_alert_radius: Optional[int] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -716,6 +756,7 @@ async def send_location( proximity_alert_radius=proximity_alert_radius, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -737,6 +778,7 @@ async def send_venue( google_place_type: Optional[str] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -764,6 +806,7 @@ async def send_venue( google_place_type=google_place_type, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -781,6 +824,7 @@ async def send_contact( vcard: Optional[str] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -804,6 +848,7 @@ async def send_contact( vcard=vcard, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -831,6 +876,7 @@ async def send_poll( is_closed: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -864,6 +910,7 @@ async def send_poll( is_closed=is_closed, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -878,6 +925,7 @@ async def send_dice( emoji: Optional[str] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -898,6 +946,7 @@ async def send_dice( emoji=emoji, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -948,6 +997,21 @@ async def get_user_profile_photos( limit=limit, ) + async def set_user_emoji_status( + self, + *, + user_id: int, + emoji_status_custom_emoji_id: Optional[str] = None, + emoji_status_expiration_date: Optional[int] = None, + ) -> bool: + return await self.call_api( + "setUserEmojiStatus", + response_type=bool, + user_id=user_id, + emoji_status_custom_emoji_id=emoji_status_custom_emoji_id, + emoji_status_expiration_date=emoji_status_expiration_date, + ) + async def get_file(self, *, file_id: str) -> File: return await self.call_api("getFile", response_type=File, file_id=file_id) @@ -1762,6 +1826,327 @@ async def delete_messages( message_ids=message_ids, ) + async def get_available_gifts(self) -> Gifts: + return await self.call_api("getAvailableGifts", response_type=Gifts) + + async def send_gift( + self, + *, + gift_id: str, + user_id: Optional[int] = None, + chat_id: Optional[Union[int, str]] = None, + pay_for_upgrade: Optional[bool] = None, + text: Optional[str] = None, + text_parse_mode: Optional[str] = None, + text_entities: Optional[list[MessageEntity]] = None, + ) -> bool: + return await self.call_api( + "sendGift", + response_type=bool, + user_id=user_id, + chat_id=chat_id, + gift_id=gift_id, + pay_for_upgrade=pay_for_upgrade, + text=text, + text_parse_mode=text_parse_mode, + text_entities=text_entities, + ) + + async def gift_premium_subscription( + self, + *, + user_id: int, + month_count: int, + star_count: int, + text: Optional[str] = None, + text_parse_mode: Optional[str] = None, + text_entities: Optional[list[MessageEntity]] = None, + ) -> bool: + return await self.call_api( + "giftPremiumSubscription", + response_type=bool, + user_id=user_id, + month_count=month_count, + star_count=star_count, + text=text, + text_parse_mode=text_parse_mode, + text_entities=text_entities, + ) + + async def verify_user( + self, *, user_id: int, custom_description: Optional[str] = None + ) -> bool: + return await self.call_api( + "verifyUser", + response_type=bool, + user_id=user_id, + custom_description=custom_description, + ) + + async def verify_chat( + self, *, chat_id: Union[int, str], custom_description: Optional[str] = None + ) -> bool: + return await self.call_api( + "verifyChat", + response_type=bool, + chat_id=chat_id, + custom_description=custom_description, + ) + + async def remove_user_verification(self, *, user_id: int) -> bool: + return await self.call_api( + "removeUserVerification", response_type=bool, user_id=user_id + ) + + async def remove_chat_verification(self, *, chat_id: Union[int, str]) -> bool: + return await self.call_api( + "removeChatVerification", response_type=bool, chat_id=chat_id + ) + + async def read_business_message( + self, *, business_connection_id: str, chat_id: int, message_id: int + ) -> bool: + return await self.call_api( + "readBusinessMessage", + response_type=bool, + business_connection_id=business_connection_id, + chat_id=chat_id, + message_id=message_id, + ) + + async def delete_business_messages( + self, *, business_connection_id: str, message_ids: list[int] + ) -> bool: + return await self.call_api( + "deleteBusinessMessages", + response_type=bool, + business_connection_id=business_connection_id, + message_ids=message_ids, + ) + + async def set_business_account_name( + self, + *, + business_connection_id: str, + first_name: str, + last_name: Optional[str] = None, + ) -> bool: + return await self.call_api( + "setBusinessAccountName", + response_type=bool, + business_connection_id=business_connection_id, + first_name=first_name, + last_name=last_name, + ) + + async def set_business_account_username( + self, *, business_connection_id: str, username: Optional[str] = None + ) -> bool: + return await self.call_api( + "setBusinessAccountUsername", + response_type=bool, + business_connection_id=business_connection_id, + username=username, + ) + + async def set_business_account_bio( + self, *, business_connection_id: str, bio: Optional[str] = None + ) -> bool: + return await self.call_api( + "setBusinessAccountBio", + response_type=bool, + business_connection_id=business_connection_id, + bio=bio, + ) + + async def set_business_account_profile_photo( + self, + *, + business_connection_id: str, + photo: InputProfilePhoto, + is_public: Optional[bool] = None, + ) -> bool: + return await self.call_api( + "setBusinessAccountProfilePhoto", + response_type=bool, + business_connection_id=business_connection_id, + photo=photo, + is_public=is_public, + ) + + async def remove_business_account_profile_photo( + self, *, business_connection_id: str, is_public: Optional[bool] = None + ) -> bool: + return await self.call_api( + "removeBusinessAccountProfilePhoto", + response_type=bool, + business_connection_id=business_connection_id, + is_public=is_public, + ) + + async def set_business_account_gift_settings( + self, + *, + business_connection_id: str, + show_gift_button: bool, + accepted_gift_types: AcceptedGiftTypes, + ) -> bool: + return await self.call_api( + "setBusinessAccountGiftSettings", + response_type=bool, + business_connection_id=business_connection_id, + show_gift_button=show_gift_button, + accepted_gift_types=accepted_gift_types, + ) + + async def get_business_account_star_balance( + self, *, business_connection_id: str + ) -> StarAmount: + return await self.call_api( + "getBusinessAccountStarBalance", + response_type=StarAmount, + business_connection_id=business_connection_id, + ) + + async def transfer_business_account_stars( + self, *, business_connection_id: str, star_count: int + ) -> bool: + return await self.call_api( + "transferBusinessAccountStars", + response_type=bool, + business_connection_id=business_connection_id, + star_count=star_count, + ) + + async def get_business_account_gifts( + self, + *, + business_connection_id: str, + exclude_unsaved: Optional[bool] = None, + exclude_saved: Optional[bool] = None, + exclude_unlimited: Optional[bool] = None, + exclude_limited: Optional[bool] = None, + exclude_unique: Optional[bool] = None, + sort_by_price: Optional[bool] = None, + offset: Optional[str] = None, + limit: Optional[int] = None, + ) -> OwnedGifts: + return await self.call_api( + "getBusinessAccountGifts", + response_type=OwnedGifts, + business_connection_id=business_connection_id, + exclude_unsaved=exclude_unsaved, + exclude_saved=exclude_saved, + exclude_unlimited=exclude_unlimited, + exclude_limited=exclude_limited, + exclude_unique=exclude_unique, + sort_by_price=sort_by_price, + offset=offset, + limit=limit, + ) + + async def convert_gift_to_stars( + self, *, business_connection_id: str, owned_gift_id: str + ) -> bool: + return await self.call_api( + "convertGiftToStars", + response_type=bool, + business_connection_id=business_connection_id, + owned_gift_id=owned_gift_id, + ) + + async def upgrade_gift( + self, + *, + business_connection_id: str, + owned_gift_id: str, + keep_original_details: Optional[bool] = None, + star_count: Optional[int] = None, + ) -> bool: + return await self.call_api( + "upgradeGift", + response_type=bool, + business_connection_id=business_connection_id, + owned_gift_id=owned_gift_id, + keep_original_details=keep_original_details, + star_count=star_count, + ) + + async def transfer_gift( + self, + *, + business_connection_id: str, + owned_gift_id: str, + new_owner_chat_id: int, + star_count: Optional[int] = None, + ) -> bool: + return await self.call_api( + "transferGift", + response_type=bool, + business_connection_id=business_connection_id, + owned_gift_id=owned_gift_id, + new_owner_chat_id=new_owner_chat_id, + star_count=star_count, + ) + + async def post_story( + self, + *, + business_connection_id: str, + content: InputStoryContent, + active_period: int, + caption: Optional[str] = None, + parse_mode: Optional[str] = None, + caption_entities: Optional[list[MessageEntity]] = None, + areas: Optional[list[StoryArea]] = None, + post_to_chat_page: Optional[bool] = None, + protect_content: Optional[bool] = None, + ) -> Story: + return await self.call_api( + "postStory", + response_type=Story, + business_connection_id=business_connection_id, + content=content, + active_period=active_period, + caption=caption, + parse_mode=parse_mode, + caption_entities=caption_entities, + areas=areas, + post_to_chat_page=post_to_chat_page, + protect_content=protect_content, + ) + + async def edit_story( + self, + *, + business_connection_id: str, + story_id: int, + content: InputStoryContent, + caption: Optional[str] = None, + parse_mode: Optional[str] = None, + caption_entities: Optional[list[MessageEntity]] = None, + areas: Optional[list[StoryArea]] = None, + ) -> Story: + return await self.call_api( + "editStory", + response_type=Story, + business_connection_id=business_connection_id, + story_id=story_id, + content=content, + caption=caption, + parse_mode=parse_mode, + caption_entities=caption_entities, + areas=areas, + ) + + async def delete_story(self, *, business_connection_id: str, story_id: int) -> bool: + return await self.call_api( + "deleteStory", + response_type=bool, + business_connection_id=business_connection_id, + story_id=story_id, + ) + async def send_sticker( self, *, @@ -1772,6 +2157,7 @@ async def send_sticker( emoji: Optional[str] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[ @@ -1793,6 +2179,7 @@ async def send_sticker( emoji=emoji, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -1971,6 +2358,27 @@ async def answer_web_app_query( result=result, ) + async def save_prepared_inline_message( + self, + *, + user_id: int, + result: InlineQueryResult, + allow_user_chats: Optional[bool] = None, + allow_bot_chats: Optional[bool] = None, + allow_group_chats: Optional[bool] = None, + allow_channel_chats: Optional[bool] = None, + ) -> PreparedInlineMessage: + return await self.call_api( + "savePreparedInlineMessage", + response_type=PreparedInlineMessage, + user_id=user_id, + result=result, + allow_user_chats=allow_user_chats, + allow_bot_chats=allow_bot_chats, + allow_group_chats=allow_group_chats, + allow_channel_chats=allow_channel_chats, + ) + async def send_invoice( self, *, @@ -1999,6 +2407,7 @@ async def send_invoice( is_flexible: Optional[bool] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[InlineKeyboardMarkup] = None, @@ -2031,6 +2440,7 @@ async def send_invoice( is_flexible=is_flexible, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, @@ -2044,7 +2454,9 @@ async def create_invoice_link( payload: str, currency: str, prices: list[LabeledPrice], + business_connection_id: Optional[str] = None, provider_token: Optional[str] = None, + subscription_period: Optional[int] = None, max_tip_amount: Optional[int] = None, suggested_tip_amounts: Optional[list[int]] = None, provider_data: Optional[str] = None, @@ -2063,12 +2475,14 @@ async def create_invoice_link( return await self.call_api( "createInvoiceLink", response_type=str, + business_connection_id=business_connection_id, title=title, description=description, payload=payload, provider_token=provider_token, currency=currency, prices=prices, + subscription_period=subscription_period, max_tip_amount=max_tip_amount, suggested_tip_amounts=suggested_tip_amounts, provider_data=provider_data, @@ -2137,6 +2551,17 @@ async def refund_star_payment( telegram_payment_charge_id=telegram_payment_charge_id, ) + async def edit_user_star_subscription( + self, *, user_id: int, telegram_payment_charge_id: str, is_canceled: bool + ) -> bool: + return await self.call_api( + "editUserStarSubscription", + response_type=bool, + user_id=user_id, + telegram_payment_charge_id=telegram_payment_charge_id, + is_canceled=is_canceled, + ) + async def set_passport_data_errors( self, *, user_id: int, errors: list[PassportElementError] ) -> bool: @@ -2153,6 +2578,7 @@ async def send_game( message_thread_id: Optional[int] = None, disable_notification: Optional[bool] = None, protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, message_effect_id: Optional[str] = None, reply_parameters: Optional[ReplyParameters] = None, reply_markup: Optional[InlineKeyboardMarkup] = None, @@ -2166,6 +2592,7 @@ async def send_game( game_short_name=game_short_name, disable_notification=disable_notification, protect_content=protect_content, + allow_paid_broadcast=allow_paid_broadcast, message_effect_id=message_effect_id, reply_parameters=reply_parameters, reply_markup=reply_markup, diff --git a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/entity.py b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/entity.py index f891404..7214cec 100644 --- a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/entity.py +++ b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/entity.py @@ -3,6 +3,7 @@ # ruff: noqa: D101, D102 # pylint: disable=missing-class-docstring +from abc import ABC from typing import Optional from typing_extensions import Self @@ -11,7 +12,7 @@ from .model import User -class Entity(MessageSegment[MessageT]): +class Entity(MessageSegment[MessageT], ABC): @classmethod def mention(cls, text: str) -> Self: return cls(type="mention", data={"text": text}) diff --git a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/exceptions.py b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/exceptions.py index 077dcdf..2c5c9c9 100644 --- a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/exceptions.py +++ b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/exceptions.py @@ -24,4 +24,5 @@ def __init__(self, resp: Any) -> None: Args: resp: 返回的响应。 """ + super().__init__() self.resp = resp diff --git a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/media.py b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/media.py index 73248ba..419fce7 100644 --- a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/media.py +++ b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/media.py @@ -29,6 +29,7 @@ class Photo(TelegramMedia): caption: Union[None, str, TelegramMessage] = None show_caption_above_media: Optional[bool] = None has_spoiler: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Audio(TelegramMedia): @@ -38,6 +39,7 @@ class Audio(TelegramMedia): performer: Optional[str] = None title: Optional[str] = None thumbnail: Optional[Union[InputFile, str]] = None + allow_paid_broadcast: Optional[bool] = None class Document(TelegramMedia): @@ -45,6 +47,7 @@ class Document(TelegramMedia): thumbnail: Optional[Union[InputFile, str]] = None caption: Union[None, str, TelegramMessage] = None disable_content_type_detection: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Video(TelegramMedia): @@ -53,10 +56,13 @@ class Video(TelegramMedia): width: Optional[int] = None height: Optional[int] = None thumbnail: Optional[Union[InputFile, str]] = None + cover: Optional[Union[InputFile, str]] = None + start_timestamp: Optional[int] = None caption: Union[None, str, TelegramMessage] = None show_caption_above_media: Optional[bool] = None has_spoiler: Optional[bool] = None supports_streaming: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Animation(TelegramMedia): @@ -68,12 +74,14 @@ class Animation(TelegramMedia): caption: Union[None, str, TelegramMessage] = None show_caption_above_media: Optional[bool] = None has_spoiler: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Voice(TelegramMedia): voice: Union[InputFile, str] caption: Union[None, str, TelegramMessage] = None duration: Optional[int] = None + allow_paid_broadcast: Optional[bool] = None class VideoNote(TelegramMedia): @@ -81,6 +89,7 @@ class VideoNote(TelegramMedia): duration: Optional[int] = None length: Optional[int] = None thumbnail: Optional[Union[InputFile, str]] = None + allow_paid_broadcast: Optional[bool] = None class PaidMedia(TelegramMedia): @@ -89,6 +98,7 @@ class PaidMedia(TelegramMedia): payload: Optional[str] = None caption: Union[None, str, TelegramMessage] = None show_caption_above_media: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class MediaGroup(TelegramMedia): @@ -98,6 +108,7 @@ class MediaGroup(TelegramMedia): list[InputMediaPhoto], list[InputMediaVideo], ] + allow_paid_broadcast: Optional[bool] = None class Location(TelegramMedia): @@ -107,6 +118,7 @@ class Location(TelegramMedia): live_period: Optional[int] = None heading: Optional[int] = None proximity_alert_radius: Optional[int] = None + allow_paid_broadcast: Optional[bool] = None class Venue(TelegramMedia): @@ -118,6 +130,7 @@ class Venue(TelegramMedia): foursquare_type: Optional[str] = None google_place_id: Optional[str] = None google_place_type: Optional[str] = None + allow_paid_broadcast: Optional[bool] = None class Contact(TelegramMedia): @@ -125,6 +138,7 @@ class Contact(TelegramMedia): first_name: str last_name: Optional[str] = None vcard: Optional[str] = None + allow_paid_broadcast: Optional[bool] = None class Poll(TelegramMedia): @@ -138,19 +152,29 @@ class Poll(TelegramMedia): open_period: Optional[int] = None close_date: Optional[int] = None is_closed: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Dice(TelegramMedia): emoji: Optional[str] = None + allow_paid_broadcast: Optional[bool] = None class ChatAction(TelegramMedia): action: str +class Gift(TelegramMedia): + user_id: Optional[int] = None + gift_id: str + pay_for_upgrade: Optional[bool] = None + text: Union[None, str, TelegramMessage] = None + + class Sticker(TelegramMedia): sticker: Union[InputFile, str] emoji: Optional[str] = None + allow_paid_broadcast: Optional[bool] = None class Invoice(TelegramMedia): @@ -175,7 +199,9 @@ class Invoice(TelegramMedia): send_phone_number_to_provider: Optional[bool] = None send_email_to_provider: Optional[bool] = None is_flexible: Optional[bool] = None + allow_paid_broadcast: Optional[bool] = None class Game(TelegramMedia): game_short_name: str + allow_paid_broadcast: Optional[bool] = None diff --git a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/model.py b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/model.py index bc4b336..9c0fcea 100644 --- a/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/model.py +++ b/packages/alicebot-adapter-telegram/alicebot/adapter/telegram/model.py @@ -143,6 +143,8 @@ class Video(BaseModel): height: int duration: int thumbnail: Optional[PhotoSize] = None + cover: Optional[list[PhotoSize]] = None + start_timestamp: Optional[int] = None file_name: Optional[str] = None mime_type: Optional[str] = None file_size: Optional[int] = None @@ -391,6 +393,9 @@ class SuccessfulPayment(BaseModel): currency: str total_amount: int invoice_payload: str + subscription_expiration_date: Optional[int] = None + is_recurring: Optional[bool] = None + is_first_recurring: Optional[bool] = None shipping_option_id: Optional[str] = None order_info: Optional[OrderInfo] = None telegram_payment_charge_id: str @@ -426,6 +431,67 @@ class ChatShared(BaseModel): photo: Optional[list[PhotoSize]] = None +class Gift(BaseModel): + id: str + sticker: Sticker + star_count: int + upgrade_star_count: Optional[int] = None + total_count: Optional[int] = None + remaining_count: Optional[int] = None + + +class GiftInfo(BaseModel): + gift: Gift + owned_gift_id: Optional[str] = None + convert_star_count: Optional[int] = None + prepaid_upgrade_star_count: Optional[int] = None + can_be_upgraded: Optional[bool] = None + text: Optional[str] = None + entities: Optional[list[MessageEntity]] = None + is_private: Optional[bool] = None + + +class UniqueGiftModel(BaseModel): + name: str + sticker: Sticker + rarity_per_mille: int + + +class UniqueGiftSymbol(BaseModel): + name: str + sticker: Sticker + rarity_per_mille: int + + +class UniqueGiftBackdropColors(BaseModel): + center_color: int + edge_color: int + symbol_color: int + text_color: int + + +class UniqueGiftBackdrop(BaseModel): + name: str + colors: UniqueGiftBackdropColors + rarity_per_mille: int + + +class UniqueGift(BaseModel): + base_name: str + name: str + number: int + model: UniqueGiftModel + symbol: UniqueGiftSymbol + backdrop: UniqueGiftBackdrop + + +class UniqueGiftInfo(BaseModel): + gift: UniqueGift + origin: str + owned_gift_id: Optional[str] = None + transfer_star_count: Optional[int] = None + + class WriteAccessAllowed(BaseModel): from_request: Optional[bool] = None web_app_name: Optional[str] = None @@ -573,6 +639,10 @@ class GiveawayCompleted(BaseModel): is_star_giveaway: Optional[bool] = None +class PaidMessagePriceChanged(BaseModel): + paid_message_star_count: int + + class VideoChatScheduled(BaseModel): start_date: int @@ -613,6 +683,10 @@ class SwitchInlineQueryChosenChat(BaseModel): allow_channel_chats: Optional[bool] = None +class CopyTextButton(BaseModel): + text: str + + class CallbackGame(BaseModel): pass @@ -626,6 +700,7 @@ class InlineKeyboardButton(BaseModel): switch_inline_query: Optional[str] = None switch_inline_query_current_chat: Optional[str] = None switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None + copy_text: Optional[CopyTextButton] = None callback_game: Optional[CallbackGame] = None pay: Optional[bool] = None @@ -657,6 +732,7 @@ class Message(BaseModel): is_from_offline: Optional[bool] = None media_group_id: Optional[str] = None author_signature: Optional[str] = None + paid_star_count: Optional[int] = None text: Optional[str] = None entities: Optional[list[MessageEntity]] = None link_preview_options: Optional[LinkPreviewOptions] = None @@ -698,6 +774,8 @@ class Message(BaseModel): refunded_payment: Optional[RefundedPayment] = None users_shared: Optional[UsersShared] = None chat_shared: Optional[ChatShared] = None + gift: Optional[GiftInfo] = None + unique_gift: Optional[UniqueGiftInfo] = None connected_website: Optional[str] = None write_access_allowed: Optional[WriteAccessAllowed] = None passport_data: Optional[PassportData] = None @@ -714,6 +792,7 @@ class Message(BaseModel): giveaway: Optional[Giveaway] = None giveaway_winners: Optional[GiveawayWinners] = None giveaway_completed: Optional[GiveawayCompleted] = None + paid_message_price_changed: Optional[PaidMessagePriceChanged] = None video_chat_scheduled: Optional[VideoChatScheduled] = None video_chat_started: Optional[VideoChatStarted] = None video_chat_ended: Optional[VideoChatEnded] = None @@ -722,12 +801,29 @@ class Message(BaseModel): reply_markup: Optional[InlineKeyboardMarkup] = None +class BusinessBotRights(BaseModel): + can_reply: Optional[bool] = None + can_read_messages: Optional[bool] = None + can_delete_sent_messages: Optional[bool] = None + can_delete_all_messages: Optional[bool] = None + can_edit_name: Optional[bool] = None + can_edit_bio: Optional[bool] = None + can_edit_profile_photo: Optional[bool] = None + can_edit_username: Optional[bool] = None + can_change_gift_settings: Optional[bool] = None + can_view_gifts_and_stars: Optional[bool] = None + can_convert_gifts_to_stars: Optional[bool] = None + can_transfer_and_upgrade_gifts: Optional[bool] = None + can_transfer_stars: Optional[bool] = None + can_manage_stories: Optional[bool] = None + + class BusinessConnection(BaseModel): id: str user: User user_chat_id: int date: int - can_reply: bool + rights: Optional[BusinessBotRights] = None is_enabled: bool @@ -1075,6 +1171,13 @@ class ChatPermissions(BaseModel): can_manage_topics: Optional[bool] = None +class AcceptedGiftTypes(BaseModel): + unlimited_gifts: bool + limited_gifts: bool + unique_gifts: bool + premium_subscription: bool + + class ChatLocation(BaseModel): location: Location address: str @@ -1112,6 +1215,7 @@ class ChatFullInfo(BaseModel): invite_link: Optional[str] = None pinned_message: Optional[Message] = None permissions: Optional[ChatPermissions] = None + accepted_gift_types: AcceptedGiftTypes can_send_paid_media: Optional[bool] = None slow_mode_delay: Optional[int] = None unrestrict_boost_count: Optional[int] = None @@ -1228,6 +1332,67 @@ class ForceReply(BaseModel): selective: Optional[bool] = None +class StoryAreaPosition(BaseModel): + x_percentage: float + y_percentage: float + width_percentage: float + height_percentage: float + rotation_angle: float + corner_radius_percentage: float + + +class LocationAddress(BaseModel): + country_code: str + state: Optional[str] = None + city: Optional[str] = None + street: Optional[str] = None + + +class StoryAreaTypeLocation(BaseModel): + type: str + latitude: float + longitude: float + address: Optional[LocationAddress] = None + + +class StoryAreaTypeSuggestedReaction(BaseModel): + type: str + reaction_type: ReactionType + is_dark: Optional[bool] = None + is_flipped: Optional[bool] = None + + +class StoryAreaTypeLink(BaseModel): + type: str + url: str + + +class StoryAreaTypeWeather(BaseModel): + type: str + temperature: float + emoji: str + background_color: int + + +class StoryAreaTypeUniqueGift(BaseModel): + type: str + name: str + + +StoryAreaType = Union[ + StoryAreaTypeLocation, + StoryAreaTypeSuggestedReaction, + StoryAreaTypeLink, + StoryAreaTypeWeather, + StoryAreaTypeUniqueGift, +] + + +class StoryArea(BaseModel): + position: StoryAreaPosition + type: StoryAreaType + + class ForumTopic(BaseModel): message_thread_id: int name: str @@ -1235,6 +1400,51 @@ class ForumTopic(BaseModel): icon_custom_emoji_id: Optional[str] = None +class Gifts(BaseModel): + gifts: list[Gift] + + +class OwnedGiftRegular(BaseModel): + type: str + gift: Gift + owned_gift_id: Optional[str] = None + sender_user: Optional[User] = None + send_date: int + text: Optional[str] = None + entities: Optional[list[MessageEntity]] = None + is_private: Optional[bool] = None + is_saved: Optional[bool] = None + can_be_upgraded: Optional[bool] = None + was_refunded: Optional[bool] = None + convert_star_count: Optional[int] = None + prepaid_upgrade_star_count: Optional[int] = None + + +class OwnedGiftUnique(BaseModel): + type: str + gift: UniqueGift + owned_gift_id: Optional[str] = None + sender_user: Optional[User] = None + send_date: int + is_saved: Optional[bool] = None + can_be_transferred: Optional[bool] = None + transfer_star_count: Optional[int] = None + + +OwnedGift = Union[OwnedGiftRegular, OwnedGiftUnique] + + +class OwnedGifts(BaseModel): + total_count: int + gifts: list[OwnedGift] + next_offset: Optional[str] = None + + +class StarAmount(BaseModel): + amount: int + nanostar_amount: Optional[int] = None + + class BotCommand(BaseModel): command: str description: str @@ -1321,13 +1531,10 @@ class ResponseParameters(BaseModel): retry_after: Optional[int] = None -InputFile = Union[bytes, tuple[str, bytes]] - - class InputMediaAnimation(BaseModel): type: str media: str - thumbnail: Optional[Union[InputFile, str]] = None + thumbnail: Optional[str] = None caption: Optional[str] = None parse_mode: Optional[str] = None caption_entities: Optional[list[MessageEntity]] = None @@ -1341,7 +1548,7 @@ class InputMediaAnimation(BaseModel): class InputMediaDocument(BaseModel): type: str media: str - thumbnail: Optional[Union[InputFile, str]] = None + thumbnail: Optional[str] = None caption: Optional[str] = None parse_mode: Optional[str] = None caption_entities: Optional[list[MessageEntity]] = None @@ -1351,7 +1558,7 @@ class InputMediaDocument(BaseModel): class InputMediaAudio(BaseModel): type: str media: str - thumbnail: Optional[Union[InputFile, str]] = None + thumbnail: Optional[str] = None caption: Optional[str] = None parse_mode: Optional[str] = None caption_entities: Optional[list[MessageEntity]] = None @@ -1373,7 +1580,9 @@ class InputMediaPhoto(BaseModel): class InputMediaVideo(BaseModel): type: str media: str - thumbnail: Optional[Union[InputFile, str]] = None + thumbnail: Optional[str] = None + cover: Optional[str] = None + start_timestamp: Optional[int] = None caption: Optional[str] = None parse_mode: Optional[str] = None caption_entities: Optional[list[MessageEntity]] = None @@ -1394,6 +1603,9 @@ class InputMediaVideo(BaseModel): ] +InputFile = Union[bytes, tuple[str, bytes]] + + class InputPaidMediaPhoto(BaseModel): type: str media: str @@ -1402,7 +1614,9 @@ class InputPaidMediaPhoto(BaseModel): class InputPaidMediaVideo(BaseModel): type: str media: str - thumbnail: Optional[Union[InputFile, str]] = None + thumbnail: Optional[str] = None + cover: Optional[str] = None + start_timestamp: Optional[int] = None width: Optional[int] = None height: Optional[int] = None duration: Optional[int] = None @@ -1412,6 +1626,36 @@ class InputPaidMediaVideo(BaseModel): InputPaidMedia = Union[InputPaidMediaPhoto, InputPaidMediaVideo] +class InputProfilePhotoStatic(BaseModel): + type: str + photo: str + + +class InputProfilePhotoAnimated(BaseModel): + type: str + animation: str + main_frame_timestamp: Optional[float] = None + + +InputProfilePhoto = Union[InputProfilePhotoStatic, InputProfilePhotoAnimated] + + +class InputStoryContentPhoto(BaseModel): + type: str + photo: str + + +class InputStoryContentVideo(BaseModel): + type: str + video: str + duration: Optional[float] = None + cover_frame_timestamp: Optional[float] = None + is_animation: Optional[bool] = None + + +InputStoryContent = Union[InputStoryContentPhoto, InputStoryContentVideo] + + class StickerSet(BaseModel): name: str title: str @@ -1421,7 +1665,7 @@ class StickerSet(BaseModel): class InputSticker(BaseModel): - sticker: Union[InputFile, str] + sticker: str format: str emoji_list: list[str] mask_position: Optional[MaskPosition] = None @@ -1610,7 +1854,6 @@ class InlineQueryResultArticle(BaseModel): input_message_content: InputMessageContent reply_markup: Optional[InlineKeyboardMarkup] = None url: Optional[str] = None - hide_url: Optional[bool] = None description: Optional[str] = None thumbnail_url: Optional[str] = None thumbnail_width: Optional[int] = None @@ -1817,6 +2060,11 @@ class SentWebAppMessage(BaseModel): inline_message_id: Optional[str] = None +class PreparedInlineMessage(BaseModel): + id: str + expiration_date: int + + class ShippingOption(BaseModel): id: str title: str @@ -1844,12 +2092,37 @@ class RevenueWithdrawalStateFailed(BaseModel): ] +class AffiliateInfo(BaseModel): + affiliate_user: Optional[User] = None + affiliate_chat: Optional[Chat] = None + commission_per_mille: int + amount: int + nanostar_amount: Optional[int] = None + + class TransactionPartnerUser(BaseModel): type: str + transaction_type: str user: User + affiliate: Optional[AffiliateInfo] = None invoice_payload: Optional[str] = None + subscription_period: Optional[int] = None paid_media: Optional[list[PaidMedia]] = None paid_media_payload: Optional[str] = None + gift: Optional[Gift] = None + premium_subscription_duration: Optional[int] = None + + +class TransactionPartnerChat(BaseModel): + type: str + chat: Chat + gift: Optional[Gift] = None + + +class TransactionPartnerAffiliateProgram(BaseModel): + type: str + sponsor_user: Optional[User] = None + commission_per_mille: int class TransactionPartnerFragment(BaseModel): @@ -1861,14 +2134,22 @@ class TransactionPartnerTelegramAds(BaseModel): type: str +class TransactionPartnerTelegramApi(BaseModel): + type: str + request_count: int + + class TransactionPartnerOther(BaseModel): type: str TransactionPartner = Union[ TransactionPartnerUser, + TransactionPartnerChat, + TransactionPartnerAffiliateProgram, TransactionPartnerFragment, TransactionPartnerTelegramAds, + TransactionPartnerTelegramApi, TransactionPartnerOther, ] @@ -1876,6 +2157,7 @@ class TransactionPartnerOther(BaseModel): class StarTransaction(BaseModel): id: str amount: int + nanostar_amount: Optional[int] = None date: int source: Optional[TransactionPartner] = None receiver: Optional[TransactionPartner] = None diff --git a/packages/alicebot-adapter-telegram/codegen.py b/packages/alicebot-adapter-telegram/codegen.py index d33a471..1f91747 100644 --- a/packages/alicebot-adapter-telegram/codegen.py +++ b/packages/alicebot-adapter-telegram/codegen.py @@ -72,7 +72,7 @@ async def call_api( self, api: str, *, - response_type: Optional[type[_T]] = None, + response_type: Union[type[_T], Any, None] = None, **params: Any, ) -> Any: ... @@ -109,6 +109,7 @@ class TelegramMedia(BaseModel): # ruff: noqa: D101, D102 # pylint: disable=missing-class-docstring +from abc import ABC from typing import Optional from typing_extensions import Self @@ -294,7 +295,7 @@ def gen_model(self) -> str: def gen_api(self) -> str: """生成 API 类的代码。""" USED_MODELS.clear() - api_code = "class TelegramAPI(TelegramAPIBase):\n" + indent( + api_code = "class TelegramAPI(TelegramAPIBase, ABC):\n" + indent( "\n\n".join(method.to_api_method() for method in self.methods.values()) ) return API_CODE_PREFIX.format(", ".join(USED_MODELS)) + api_code @@ -343,7 +344,7 @@ def gen_entity(self) -> str: type_field = field break assert type_field is not None - result = "class Entity(MessageSegment[MessageT]):\n" + result = "class Entity(MessageSegment[MessageT], ABC):\n" for entity_name in re.findall(r'"(.*?)" \(.*?\)', type_field.description): fields = [ field diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a092c5..7ff8286 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,54 +12,51 @@ importers: specifier: ^1.2.3 version: 1.2.3 unocss: - specifier: ^66.1.2 - version: 66.1.2(postcss@8.5.3)(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)) + specifier: ^66.1.3 + version: 66.1.3(postcss@8.5.4)(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)) vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.21)(postcss@8.5.3)(search-insights@2.13.0)(typescript@5.4.3) + version: 1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.29)(postcss@8.5.4)(search-insights@2.13.0)(typescript@5.4.3) vue: - specifier: ^3.5.14 - version: 3.5.14(typescript@5.4.3) + specifier: ^3.5.16 + version: 3.5.16(typescript@5.4.3) devDependencies: '@eslint/js': - specifier: ^9.27.0 - version: 9.27.0 + specifier: ^9.28.0 + version: 9.28.0 '@types/node': - specifier: ^22.15.21 - version: 22.15.21 + specifier: ^22.15.29 + version: 22.15.29 '@unocss/eslint-config': - specifier: ^66.1.2 - version: 66.1.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) + specifier: ^66.1.3 + version: 66.1.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) conventional-changelog-cli: specifier: ^5.0.0 version: 5.0.0(conventional-commits-filter@5.0.0) eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + specifier: ^9.28.0 + version: 9.28.0(jiti@2.4.2) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.27.0(jiti@2.4.2)) + version: 10.1.5(eslint@9.28.0(jiti@2.4.2)) eslint-plugin-vue: specifier: ^10.1.0 - version: 10.1.0(eslint@9.27.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.27.0(jiti@2.4.2))) + version: 10.1.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2))) globals: - specifier: ^16.1.0 - version: 16.1.0 + specifier: ^16.2.0 + version: 16.2.0 markdownlint-cli2: specifier: ^0.18.1 version: 0.18.1 prettier: specifier: ^3.5.3 version: 3.5.3 - pyright: - specifier: 1.1.400 - version: 1.1.400 typescript-eslint: - specifier: ^8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) + specifier: ^8.33.0 + version: 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) vue-eslint-parser: specifier: ^10.1.3 - version: 10.1.3(eslint@9.27.0(jiti@2.4.2)) + version: 10.1.3(eslint@9.28.0(jiti@2.4.2)) packages: @@ -157,13 +154,13 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + '@babel/parser@7.27.4': + resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} engines: {node: '>=6.9.0'} '@conventional-changelog/git-client@1.0.1': @@ -365,8 +362,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.27.0': - resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -404,8 +401,8 @@ packages: '@iconify-json/mdi@1.2.3': resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==} - '@iconify-json/simple-icons@1.2.35': - resolution: {integrity: sha512-PAHZZn6P5ToHMhmEeeh/O96E/Ep4PctN44N64dWYbDasEvbVoN6x62m+Doz8au0SVS4/zYEMAsDO6TdO9ep84Q==} + '@iconify-json/simple-icons@1.2.36': + resolution: {integrity: sha512-ZMpVdoW/7hhbt2aHVSvudjH8eSVNNjKkAAjwAQHgiuPUiIfbvNakVin+H9uhUz4N9TbDT/nanzV/4Slb+6dDXw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -454,103 +451,103 @@ packages: resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} engines: {node: '>=20.0.0'} - '@rollup/rollup-android-arm-eabi@4.41.0': - resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + '@rollup/rollup-android-arm-eabi@4.41.1': + resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.41.0': - resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + '@rollup/rollup-android-arm64@4.41.1': + resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.41.0': - resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + '@rollup/rollup-darwin-arm64@4.41.1': + resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.41.0': - resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + '@rollup/rollup-darwin-x64@4.41.1': + resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.41.0': - resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + '@rollup/rollup-freebsd-arm64@4.41.1': + resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.41.0': - resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + '@rollup/rollup-freebsd-x64@4.41.1': + resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.41.0': - resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': + resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.41.0': - resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + '@rollup/rollup-linux-arm-musleabihf@4.41.1': + resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.41.0': - resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + '@rollup/rollup-linux-arm64-gnu@4.41.1': + resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.41.0': - resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + '@rollup/rollup-linux-arm64-musl@4.41.1': + resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.41.0': - resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': + resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': - resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': + resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.41.0': - resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + '@rollup/rollup-linux-riscv64-gnu@4.41.1': + resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.41.0': - resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + '@rollup/rollup-linux-riscv64-musl@4.41.1': + resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.41.0': - resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + '@rollup/rollup-linux-s390x-gnu@4.41.1': + resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.41.0': - resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + '@rollup/rollup-linux-x64-gnu@4.41.1': + resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.41.0': - resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + '@rollup/rollup-linux-x64-musl@4.41.1': + resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.41.0': - resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + '@rollup/rollup-win32-arm64-msvc@4.41.1': + resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.41.0': - resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + '@rollup/rollup-win32-ia32-msvc@4.41.1': + resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.41.0': - resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + '@rollup/rollup-win32-x64-msvc@4.41.1': + resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} cpu: [x64] os: [win32] @@ -612,8 +609,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.15.21': - resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/node@22.15.29': + resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -630,147 +627,157 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/eslint-plugin@8.32.1': - resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} + '@typescript-eslint/eslint-plugin@8.33.0': + resolution: {integrity: sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.33.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.32.1': - resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + '@typescript-eslint/parser@8.33.0': + resolution: {integrity: sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.1': - resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + '@typescript-eslint/project-service@8.33.0': + resolution: {integrity: sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.32.1': - resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} + '@typescript-eslint/scope-manager@8.33.0': + resolution: {integrity: sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.33.0': + resolution: {integrity: sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.33.0': + resolution: {integrity: sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.32.1': - resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + '@typescript-eslint/types@8.33.0': + resolution: {integrity: sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.32.1': - resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + '@typescript-eslint/typescript-estree@8.33.0': + resolution: {integrity: sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.1': - resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + '@typescript-eslint/utils@8.33.0': + resolution: {integrity: sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.32.1': - resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + '@typescript-eslint/visitor-keys@8.33.0': + resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unocss/astro@66.1.2': - resolution: {integrity: sha512-QBcvrPp0F2jqe2Y/S/FQDmEmNlAhGjeWN5fkUGj02N7mXRrg0/VJxSpOJH6XHRWkMoFPoNNyEjHk563ODbjtHw==} + '@unocss/astro@66.1.3': + resolution: {integrity: sha512-jsubeNZE/LThm8fXPMWNmNXmG5KsM4LIpJ37rq5tgP6RqX0UwLvA4t9yXNJdr6aLDJN6+KpQXfGhIrf/Aj7YIQ==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 peerDependenciesMeta: vite: optional: true - '@unocss/cli@66.1.2': - resolution: {integrity: sha512-bYCRpkGMu0QwC6Ktq3S/HwtcIW8Famy0dXOu1RIAM1IT60lq+4S5UTEBPdwryoFgDBoVMB7KLUhPYiGQ3pmSTA==} + '@unocss/cli@66.1.3': + resolution: {integrity: sha512-7Uw6VDsk7w6E6PkrRfq34d+tJpTcNWfksNkLorpQhwwlpbIod69iNHj5gn5u0SJwrAAuFvGNTQzOWQar8HlKCQ==} engines: {node: '>=14'} hasBin: true - '@unocss/config@66.1.2': - resolution: {integrity: sha512-2sQXj+Qaq4RVDELVTPoXMggZ30g1WKHeCuur396I12Ab0HgAR6bTc/DIrNtqKVHFI3mmlvP1oM1ynhKWSKPsTg==} + '@unocss/config@66.1.3': + resolution: {integrity: sha512-oEKomMMY+f6+4HkU538XG7jOJZAMMk2WczT2XS6HdpJWwUzSKHlhs9R2pj7g0HLJZsROzP1A1+OBstHcQLe94A==} engines: {node: '>=14'} - '@unocss/core@66.1.2': - resolution: {integrity: sha512-mN9h1hHEuhDcdbI4z74o7UnxlBZYVsJpYcdC1YLWBKROcLYTkuyZ7hgBzpo1FBNox2Bt3JnrSinVDmc44Bxjow==} + '@unocss/core@66.1.3': + resolution: {integrity: sha512-qV88JvRvSMgMo1FMWZfNiKYy+IvaXswyMMyZvuQxCrNkDPtij46pu7G3heKdLl7mNTdSgF0+LQPEqVYVA27pCA==} - '@unocss/eslint-config@66.1.2': - resolution: {integrity: sha512-lQSfuZuq9DRNyR4d9j3jQHSZRhNbQpSBXUGAjWz6QMlLcDIqTN3JvtOGDRVH0t7VVvlhZcln1t4d1jfJORlY5w==} + '@unocss/eslint-config@66.1.3': + resolution: {integrity: sha512-Y49LdbRqWgzlfO4y+4neOzA271ZDlHa56Zd8KoK2Ww3bTRghPVVltblFwPrzfdWakCZ4gwfsvyKsILSQPWM+MA==} engines: {node: '>=14'} - '@unocss/eslint-plugin@66.1.2': - resolution: {integrity: sha512-OwBqODMtY7mLvVirfI1QqxJN/3Ewc1Z8pHTwRxEpBN0w95z8ZvaMzViicci015Yb8JFJ9vs5GlhgoEm/hkenXQ==} + '@unocss/eslint-plugin@66.1.3': + resolution: {integrity: sha512-rsolmGZtEfXAVmYoFoD36tAvf0deNLVKRymfIqe/LExpMGt6EAGatVUHvlB/j2UmKDQk8iCvkk1i10JgmEj1SQ==} engines: {node: '>=14'} - '@unocss/extractor-arbitrary-variants@66.1.2': - resolution: {integrity: sha512-F570wH9VYeFTb4r8qgcbN5QpEVIAvFC1zOnrAPUr6B6kbU2YChMXxHP7PHK0AzLHnEr458Pwpzl6hmP6bzxZ8g==} + '@unocss/extractor-arbitrary-variants@66.1.3': + resolution: {integrity: sha512-4nlQKx40ch+4hjNlN/jWZDd06qbXFj5xwMpnNjDcb008zgCuPK2dEmg/eDddSv25KZh9W+3fvwduMDNK6YDooQ==} - '@unocss/inspector@66.1.2': - resolution: {integrity: sha512-ftdZzFP5DAKDzgBI078xDDZbNNVq1RV/yhpNkviBvWCUsgRWc6o3G8swqJPIvFaphmUms0RIYH9shmXilVXFtA==} + '@unocss/inspector@66.1.3': + resolution: {integrity: sha512-ntKtc9ZJBrYf6BFZlwfWwDCWKvZQd3A3W4i0NGdHXlzAC3CFGf19U355e49DfKCln6zDtTVHTPWCuMzMH2H52Q==} - '@unocss/postcss@66.1.2': - resolution: {integrity: sha512-RCA3or1qBdRVduNW73xdeiFDCEb8cvcGKsHSN66rL66RrlzNnunE4NE55vbI+yoArTRZ7RdUnxq1KuXKjrJbYw==} + '@unocss/postcss@66.1.3': + resolution: {integrity: sha512-kVJlJ19WnG0Ec4BpdJUcUaA/B5md440WiKId2oaD6nzT6IDozpbQ3DwW2HtQ33YyagkmwYgocb0oodEm2lGilA==} engines: {node: '>=14'} peerDependencies: postcss: ^8.4.21 - '@unocss/preset-attributify@66.1.2': - resolution: {integrity: sha512-i7+LRtpxbtSzS+gHdc+aW99mGLYeR8hUnEWqFNnr+MiiyzbD8yFimye/u8TySSBLzPKGbLCb4YWVV684BuZgxA==} + '@unocss/preset-attributify@66.1.3': + resolution: {integrity: sha512-geEaGxs7j85P1HirbAlIRnCrJwxjvvbUQDC2TOXUZ67So1co2mac/3uo0QMJsdry14iSIIfu6rNVaDjMSC4K5g==} - '@unocss/preset-icons@66.1.2': - resolution: {integrity: sha512-14390jFBJ2anuKvjX9TeRCm7adNjR/mey0bh0+S/k/5W3VugIY2y0E+OH3m+sx5d/5ZUYbYkUGsmtuKbVNwwxQ==} + '@unocss/preset-icons@66.1.3': + resolution: {integrity: sha512-n1y8I4cVfOOldgyuncwtMn8/wMVzUzVvwdgQk2ow/D07TBgsyZZfk98N1AAFrS772SRr8+YmJ5im4+bNLZaYdA==} - '@unocss/preset-mini@66.1.2': - resolution: {integrity: sha512-oiDe+VhwZ8B5Z0UGfggtOwgpRZMLtH1RTDFvmJmJEXYYX5BPWknS6wYcQzxy0i/y9ym0xp2QnEaTpGmR7LKdkg==} + '@unocss/preset-mini@66.1.3': + resolution: {integrity: sha512-8HYCTl0YK5FGzfVbtshN1MIQfNZy8baT4BLdcDb2qtsLjG5qP7rmqTdk3c8OpoKhGLUuXPXBaDjh+D5TAMBY3w==} - '@unocss/preset-tagify@66.1.2': - resolution: {integrity: sha512-Xw5sFJGuzmGnfAXMI0kAiWDBh4DT3cOyphcyY9grBxbmxgqQDxRFHOV3Eg85lWK6X5cScOv3DhO0ndGv5ND8YA==} + '@unocss/preset-tagify@66.1.3': + resolution: {integrity: sha512-IUhggch3uaDraTgnomjo9eRIsarI3r3Wy5Cyu5GtmAIs4RIe7MTVsGeL21q7qgC12/UmQ7E9zdyJR1IbQ6L9aQ==} - '@unocss/preset-typography@66.1.2': - resolution: {integrity: sha512-+k9zp27Ak8rB6LPFDwq9fcwd3+ivFeSvXFQ2d4fBCwGGOAKHIA7qHLg3etxRaMhGd3YUPv/6d7FWpBbQgUVYZw==} + '@unocss/preset-typography@66.1.3': + resolution: {integrity: sha512-97n8xIYwQlxhor0FiLsmp697G6DTmUauFNv1trJf2d2wBP2W/AAkIbKw0t8SEN06eduvB7Epq7h7502dyULV4A==} - '@unocss/preset-uno@66.1.2': - resolution: {integrity: sha512-JL9YkDwluu1YGhzBaxO60XkKtZBagL13z3K6dsjsghbs+dKVlh35rhlIm5TZ+NdLAzcLM8PHhXm2ausjSd54Bg==} + '@unocss/preset-uno@66.1.3': + resolution: {integrity: sha512-JM/6cMGX3xSdU2a+S0JOl3aEWlQoOv0J3yyyQgd0lamkWF3RhRON6QZwhcMaLGVAPwVrSfaLG2ucCH9uubGpdg==} - '@unocss/preset-web-fonts@66.1.2': - resolution: {integrity: sha512-2ru+6jaac72oUx0kOBgNzbbkVe6oWKjqGmx24uK94fAcrP9eQyd+r7xiFpqXegrQ8+kONI66+HxAClvF2JHqdw==} + '@unocss/preset-web-fonts@66.1.3': + resolution: {integrity: sha512-uOWEmru+tbr/gttM6X/sJHoY0TCVdUx8/EiVITrLe51Agi2UECQlCdBH2lZNnfc3RCArCn4JevMLHd1btHRzJg==} - '@unocss/preset-wind3@66.1.2': - resolution: {integrity: sha512-S09imGOngAAOXCBCHb3JAtxD1/L7nDWrgEeX6NT0ElDp3X1T6XxUXYJlpjCfcqV/klMoXyYouKvp0YuG9QSgVg==} + '@unocss/preset-wind3@66.1.3': + resolution: {integrity: sha512-oFQKA/v0EbCtZaxTBKvTfyVG1hcDJ1CXQ7gsghynMpOKMJbnb7bq4NEuDoMdHCVV9yKEQaSXkbbyHpeithBO3g==} - '@unocss/preset-wind4@66.1.2': - resolution: {integrity: sha512-03p4rpBAWzz58BzAiKsUuG+6YO7IG6mJMGQAtPzuhd+nVBJLIRa3eBIVXOPmAVz1rNx5XPRTAr6PMC7ycdMFRA==} + '@unocss/preset-wind4@66.1.3': + resolution: {integrity: sha512-QwPDtQv/Asz1sYT0HcXPROolKwDCCcHqp0kkrO7aOGaVqyTF6ByfT+7cfI+Mv9uKtZejd+kQTUM/1ag8mzj3UA==} - '@unocss/preset-wind@66.1.2': - resolution: {integrity: sha512-O3nIfbTbX/YRMFj7jNb7nHBDV47G79qOmyid4WPFZrPV3BbFAo94d/54kSoDVuc8jAt06YYQH9XC4ZeD59Sr3Q==} + '@unocss/preset-wind@66.1.3': + resolution: {integrity: sha512-PA+W1n3b7vXYAp3bD5BoSXVHDVhXPXOpKkEYDhMHL8+z567/dwDVrkZ5vAPsu1s4bW1PLqN/enzKso74TOfDCg==} - '@unocss/reset@66.1.2': - resolution: {integrity: sha512-njNy/QCpuPKBFeEvhYGwwCe3t8R8JTxONsyUB9NsFOamkF13DSlEB4Yy/QLQfIinbbmx0F/wiej/JGOJk1ecDg==} + '@unocss/reset@66.1.3': + resolution: {integrity: sha512-tc8uSka0R0zlfJfOjoLUg0NMT4RQnAe6nyelBXE86qYQaNV2YD7tf2iEWMmbjNwmiIjc8MigHAvYt1HmdirNww==} - '@unocss/rule-utils@66.1.2': - resolution: {integrity: sha512-nn0ehvDh7yyWq2mcBDLVpmMAivjRATUroZ8ETinyN1rmfsGesm71R0d1gV3K+Z6YC7a3+dMLc+/qzI7VK3AG/Q==} + '@unocss/rule-utils@66.1.3': + resolution: {integrity: sha512-EP8QRcOO/dAD1+RxOnWOiGaIyo4IJQOdqD0nBteZDoL3X9vj6GPUI5yo8f7uR6k0koI/hxJv5BVsfQZSIsVjLA==} engines: {node: '>=14'} - '@unocss/transformer-attributify-jsx@66.1.2': - resolution: {integrity: sha512-PNwxpsQlBlTAyw1apIMyioeAKrLAf7axLDjZ4BW20WH7ql0GUwvMhuO/qzsWDpYWdtSlFnnAdWI2aCxyvhzdCA==} + '@unocss/transformer-attributify-jsx@66.1.3': + resolution: {integrity: sha512-9dSacVrxmjiJUDRjK4f7qHcI//MjiApopRWtRrnyFbAzsKTqXHxstVCqYKkzCGRt2JcW01MXd/uL7q0Dw/YSCQ==} - '@unocss/transformer-compile-class@66.1.2': - resolution: {integrity: sha512-viJetYFncLf9llxYQ7DKf5PuSJw08B7qhp0IXv/7ZG7agU09J1mlussC6ff+00iRoMxvG+5uXiYlTzL2vfikwA==} + '@unocss/transformer-compile-class@66.1.3': + resolution: {integrity: sha512-cV3qVDvuTM1DXBE9hyP69UU/etrloFrOx93ztjhuznKfCDyjWI79oL95BxSyHfD0bPNWKH9wSqNgesgnQKhkog==} - '@unocss/transformer-directives@66.1.2': - resolution: {integrity: sha512-A41/cPMB+BUEgnhz5kFiTYgSuCAziJy6hSlLYBDcrFbARUsvmhZFou0P2fRr3wDOFxD3BuApHjsefybKTh1UeA==} + '@unocss/transformer-directives@66.1.3': + resolution: {integrity: sha512-xo91rCu6o5NEbc9EJrEQA1mKRVVwpstm78vIqKJAhU57QlR7Mj4UDbq46ogkt+jcljKCHppp+9aQXRk/Z4PAZw==} - '@unocss/transformer-variant-group@66.1.2': - resolution: {integrity: sha512-RfqJmeic4kAwS5OhSk/D00hqla+xXIw8AJH93jYqHfyDhJR5vddEAJi5RBMOL7y6vDQqRlUCEDQvfp3zSmi6iw==} + '@unocss/transformer-variant-group@66.1.3': + resolution: {integrity: sha512-FCB5LB459FTE/E/OXn5g6O/o7AOJbiEDRiA/WXtalB/VLsqc5DHSbb9isITYUTh+PqzZZef8W6+kQjG5wx5yNA==} - '@unocss/vite@66.1.2': - resolution: {integrity: sha512-ZJHN8+HKSrclVjT/+S7Vh2t59DK8J44d5nLZPG1Goua7uNK8yYJeOLK2sCGX7aackRer1ZynmglFFzxNFVt+IA==} + '@unocss/vite@66.1.3': + resolution: {integrity: sha512-DBehjzx93XkWK6skudKZ9BewcFoZdbVhn+7tSM00HoDjQ8WHeC22saJf0UY9sAkdq7f2k2enAhAcznr2/DUTng==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 @@ -781,17 +788,17 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.5.14': - resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} + '@vue/compiler-core@3.5.16': + resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} - '@vue/compiler-dom@3.5.14': - resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} + '@vue/compiler-dom@3.5.16': + resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} - '@vue/compiler-sfc@3.5.14': - resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==} + '@vue/compiler-sfc@3.5.16': + resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} - '@vue/compiler-ssr@3.5.14': - resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==} + '@vue/compiler-ssr@3.5.16': + resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} '@vue/devtools-api@7.7.6': resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} @@ -802,22 +809,22 @@ packages: '@vue/devtools-shared@7.7.6': resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} - '@vue/reactivity@3.5.14': - resolution: {integrity: sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==} + '@vue/reactivity@3.5.16': + resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} - '@vue/runtime-core@3.5.14': - resolution: {integrity: sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==} + '@vue/runtime-core@3.5.16': + resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} - '@vue/runtime-dom@3.5.14': - resolution: {integrity: sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==} + '@vue/runtime-dom@3.5.16': + resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} - '@vue/server-renderer@3.5.14': - resolution: {integrity: sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==} + '@vue/server-renderer@3.5.16': + resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} peerDependencies: - vue: 3.5.14 + vue: 3.5.16 - '@vue/shared@3.5.14': - resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} + '@vue/shared@3.5.16': + resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} @@ -1153,8 +1160,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1205,8 +1212,8 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1236,8 +1243,8 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -1270,8 +1277,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.1.0: - resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} engines: {node: '>=18'} globby@14.1.0: @@ -1314,8 +1321,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.4: - resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -1668,12 +1675,12 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.6: - resolution: {integrity: sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==} + preact@10.26.8: + resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1695,11 +1702,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pyright@1.1.400: - resolution: {integrity: sha512-e0NFMPWhMvPn4siTAN6MsWZ6S/ePydUp1BOXbkh+8I+H+/KulnBb+2ceHNkI32nxZWalQxfUMNoGCHdGMXsmUA==} - engines: {node: '>=14.0.0'} - hasBin: true - quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -1738,8 +1740,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.41.0: - resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + rollup@4.41.1: + resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1815,8 +1817,8 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + synckit@0.9.3: + resolution: {integrity: sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==} engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.2.0: @@ -1833,8 +1835,8 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -1865,8 +1867,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typescript-eslint@8.32.1: - resolution: {integrity: sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==} + typescript-eslint@8.33.0: + resolution: {integrity: sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1917,11 +1919,11 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - unocss@66.1.2: - resolution: {integrity: sha512-mVwuXzIZ5Ex83F4w3XVJyp9DSbh5KhDzglyvMLktX8oU0QxQtaSpa5lE1twl3wgM0pVL9gmzD4a0FoYWZuJIDg==} + unocss@66.1.3: + resolution: {integrity: sha512-hjSZ+ekyzVfVNMXeBnTMMatwPP/VaaE9UFyEKJfCctaiex11Dsj1MCjj6PIjGUZyIWzAJp6BZdcVmHyOi09HGw==} engines: {node: '>=14'} peerDependencies: - '@unocss/webpack': 66.1.2 + '@unocss/webpack': 66.1.3 vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 peerDependenciesMeta: '@unocss/webpack': @@ -2002,8 +2004,8 @@ packages: peerDependencies: vue: ^3.4.37 - vue@3.5.14: - resolution: {integrity: sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==} + vue@3.5.16: + resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2162,11 +2164,11 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.27.2': + '@babel/parser@7.27.4': dependencies: - '@babel/types': 7.27.1 + '@babel/types': 7.27.3 - '@babel/types@7.27.1': + '@babel/types@7.27.3': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -2184,7 +2186,7 @@ snapshots: '@docsearch/js@3.8.2(@algolia/client-search@5.25.0)(search-insights@2.13.0)': dependencies: '@docsearch/react': 3.8.2(@algolia/client-search@5.25.0)(search-insights@2.13.0) - preact: 10.26.6 + preact: 10.26.8 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -2272,9 +2274,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2307,7 +2309,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.27.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} @@ -2335,7 +2337,7 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.35': + '@iconify-json/simple-icons@1.2.36': dependencies: '@iconify/types': 2.0.0 @@ -2391,64 +2393,64 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/rollup-android-arm-eabi@4.41.0': + '@rollup/rollup-android-arm-eabi@4.41.1': optional: true - '@rollup/rollup-android-arm64@4.41.0': + '@rollup/rollup-android-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-arm64@4.41.0': + '@rollup/rollup-darwin-arm64@4.41.1': optional: true - '@rollup/rollup-darwin-x64@4.41.0': + '@rollup/rollup-darwin-x64@4.41.1': optional: true - '@rollup/rollup-freebsd-arm64@4.41.0': + '@rollup/rollup-freebsd-arm64@4.41.1': optional: true - '@rollup/rollup-freebsd-x64@4.41.0': + '@rollup/rollup-freebsd-x64@4.41.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + '@rollup/rollup-linux-arm-gnueabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.41.0': + '@rollup/rollup-linux-arm-musleabihf@4.41.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.41.0': + '@rollup/rollup-linux-arm64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.41.0': + '@rollup/rollup-linux-arm64-musl@4.41.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + '@rollup/rollup-linux-loongarch64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.41.0': + '@rollup/rollup-linux-riscv64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.41.0': + '@rollup/rollup-linux-riscv64-musl@4.41.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.41.0': + '@rollup/rollup-linux-s390x-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.41.0': + '@rollup/rollup-linux-x64-gnu@4.41.1': optional: true - '@rollup/rollup-linux-x64-musl@4.41.0': + '@rollup/rollup-linux-x64-musl@4.41.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.41.0': + '@rollup/rollup-win32-arm64-msvc@4.41.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.41.0': + '@rollup/rollup-win32-ia32-msvc@4.41.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.41.0': + '@rollup/rollup-win32-x64-msvc@4.41.1': optional: true '@shikijs/core@2.5.0': @@ -2522,7 +2524,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.15.21': + '@types/node@22.15.29': dependencies: undici-types: 6.21.0 @@ -2536,57 +2538,72 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/type-utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 8.33.0 + eslint: 9.28.0(jiti@2.4.2) graphemer: 1.4.0 - ignore: 7.0.4 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 8.33.0 debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.4.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.1': + '@typescript-eslint/project-service@8.33.0(typescript@5.4.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.4.3) + '@typescript-eslint/types': 8.33.0 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/scope-manager@8.33.0': + dependencies: + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/visitor-keys': 8.33.0 + + '@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + typescript: 5.4.3 - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@typescript-eslint/type-utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.4.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.4.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.32.1': {} + '@typescript-eslint/types@8.33.0': {} - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.4.3)': + '@typescript-eslint/typescript-estree@8.33.0(typescript@5.4.3)': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/project-service': 8.33.0(typescript@5.4.3) + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.4.3) + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/visitor-keys': 8.33.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -2597,40 +2614,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@typescript-eslint/utils@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.4.3) - eslint: 9.27.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.4.3) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.4.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.32.1': + '@typescript-eslint/visitor-keys@8.33.0': dependencies: - '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/types': 8.33.0 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.3.0': {} - '@unocss/astro@66.1.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3))': + '@unocss/astro@66.1.3(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3))': dependencies: - '@unocss/core': 66.1.2 - '@unocss/reset': 66.1.2 - '@unocss/vite': 66.1.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)) + '@unocss/core': 66.1.3 + '@unocss/reset': 66.1.3 + '@unocss/vite': 66.1.3(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)) optionalDependencies: - vite: 5.4.19(@types/node@22.15.21) + vite: 5.4.19(@types/node@22.15.29) transitivePeerDependencies: - vue - '@unocss/cli@66.1.2': + '@unocss/cli@66.1.3': dependencies: '@ampproject/remapping': 2.3.0 - '@unocss/config': 66.1.2 - '@unocss/core': 66.1.2 - '@unocss/preset-uno': 66.1.2 + '@unocss/config': 66.1.3 + '@unocss/core': 66.1.3 + '@unocss/preset-uno': 66.1.3 cac: 6.7.14 chokidar: 3.6.0 colorette: 2.0.20 @@ -2638,190 +2655,190 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 perfect-debounce: 1.0.0 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 unplugin-utils: 0.2.4 - '@unocss/config@66.1.2': + '@unocss/config@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 unconfig: 7.3.2 - '@unocss/core@66.1.2': {} + '@unocss/core@66.1.3': {} - '@unocss/eslint-config@66.1.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@unocss/eslint-config@66.1.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: - '@unocss/eslint-plugin': 66.1.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) + '@unocss/eslint-plugin': 66.1.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@unocss/eslint-plugin@66.1.2(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3)': + '@unocss/eslint-plugin@66.1.3(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3)': dependencies: - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@unocss/config': 66.1.2 - '@unocss/core': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@unocss/config': 66.1.3 + '@unocss/core': 66.1.3 + '@unocss/rule-utils': 66.1.3 magic-string: 0.30.17 - synckit: 0.9.2 + synckit: 0.9.3 transitivePeerDependencies: - eslint - supports-color - typescript - '@unocss/extractor-arbitrary-variants@66.1.2': + '@unocss/extractor-arbitrary-variants@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/inspector@66.1.2(vue@3.5.14(typescript@5.4.3))': + '@unocss/inspector@66.1.3(vue@3.5.16(typescript@5.4.3))': dependencies: - '@unocss/core': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/rule-utils': 66.1.3 colorette: 2.0.20 gzip-size: 6.0.0 sirv: 3.0.1 - vue-flow-layout: 0.1.1(vue@3.5.14(typescript@5.4.3)) + vue-flow-layout: 0.1.1(vue@3.5.16(typescript@5.4.3)) transitivePeerDependencies: - vue - '@unocss/postcss@66.1.2(postcss@8.5.3)': + '@unocss/postcss@66.1.3(postcss@8.5.4)': dependencies: - '@unocss/config': 66.1.2 - '@unocss/core': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/config': 66.1.3 + '@unocss/core': 66.1.3 + '@unocss/rule-utils': 66.1.3 css-tree: 3.1.0 - postcss: 8.5.3 - tinyglobby: 0.2.13 + postcss: 8.5.4 + tinyglobby: 0.2.14 - '@unocss/preset-attributify@66.1.2': + '@unocss/preset-attributify@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/preset-icons@66.1.2': + '@unocss/preset-icons@66.1.3': dependencies: '@iconify/utils': 2.3.0 - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 ofetch: 1.4.1 transitivePeerDependencies: - supports-color - '@unocss/preset-mini@66.1.2': + '@unocss/preset-mini@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/extractor-arbitrary-variants': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/extractor-arbitrary-variants': 66.1.3 + '@unocss/rule-utils': 66.1.3 - '@unocss/preset-tagify@66.1.2': + '@unocss/preset-tagify@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/preset-typography@66.1.2': + '@unocss/preset-typography@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/preset-mini': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/preset-mini': 66.1.3 + '@unocss/rule-utils': 66.1.3 - '@unocss/preset-uno@66.1.2': + '@unocss/preset-uno@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/preset-wind3': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/preset-wind3': 66.1.3 - '@unocss/preset-web-fonts@66.1.2': + '@unocss/preset-web-fonts@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 ofetch: 1.4.1 - '@unocss/preset-wind3@66.1.2': + '@unocss/preset-wind3@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/preset-mini': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/preset-mini': 66.1.3 + '@unocss/rule-utils': 66.1.3 - '@unocss/preset-wind4@66.1.2': + '@unocss/preset-wind4@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/extractor-arbitrary-variants': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/extractor-arbitrary-variants': 66.1.3 + '@unocss/rule-utils': 66.1.3 - '@unocss/preset-wind@66.1.2': + '@unocss/preset-wind@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/preset-wind3': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/preset-wind3': 66.1.3 - '@unocss/reset@66.1.2': {} + '@unocss/reset@66.1.3': {} - '@unocss/rule-utils@66.1.2': + '@unocss/rule-utils@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 magic-string: 0.30.17 - '@unocss/transformer-attributify-jsx@66.1.2': + '@unocss/transformer-attributify-jsx@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/transformer-compile-class@66.1.2': + '@unocss/transformer-compile-class@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/transformer-directives@66.1.2': + '@unocss/transformer-directives@66.1.3': dependencies: - '@unocss/core': 66.1.2 - '@unocss/rule-utils': 66.1.2 + '@unocss/core': 66.1.3 + '@unocss/rule-utils': 66.1.3 css-tree: 3.1.0 - '@unocss/transformer-variant-group@66.1.2': + '@unocss/transformer-variant-group@66.1.3': dependencies: - '@unocss/core': 66.1.2 + '@unocss/core': 66.1.3 - '@unocss/vite@66.1.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3))': + '@unocss/vite@66.1.3(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3))': dependencies: '@ampproject/remapping': 2.3.0 - '@unocss/config': 66.1.2 - '@unocss/core': 66.1.2 - '@unocss/inspector': 66.1.2(vue@3.5.14(typescript@5.4.3)) + '@unocss/config': 66.1.3 + '@unocss/core': 66.1.3 + '@unocss/inspector': 66.1.3(vue@3.5.16(typescript@5.4.3)) chokidar: 3.6.0 magic-string: 0.30.17 pathe: 2.0.3 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 unplugin-utils: 0.2.4 - vite: 5.4.19(@types/node@22.15.21) + vite: 5.4.19(@types/node@22.15.29) transitivePeerDependencies: - vue - '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3))': dependencies: - vite: 5.4.19(@types/node@22.15.21) - vue: 3.5.14(typescript@5.4.3) + vite: 5.4.19(@types/node@22.15.29) + vue: 3.5.16(typescript@5.4.3) - '@vue/compiler-core@3.5.14': + '@vue/compiler-core@3.5.16': dependencies: - '@babel/parser': 7.27.2 - '@vue/shared': 3.5.14 + '@babel/parser': 7.27.4 + '@vue/shared': 3.5.16 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.14': + '@vue/compiler-dom@3.5.16': dependencies: - '@vue/compiler-core': 3.5.14 - '@vue/shared': 3.5.14 + '@vue/compiler-core': 3.5.16 + '@vue/shared': 3.5.16 - '@vue/compiler-sfc@3.5.14': + '@vue/compiler-sfc@3.5.16': dependencies: - '@babel/parser': 7.27.2 - '@vue/compiler-core': 3.5.14 - '@vue/compiler-dom': 3.5.14 - '@vue/compiler-ssr': 3.5.14 - '@vue/shared': 3.5.14 + '@babel/parser': 7.27.4 + '@vue/compiler-core': 3.5.16 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.3 + postcss: 8.5.4 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.14': + '@vue/compiler-ssr@3.5.16': dependencies: - '@vue/compiler-dom': 3.5.14 - '@vue/shared': 3.5.14 + '@vue/compiler-dom': 3.5.16 + '@vue/shared': 3.5.16 '@vue/devtools-api@7.7.6': dependencies: @@ -2841,46 +2858,46 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.14': + '@vue/reactivity@3.5.16': dependencies: - '@vue/shared': 3.5.14 + '@vue/shared': 3.5.16 - '@vue/runtime-core@3.5.14': + '@vue/runtime-core@3.5.16': dependencies: - '@vue/reactivity': 3.5.14 - '@vue/shared': 3.5.14 + '@vue/reactivity': 3.5.16 + '@vue/shared': 3.5.16 - '@vue/runtime-dom@3.5.14': + '@vue/runtime-dom@3.5.16': dependencies: - '@vue/reactivity': 3.5.14 - '@vue/runtime-core': 3.5.14 - '@vue/shared': 3.5.14 + '@vue/reactivity': 3.5.16 + '@vue/runtime-core': 3.5.16 + '@vue/shared': 3.5.16 csstype: 3.1.3 - '@vue/server-renderer@3.5.14(vue@3.5.14(typescript@5.4.3))': + '@vue/server-renderer@3.5.16(vue@3.5.16(typescript@5.4.3))': dependencies: - '@vue/compiler-ssr': 3.5.14 - '@vue/shared': 3.5.14 - vue: 3.5.14(typescript@5.4.3) + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + vue: 3.5.16(typescript@5.4.3) - '@vue/shared@3.5.14': {} + '@vue/shared@3.5.16': {} '@vueuse/core@12.8.2(typescript@5.4.3)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 '@vueuse/shared': 12.8.2(typescript@5.4.3) - vue: 3.5.14(typescript@5.4.3) + vue: 3.5.16(typescript@5.4.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.4)(typescript@5.4.3)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(typescript@5.4.3)': dependencies: '@vueuse/core': 12.8.2(typescript@5.4.3) '@vueuse/shared': 12.8.2(typescript@5.4.3) - vue: 3.5.14(typescript@5.4.3) + vue: 3.5.16(typescript@5.4.3) optionalDependencies: - focus-trap: 7.6.4 + focus-trap: 7.6.5 transitivePeerDependencies: - typescript @@ -2888,7 +2905,7 @@ snapshots: '@vueuse/shared@12.8.2(typescript@5.4.3)': dependencies: - vue: 3.5.14(typescript@5.4.3) + vue: 3.5.16(typescript@5.4.3) transitivePeerDependencies: - typescript @@ -3169,19 +3186,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@2.4.2)): + eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) - eslint-plugin-vue@10.1.0(eslint@9.27.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.27.0(jiti@2.4.2))): + eslint-plugin-vue@10.1.0(eslint@9.28.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2))): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) - eslint: 9.27.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + eslint: 9.28.0(jiti@2.4.2) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.7.2 - vue-eslint-parser: 10.1.3(eslint@9.27.0(jiti@2.4.2)) + vue-eslint-parser: 10.1.3(eslint@9.28.0(jiti@2.4.2)) xml-name-validator: 4.0.0 eslint-scope@8.3.0: @@ -3193,15 +3210,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.27.0(jiti@2.4.2): + eslint@9.28.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.2 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.27.0 + '@eslint/js': 9.28.0 '@eslint/plugin-kit': 0.3.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -3275,7 +3292,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -3301,7 +3318,7 @@ snapshots: flatted@3.3.3: {} - focus-trap@7.6.4: + focus-trap@7.6.5: dependencies: tabbable: 6.2.0 @@ -3336,13 +3353,13 @@ snapshots: globals@15.15.0: {} - globals@16.1.0: {} + globals@16.2.0: {} globby@14.1.0: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.4 + ignore: 7.0.5 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -3392,7 +3409,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.4: {} + ignore@7.0.5: {} import-fresh@3.3.1: dependencies: @@ -3853,13 +3870,13 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.6: {} + preact@10.26.8: {} prelude-ls@1.2.1: {} @@ -3871,10 +3888,6 @@ snapshots: punycode@2.3.1: {} - pyright@1.1.400: - optionalDependencies: - fsevents: 2.3.3 - quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -3913,30 +3926,30 @@ snapshots: rfdc@1.4.1: {} - rollup@4.41.0: + rollup@4.41.1: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.41.0 - '@rollup/rollup-android-arm64': 4.41.0 - '@rollup/rollup-darwin-arm64': 4.41.0 - '@rollup/rollup-darwin-x64': 4.41.0 - '@rollup/rollup-freebsd-arm64': 4.41.0 - '@rollup/rollup-freebsd-x64': 4.41.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 - '@rollup/rollup-linux-arm-musleabihf': 4.41.0 - '@rollup/rollup-linux-arm64-gnu': 4.41.0 - '@rollup/rollup-linux-arm64-musl': 4.41.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 - '@rollup/rollup-linux-riscv64-gnu': 4.41.0 - '@rollup/rollup-linux-riscv64-musl': 4.41.0 - '@rollup/rollup-linux-s390x-gnu': 4.41.0 - '@rollup/rollup-linux-x64-gnu': 4.41.0 - '@rollup/rollup-linux-x64-musl': 4.41.0 - '@rollup/rollup-win32-arm64-msvc': 4.41.0 - '@rollup/rollup-win32-ia32-msvc': 4.41.0 - '@rollup/rollup-win32-x64-msvc': 4.41.0 + '@rollup/rollup-android-arm-eabi': 4.41.1 + '@rollup/rollup-android-arm64': 4.41.1 + '@rollup/rollup-darwin-arm64': 4.41.1 + '@rollup/rollup-darwin-x64': 4.41.1 + '@rollup/rollup-freebsd-arm64': 4.41.1 + '@rollup/rollup-freebsd-x64': 4.41.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 + '@rollup/rollup-linux-arm-musleabihf': 4.41.1 + '@rollup/rollup-linux-arm64-gnu': 4.41.1 + '@rollup/rollup-linux-arm64-musl': 4.41.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-gnu': 4.41.1 + '@rollup/rollup-linux-riscv64-musl': 4.41.1 + '@rollup/rollup-linux-s390x-gnu': 4.41.1 + '@rollup/rollup-linux-x64-gnu': 4.41.1 + '@rollup/rollup-linux-x64-musl': 4.41.1 + '@rollup/rollup-win32-arm64-msvc': 4.41.1 + '@rollup/rollup-win32-ia32-msvc': 4.41.1 + '@rollup/rollup-win32-x64-msvc': 4.41.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4009,7 +4022,7 @@ snapshots: dependencies: has-flag: 4.0.0 - synckit@0.9.2: + synckit@0.9.3: dependencies: '@pkgr/core': 0.1.2 tslib: 2.8.1 @@ -4024,9 +4037,9 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: @@ -4049,12 +4062,12 @@ snapshots: type-fest@4.41.0: {} - typescript-eslint@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3): + typescript-eslint@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.4.3) - eslint: 9.27.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.4.3) + eslint: 9.28.0(jiti@2.4.2) typescript: 5.4.3 transitivePeerDependencies: - supports-color @@ -4104,29 +4117,29 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - unocss@66.1.2(postcss@8.5.3)(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)): - dependencies: - '@unocss/astro': 66.1.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)) - '@unocss/cli': 66.1.2 - '@unocss/core': 66.1.2 - '@unocss/postcss': 66.1.2(postcss@8.5.3) - '@unocss/preset-attributify': 66.1.2 - '@unocss/preset-icons': 66.1.2 - '@unocss/preset-mini': 66.1.2 - '@unocss/preset-tagify': 66.1.2 - '@unocss/preset-typography': 66.1.2 - '@unocss/preset-uno': 66.1.2 - '@unocss/preset-web-fonts': 66.1.2 - '@unocss/preset-wind': 66.1.2 - '@unocss/preset-wind3': 66.1.2 - '@unocss/preset-wind4': 66.1.2 - '@unocss/transformer-attributify-jsx': 66.1.2 - '@unocss/transformer-compile-class': 66.1.2 - '@unocss/transformer-directives': 66.1.2 - '@unocss/transformer-variant-group': 66.1.2 - '@unocss/vite': 66.1.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)) + unocss@66.1.3(postcss@8.5.4)(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)): + dependencies: + '@unocss/astro': 66.1.3(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)) + '@unocss/cli': 66.1.3 + '@unocss/core': 66.1.3 + '@unocss/postcss': 66.1.3(postcss@8.5.4) + '@unocss/preset-attributify': 66.1.3 + '@unocss/preset-icons': 66.1.3 + '@unocss/preset-mini': 66.1.3 + '@unocss/preset-tagify': 66.1.3 + '@unocss/preset-typography': 66.1.3 + '@unocss/preset-uno': 66.1.3 + '@unocss/preset-web-fonts': 66.1.3 + '@unocss/preset-wind': 66.1.3 + '@unocss/preset-wind3': 66.1.3 + '@unocss/preset-wind4': 66.1.3 + '@unocss/transformer-attributify-jsx': 66.1.3 + '@unocss/transformer-compile-class': 66.1.3 + '@unocss/transformer-directives': 66.1.3 + '@unocss/transformer-variant-group': 66.1.3 + '@unocss/vite': 66.1.3(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)) optionalDependencies: - vite: 5.4.19(@types/node@22.15.21) + vite: 5.4.19(@types/node@22.15.29) transitivePeerDependencies: - postcss - supports-color @@ -4158,37 +4171,37 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.19(@types/node@22.15.21): + vite@5.4.19(@types/node@22.15.29): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.41.0 + postcss: 8.5.4 + rollup: 4.41.1 optionalDependencies: - '@types/node': 22.15.21 + '@types/node': 22.15.29 fsevents: 2.3.3 - vitepress@1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.21)(postcss@8.5.3)(search-insights@2.13.0)(typescript@5.4.3): + vitepress@1.6.3(@algolia/client-search@5.25.0)(@types/node@22.15.29)(postcss@8.5.4)(search-insights@2.13.0)(typescript@5.4.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.25.0)(search-insights@2.13.0) - '@iconify-json/simple-icons': 1.2.35 + '@iconify-json/simple-icons': 1.2.36 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@22.15.21))(vue@3.5.14(typescript@5.4.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@22.15.29))(vue@3.5.16(typescript@5.4.3)) '@vue/devtools-api': 7.7.6 - '@vue/shared': 3.5.14 + '@vue/shared': 3.5.16 '@vueuse/core': 12.8.2(typescript@5.4.3) - '@vueuse/integrations': 12.8.2(focus-trap@7.6.4)(typescript@5.4.3) - focus-trap: 7.6.4 + '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(typescript@5.4.3) + focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.19(@types/node@22.15.21) - vue: 3.5.14(typescript@5.4.3) + vite: 5.4.19(@types/node@22.15.29) + vue: 3.5.16(typescript@5.4.3) optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.4 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -4216,10 +4229,10 @@ snapshots: - typescript - universal-cookie - vue-eslint-parser@10.1.3(eslint@9.27.0(jiti@2.4.2)): + vue-eslint-parser@10.1.3(eslint@9.28.0(jiti@2.4.2)): dependencies: debug: 4.4.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.28.0(jiti@2.4.2) eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -4229,17 +4242,17 @@ snapshots: transitivePeerDependencies: - supports-color - vue-flow-layout@0.1.1(vue@3.5.14(typescript@5.4.3)): + vue-flow-layout@0.1.1(vue@3.5.16(typescript@5.4.3)): dependencies: - vue: 3.5.14(typescript@5.4.3) + vue: 3.5.16(typescript@5.4.3) - vue@3.5.14(typescript@5.4.3): + vue@3.5.16(typescript@5.4.3): dependencies: - '@vue/compiler-dom': 3.5.14 - '@vue/compiler-sfc': 3.5.14 - '@vue/runtime-dom': 3.5.14 - '@vue/server-renderer': 3.5.14(vue@3.5.14(typescript@5.4.3)) - '@vue/shared': 3.5.14 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-sfc': 3.5.16 + '@vue/runtime-dom': 3.5.16 + '@vue/server-renderer': 3.5.16(vue@3.5.16(typescript@5.4.3)) + '@vue/shared': 3.5.16 optionalDependencies: typescript: 5.4.3 diff --git a/pyproject.toml b/pyproject.toml index b09d387..bedcc51 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,9 +60,10 @@ dev = [ ] lint = [ "ruff>=0.6", - "mypy>=1", "pylint>=3", "pylint-pydantic>=0.3", + "basedpyright>=1", + "mypy>=1", ] docs = [ "sophia-doc>=0.1", @@ -138,18 +139,25 @@ keep-runtime-typing = true "examples/plugins/*.py" = ["D", "T", "ANN"] "tests/*.py" = ["D", "PLR2004"] -[tool.pyright] +[tool.basedpyright] ignore = ["examples/plugins"] extraPaths = ["tests", "tests/test_utils"] pythonVersion = "3.9" pythonPlatform = "All" -typeCheckingMode = "strict" +typeCheckingMode = "recommended" +reportImportCycles = false reportUnnecessaryIsInstance = false -reportCallInDefaultInitializer = true -reportImplicitOverride = true -reportPropertyTypeMismatch = true -reportShadowedImports = true -reportUninitializedInstanceVariable = true +reportImplicitStringConcatenation = false +reportUnusedCallResult = false +reportUnnecessaryTypeIgnoreComment = false +# basedpyright exclusive settings +reportUnreachable = false +reportAny = false +reportExplicitAny = false +reportIgnoreCommentWithoutRule = false +reportUnusedParameter = false +reportUnannotatedClassAttribute = false +enableTypeIgnoreComments = true [tool.mypy] python_version = "3.9" diff --git a/tests/fake_adapter.py b/tests/fake_adapter.py index cd28128..678d29f 100644 --- a/tests/fake_adapter.py +++ b/tests/fake_adapter.py @@ -20,7 +20,7 @@ async def allow_schedule_other_tasks() -> None: """让出当前任务,允许其他任务执行。""" - for _ in range(50): + for _ in range(100): await checkpoint() diff --git a/tests/test_adapter/test_adapter.py b/tests/test_adapter/test_adapter.py index 5d26efe..43d87ef 100644 --- a/tests/test_adapter/test_adapter.py +++ b/tests/test_adapter/test_adapter.py @@ -21,7 +21,7 @@ async def run(self) -> None: self.bot.exit() bot.load_adapters(TestAdapter) - with pytest.raises(ExceptionGroup) as exc_info: # pyright: ignore[reportUnknownVariableType] + with pytest.raises(ExceptionGroup) as exc_info: bot.run() assert exc_info.group_contains(RuntimeError) @@ -34,6 +34,6 @@ async def run(self) -> None: raise RuntimeError bot.load_adapters(TestAdapter) - with pytest.raises(ExceptionGroup) as exc_info: # pyright: ignore[reportUnknownVariableType] + with pytest.raises(ExceptionGroup) as exc_info: bot.run() assert exc_info.group_contains(RuntimeError) diff --git a/tests/test_plugin/test_plugin.py b/tests/test_plugin/test_plugin.py index 1e944bd..cd6a3e6 100644 --- a/tests/test_plugin/test_plugin.py +++ b/tests/test_plugin/test_plugin.py @@ -184,6 +184,6 @@ async def handle(self) -> None: bot.load_adapters(fake_adapter_class_factory(fake_message_event_factor)) bot.load_plugins(TestPlugin) - with pytest.raises(ExceptionGroup) as exc_info: # pyright: ignore[reportUnknownVariableType] + with pytest.raises(ExceptionGroup) as exc_info: bot.run() assert exc_info.group_contains(HandleError) diff --git a/tests/test_plugin/test_plugin_load.py b/tests/test_plugin/test_plugin_load.py index 0d71e3c..b8dacee 100644 --- a/tests/test_plugin/test_plugin_load.py +++ b/tests/test_plugin/test_plugin_load.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing_extensions import override import pytest from pytest_mock import MockerFixture @@ -26,6 +27,14 @@ def test_plugin_load_error(bot: Bot) -> None: class TestPlugin(Plugin): priority = -1 + @override + async def handle(self) -> None: + pass + + @override + async def rule(self) -> bool: + return True + bot = Bot() with capture_logs() as cap_logs: diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py index f6daf59..a3b7c42 100644 --- a/tests/test_utils/test_utils.py +++ b/tests/test_utils/test_utils.py @@ -1,5 +1,5 @@ import json -from abc import ABC +from abc import ABCMeta from collections.abc import Generator from contextlib import contextmanager @@ -25,7 +25,7 @@ class ConfigClass(ConfigModel): class NotConfigClass: pass - class AbstractConfigClass(ABC, BaseModel): + class AbstractConfigClass(BaseModel, metaclass=ABCMeta): __config_name__ = "test_config_model" class PydanticModel(BaseModel): diff --git a/uv.lock b/uv.lock index 8ffc8a8..8a39723 100644 --- a/uv.lock +++ b/uv.lock @@ -200,6 +200,7 @@ docs = [ { name = "tomlkit" }, ] lint = [ + { name = "basedpyright" }, { name = "mypy" }, { name = "pylint" }, { name = "pylint-pydantic" }, @@ -250,6 +251,7 @@ docs = [ { name = "tomlkit", specifier = ">=0.13" }, ] lint = [ + { name = "basedpyright", specifier = ">=1" }, { name = "mypy", specifier = ">=1" }, { name = "pylint", specifier = ">=3" }, { name = "pylint-pydantic", specifier = ">=0.3" }, @@ -398,6 +400,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] +[[package]] +name = "basedpyright" +version = "1.29.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodejs-wheel-binaries" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/db/fcfced6e89a49b52694d51078c2cf626b3fe9d097c1145bb8424337d7ae6/basedpyright-1.29.2.tar.gz", hash = "sha256:12c49186003b9f69a028615da883ef97035ea2119a9e3f93a00091b3a27088a6", size = 21966851, upload-time = "2025-05-21T11:45:43.03Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/b7/8307208ab517ac6e5d0331ad7347624fe8b250fb6e659ba3bd081d82c890/basedpyright-1.29.2-py3-none-any.whl", hash = "sha256:f389e2997de33d038c5065fd85bff351fbdc62fa6d6371c7b947fc3bce8d437d", size = 11472099, upload-time = "2025-05-21T11:45:38.785Z" }, +] + [[package]] name = "cffi" version = "1.17.1" @@ -882,6 +896,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "nodejs-wheel-binaries" +version = "22.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/c6/66f36b7b0d528660dfb4a59cb9b8dd6a3f4c0a3939cd49c404a775ea4a63/nodejs_wheel_binaries-22.16.0.tar.gz", hash = "sha256:d695832f026df3a0cf9a089d222225939de9d1b67f8f0a353b79f015aabbe7e2", size = 8061, upload-time = "2025-05-22T07:27:52.149Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/dc/417a5c5f99e53a5d2b3be122506312731eb90fb9630c248e327e2e38cc6b/nodejs_wheel_binaries-22.16.0-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:986b715a96ed703f8ce0c15712f76fc42895cf09067d72b6ef29e8b334eccf64", size = 50957501, upload-time = "2025-05-22T07:27:20.132Z" }, + { url = "https://files.pythonhosted.org/packages/0e/dd/d6ce48209ed15f5d1fccb29eeaa111f962557123eaf4fd03a7316c42734c/nodejs_wheel_binaries-22.16.0-py2.py3-none-macosx_11_0_x86_64.whl", hash = "sha256:4ae3cf22138891cb44c3ee952862a257ce082b098b29024d7175684a9a77b0c0", size = 51891634, upload-time = "2025-05-22T07:27:24.029Z" }, + { url = "https://files.pythonhosted.org/packages/80/fa/a07e622fd87717eec3e5cff41575f85ad62717e8698884d28ca809266ca1/nodejs_wheel_binaries-22.16.0-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71f2de4dc0b64ae43e146897ce811f80ac4f9acfbae6ccf814226282bf4ef174", size = 57857862, upload-time = "2025-05-22T07:27:27.933Z" }, + { url = "https://files.pythonhosted.org/packages/1f/80/52736f9570a93f8e6b7942981dc9770eca2bc7aa1d200c1d54198374a6ca/nodejs_wheel_binaries-22.16.0-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbfccbcd558d2f142ccf66d8c3a098022bf4436db9525b5b8d32169ce185d99e", size = 58395868, upload-time = "2025-05-22T07:27:32.088Z" }, + { url = "https://files.pythonhosted.org/packages/0f/0e/53616a5ed8fc1fbe9e48bf132862da5a9abf5cc7f8483dab1722ec257187/nodejs_wheel_binaries-22.16.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:447ad796850eb52ca20356ad39b2d296ed8fef3f214921f84a1ccdad49f2eba1", size = 59712469, upload-time = "2025-05-22T07:27:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cd/e2b5083df581fc1d08eb93feb6f8fbd3d56b113cef9b59d8e0fb7d4dd4f3/nodejs_wheel_binaries-22.16.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7f526ca6a132b0caf633566a2a78c6985fe92857e7bfdb37380f76205a10b808", size = 60763005, upload-time = "2025-05-22T07:27:41.39Z" }, + { url = "https://files.pythonhosted.org/packages/71/8d/57112b49214e8bd636f3cc3386eba6be4d23552ec8a0f6efbe814013caa7/nodejs_wheel_binaries-22.16.0-py2.py3-none-win_amd64.whl", hash = "sha256:2fffb4bf1066fb5f660da20819d754f1b424bca1b234ba0f4fa901c52e3975fb", size = 41313324, upload-time = "2025-05-22T07:27:45.293Z" }, + { url = "https://files.pythonhosted.org/packages/91/03/a852711aec73dfb965844592dfe226024c0da28e37d1ee54083342e38f57/nodejs_wheel_binaries-22.16.0-py2.py3-none-win_arm64.whl", hash = "sha256:2728972d336d436d39ee45988978d8b5d963509e06f063e80fe41b203ee80b28", size = 38828154, upload-time = "2025-05-22T07:27:48.606Z" }, +] + [[package]] name = "outcome" version = "1.3.0.post0"