From e58174f6ec93efed850b7df6a7a965bde6c2d7fb Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 9 Oct 2020 20:26:39 +0800 Subject: [PATCH 01/64] :memo: remove outdated docs --- docs/guide/README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/guide/README.md b/docs/guide/README.md index 6cf31e90..86397ee2 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -20,11 +20,7 @@ NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人 ## 它如何工作? -NoneBot 的运行离不开 酷 Q 和 CQHTTP 插件。酷 Q 扮演着「无头 QQ 客户端」的角色,它进行实际的消息、通知、请求的接收和发送,当 酷 Q 收到消息时,它将这个消息包装为一个事件(通知和请求同理),并通过它自己的插件机制将事件传送给 CQHTTP 插件,后者再根据其配置中的 `post_url` 或 `ws_reverse_url` 等项来将事件发送至 NoneBot。 - -在 NoneBot 收到事件前,它底层的 aiocqhttp 实际已经先看到了事件,aiocqhttp 根据事件的类型信息,通知到 NoneBot 的相应函数。特别地,对于消息类型的事件,还将消息内容转换成了 `aiocqhttp.message.Message` 类型,以便处理。 - -NoneBot 的事件处理函数收到通知后,对于不同类型的事件,再做相应的预处理和解析,然后调用对应的插件,并向其提供适合此类事件的会话(Session)对象。NoneBot 插件的编写者要做的,就是利用 Session 对象中提供的数据,在插件的处理函数中实现所需的功能。 +~~未填坑~~ ## 特色 From b4e0034876d7eeb8a9be65e4444a01eaa2003ddf Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 10 Oct 2020 23:40:01 +0800 Subject: [PATCH 02/64] :bulb: add driver docstring --- nonebot/drivers/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/nonebot/drivers/__init__.py b/nonebot/drivers/__init__.py index af8587d1..396622ed 100644 --- a/nonebot/drivers/__init__.py +++ b/nonebot/drivers/__init__.py @@ -1,5 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +后端驱动适配基类 +=============== + +各驱动请继承以下基类 +""" import abc @@ -9,7 +15,15 @@ from nonebot.typing import Bot, Dict, Type, Union, Optional, Callable class BaseDriver(abc.ABC): + """ + Driver 基类。将后端框架封装,以满足适配器使用。 + """ + _adapters: Dict[str, Type[Bot]] = {} + """ + :类型: ``Dict[str, Type[Bot]]`` + :说明: 已注册的适配器列表 + """ @abc.abstractmethod def __init__(self, env: Env, config: Config): From a68ba09910e7ba9af4c345cd98818aa060068373 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 11 Oct 2020 13:17:40 +0800 Subject: [PATCH 03/64] :memo: Update docs --- archive/2.0.0a2/api/adapters/README.md | 41 -- archive/{2.0.0a2 => 2.0.0a3}/README.md | 0 archive/{2.0.0a2 => 2.0.0a3}/api/README.md | 26 +- archive/2.0.0a3/api/adapters/README.md | 323 ++++++++++++ .../api/adapters/cqhttp.md | 4 +- archive/{2.0.0a2 => 2.0.0a3}/api/config.md | 4 +- archive/2.0.0a3/api/drivers/README.md | 37 ++ archive/2.0.0a3/api/drivers/fastapi.md | 16 + archive/{2.0.0a2 => 2.0.0a3}/api/exception.md | 0 archive/{2.0.0a2 => 2.0.0a3}/api/log.md | 0 archive/2.0.0a3/api/matcher.md | 485 ++++++++++++++++++ archive/{2.0.0a2 => 2.0.0a3}/api/nonebot.md | 49 ++ .../{2.0.0a2 => 2.0.0a3}/api/permission.md | 0 archive/{2.0.0a2 => 2.0.0a3}/api/rule.md | 84 ++- archive/{2.0.0a2 => 2.0.0a3}/api/sched.md | 0 archive/{2.0.0a2 => 2.0.0a3}/api/typing.md | 0 archive/{2.0.0a2 => 2.0.0a3}/api/utils.md | 0 archive/{2.0.0a2 => 2.0.0a3}/guide/README.md | 6 +- .../guide/basic-configuration.md | 0 .../guide/creating-a-project.md | 0 .../guide/getting-started.md | 0 .../guide/installation.md | 0 .../guide/writing-a-plugin.md | 0 .../{2.0.0a2 => 2.0.0a3}/sidebar.config.json | 32 +- docs/.vuepress/config.js | 8 + docs/.vuepress/versions.json | 2 +- docs/api/README.md | 6 + docs/api/drivers/README.md | 37 ++ docs/api/drivers/fastapi.md | 16 + docs_build/README.rst | 2 + docs_build/drivers/README.rst | 13 + docs_build/drivers/fastapi.rst | 13 + 32 files changed, 1134 insertions(+), 70 deletions(-) delete mode 100644 archive/2.0.0a2/api/adapters/README.md rename archive/{2.0.0a2 => 2.0.0a3}/README.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/api/README.md (72%) create mode 100644 archive/2.0.0a3/api/adapters/README.md rename archive/{2.0.0a2 => 2.0.0a3}/api/adapters/cqhttp.md (98%) rename archive/{2.0.0a2 => 2.0.0a3}/api/config.md (98%) create mode 100644 archive/2.0.0a3/api/drivers/README.md create mode 100644 archive/2.0.0a3/api/drivers/fastapi.md rename archive/{2.0.0a2 => 2.0.0a3}/api/exception.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/api/log.md (100%) create mode 100644 archive/2.0.0a3/api/matcher.md rename archive/{2.0.0a2 => 2.0.0a3}/api/nonebot.md (74%) rename archive/{2.0.0a2 => 2.0.0a3}/api/permission.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/api/rule.md (51%) rename archive/{2.0.0a2 => 2.0.0a3}/api/sched.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/api/typing.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/api/utils.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/README.md (63%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/basic-configuration.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/creating-a-project.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/getting-started.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/installation.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/guide/writing-a-plugin.md (100%) rename archive/{2.0.0a2 => 2.0.0a3}/sidebar.config.json (86%) create mode 100644 docs/api/drivers/README.md create mode 100644 docs/api/drivers/fastapi.md create mode 100644 docs_build/drivers/README.rst create mode 100644 docs_build/drivers/fastapi.rst diff --git a/archive/2.0.0a2/api/adapters/README.md b/archive/2.0.0a2/api/adapters/README.md deleted file mode 100644 index b6529990..00000000 --- a/archive/2.0.0a2/api/adapters/README.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -contentSidebar: true -sidebarDepth: 0 ---- - -# NoneBot.adapters 模块 - - -## _class_ `BaseBot` - -基类:`abc.ABC` - - -## _class_ `BaseEvent` - -基类:`abc.ABC` - - -### `_raw_event` - -原始 event - - -## _class_ `BaseMessageSegment` - -基类:`abc.ABC` - - -## _class_ `BaseMessage` - -基类:`list`, `abc.ABC` - - -### `append(obj)` - -Append object to the end of the list. - - -### `extend(obj)` - -Extend list by appending elements from the iterable. diff --git a/archive/2.0.0a2/README.md b/archive/2.0.0a3/README.md similarity index 100% rename from archive/2.0.0a2/README.md rename to archive/2.0.0a3/README.md diff --git a/archive/2.0.0a2/api/README.md b/archive/2.0.0a3/api/README.md similarity index 72% rename from archive/2.0.0a2/api/README.md rename to archive/2.0.0a3/api/README.md index 1c8acf1b..52c6e9f6 100644 --- a/archive/2.0.0a2/api/README.md +++ b/archive/2.0.0a3/api/README.md @@ -7,16 +7,10 @@ * [nonebot](nonebot.html) - * [nonebot.typing](typing.html) - - * [nonebot.config](config.html) - * [nonebot.sched](sched.html) - - - * [nonebot.log](log.html) + * [nonebot.matcher](matcher.html) * [nonebot.rule](rule.html) @@ -25,10 +19,28 @@ * [nonebot.permission](permission.html) + * [nonebot.sched](sched.html) + + + * [nonebot.log](log.html) + + * [nonebot.utils](utils.html) + * [nonebot.typing](typing.html) + + * [nonebot.exception](exception.html) + * [nonebot.drivers](drivers/) + + + * [nonebot.drivers.fastapi](drivers/fastapi.html) + + + * [nonebot.adapters](adapters/) + + * [nonebot.adapters.cqhttp](adapters/cqhttp.html) diff --git a/archive/2.0.0a3/api/adapters/README.md b/archive/2.0.0a3/api/adapters/README.md new file mode 100644 index 00000000..f3f937ec --- /dev/null +++ b/archive/2.0.0a3/api/adapters/README.md @@ -0,0 +1,323 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.adapters 模块 + +## 协议适配基类 + +各协议请继承以下基类,并使用 `driver.register_adapter` 注册适配器 + + +## _class_ `BaseBot` + +基类:`abc.ABC` + +Bot 基类。用于处理上报消息,并提供 API 调用接口。 + + +### _abstract_ `__init__(driver, connection_type, config, self_id, *, websocket=None)` + + +* **参数** + + + * `driver: Driver`: Driver 对象 + + + * `connection_type: str`: http 或者 websocket + + + * `config: Config`: Config 对象 + + + * `self_id: str`: 机器人 ID + + + * `websocket: Optional[WebSocket]`: Websocket 连接对象 + + + +### `driver` + +Driver 对象 + + +### `connection_type` + +连接类型 + + +### `config` + +Config 配置对象 + + +### `self_id` + +机器人 ID + + +### `websocket` + +Websocket 连接对象 + + +### _abstract property_ `type` + +Adapter 类型 + + +### _abstract async_ `handle_message(message)` + + +* **说明** + + 处理上报消息的函数,转换为 `Event` 事件后调用 `nonebot.message.handle_event` 进一步处理事件。 + + + +* **参数** + + + * `message: dict`: 收到的上报消息 + + + +### _abstract async_ `call_api(api, **data)` + + +* **说明** + + 调用机器人 API 接口,可以通过该函数或直接通过 bot 属性进行调用 + + + +* **参数** + + + * `api: str`: API 名称 + + + * `**data`: API 数据 + + + +* **示例** + + +```python +await bot.call_api("send_msg", data={"message": "hello world"}) +await bot.send_msg(message="hello world") +``` + + +### _abstract async_ `send(event, message, **kwargs)` + + +* **说明** + + 调用机器人基础发送消息接口 + + + +* **参数** + + + * `event: Event`: 上报事件 + + + * `message: Union[str, Message, MessageSegment]`: 要发送的消息 + + + * `**kwargs` + + + +## _class_ `BaseEvent` + +基类:`abc.ABC` + +Event 基类。提供上报信息的关键信息,其余信息可从原始上报消息获取。 + + +### `__init__(raw_event)` + + +* **参数** + + + * `raw_event: dict`: 原始上报消息 + + + +### _property_ `raw_event` + +原始上报消息 + + +### _abstract property_ `id` + +事件 ID + + +### _abstract property_ `name` + +事件名称 + + +### _abstract property_ `self_id` + +机器人 ID + + +### _abstract property_ `time` + +事件发生时间 + + +### _abstract property_ `type` + +事件主类型 + + +### _abstract property_ `detail_type` + +事件详细类型 + + +### _abstract property_ `sub_type` + +事件子类型 + + +### _abstract property_ `user_id` + +触发事件的主体 ID + + +### _abstract property_ `group_id` + +触发事件的主体群 ID + + +### _abstract property_ `to_me` + +事件是否为发送给机器人的消息 + + +### _abstract property_ `message` + +消息内容 + + +### _abstract property_ `reply` + +回复的消息 + + +### _abstract property_ `raw_message` + +原始消息 + + +### _abstract property_ `plain_text` + +纯文本消息 + + +### _abstract property_ `sender` + +消息发送者信息 + + +## _class_ `BaseMessageSegment` + +基类:`abc.ABC` + +消息段基类 + + +### `type` + + +* 类型: `str` + + +* 说明: 消息段类型 + + +### `data` + + +* 类型: `Dict[str, Union[str, list]]` + + +* 说明: 消息段数据 + + +## _class_ `BaseMessage` + +基类:`list`, `abc.ABC` + +消息数组 + + +### `__init__(message=None, *args, **kwargs)` + + +* **参数** + + + * `message: Union[str, dict, list, MessageSegment, Message]`: 消息内容 + + + +### `append(obj)` + + +* **说明** + + 添加一个消息段到消息数组末尾 + + + +* **参数** + + + * `obj: Union[str, MessageSegment]`: 要添加的消息段 + + + +### `extend(obj)` + + +* **说明** + + 拼接一个消息数组或多个消息段到消息数组末尾 + + + +* **参数** + + + * `obj: Union[Message, Iterable[MessageSegment]]`: 要添加的消息数组 + + + +### `reduce()` + + +* **说明** + + 缩减消息数组,即拼接相邻纯文本消息段 + + + +### `extract_plain_text()` + + +* **说明** + + 提取消息内纯文本消息 diff --git a/archive/2.0.0a2/api/adapters/cqhttp.md b/archive/2.0.0a3/api/adapters/cqhttp.md similarity index 98% rename from archive/2.0.0a2/api/adapters/cqhttp.md rename to archive/2.0.0a3/api/adapters/cqhttp.md index 53fa04f9..aae78f86 100644 --- a/archive/2.0.0a2/api/adapters/cqhttp.md +++ b/archive/2.0.0a3/api/adapters/cqhttp.md @@ -323,10 +323,10 @@ CQHTTP 协议 Event 适配。继承属性参考 [BaseEvent](./#class-baseevent) ### _property_ `sub_type` -* 类型: `str` +* 类型: `Optional[str]` -* 说明: 事件类型 +* 说明: 事件子类型 ### _property_ `user_id` diff --git a/archive/2.0.0a2/api/config.md b/archive/2.0.0a3/api/config.md similarity index 98% rename from archive/2.0.0a2/api/config.md rename to archive/2.0.0a3/api/config.md index fd90f50e..6943427b 100644 --- a/archive/2.0.0a2/api/config.md +++ b/archive/2.0.0a3/api/config.md @@ -194,10 +194,10 @@ SUPER_USERS=[12345789] ### `nickname` -* 类型: `Union[str, Set[str]]` +* 类型: `Set[str]` -* 默认值: `""` +* 默认值: `set()` * 说明: diff --git a/archive/2.0.0a3/api/drivers/README.md b/archive/2.0.0a3/api/drivers/README.md new file mode 100644 index 00000000..f78812f0 --- /dev/null +++ b/archive/2.0.0a3/api/drivers/README.md @@ -0,0 +1,37 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.drivers 模块 + +## 后端驱动适配基类 + +各驱动请继承以下基类 + + +## _class_ `BaseDriver` + +基类:`abc.ABC` + +Driver 基类。将后端框架封装,以满足适配器使用。 + + +### `_adapters` + + +* **类型** + + `Dict[str, Type[Bot]]` + + + +* **说明** + + 已注册的适配器列表 + + + +### _abstract_ `__init__(env, config)` + +Initialize self. See help(type(self)) for accurate signature. diff --git a/archive/2.0.0a3/api/drivers/fastapi.md b/archive/2.0.0a3/api/drivers/fastapi.md new file mode 100644 index 00000000..029c9bc8 --- /dev/null +++ b/archive/2.0.0a3/api/drivers/fastapi.md @@ -0,0 +1,16 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.drivers.fastapi 模块 + + +## _class_ `Driver` + +基类:[`nonebot.drivers.BaseDriver`](#None) + + +### `__init__(env, config)` + +Initialize self. See help(type(self)) for accurate signature. diff --git a/archive/2.0.0a2/api/exception.md b/archive/2.0.0a3/api/exception.md similarity index 100% rename from archive/2.0.0a2/api/exception.md rename to archive/2.0.0a3/api/exception.md diff --git a/archive/2.0.0a2/api/log.md b/archive/2.0.0a3/api/log.md similarity index 100% rename from archive/2.0.0a2/api/log.md rename to archive/2.0.0a3/api/log.md diff --git a/archive/2.0.0a3/api/matcher.md b/archive/2.0.0a3/api/matcher.md new file mode 100644 index 00000000..c1176030 --- /dev/null +++ b/archive/2.0.0a3/api/matcher.md @@ -0,0 +1,485 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.matcher 模块 + +## 事件响应器 + +该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行 对话 。 + + +## `matchers` + + +* **类型** + + `Dict[int, List[Type[Matcher]]]` + + + +* **说明** + + 用于存储当前所有的事件响应器 + + + +## _class_ `Matcher` + +基类:`object` + +事件响应器类 + + +### `module` + + +* **类型** + + `Optional[str]` + + + +* **说明** + + 事件响应器所在模块名称 + + + +### `type` + + +* **类型** + + `str` + + + +* **说明** + + 事件响应器类型 + + + +### `rule` + + +* **类型** + + `Rule` + + + +* **说明** + + 事件响应器匹配规则 + + + +### `permission` + + +* **类型** + + `Permission` + + + +* **说明** + + 事件响应器触发权限 + + + +### `priority` + + +* **类型** + + `int` + + + +* **说明** + + 事件响应器优先级 + + + +### `block` + + +* **类型** + + `bool` + + + +* **说明** + + 事件响应器是否阻止事件传播 + + + +### `temp` + + +* **类型** + + `bool` + + + +* **说明** + + 事件响应器是否为临时 + + + +### `expire_time` + + +* **类型** + + `Optional[datetime]` + + + +* **说明** + + 事件响应器过期时间点 + + + +### `_default_state` + + +* **类型** + + `dict` + + + +* **说明** + + 事件响应器默认状态 + + + +### `_default_parser` + + +* **类型** + + `Optional[ArgsParser]` + + + +* **说明** + + 事件响应器默认参数解析函数 + + + +### `__init__()` + +实例化 Matcher 以便运行 + + +### `handlers` + + +* **类型** + + `List[Handler]` + + + +* **说明** + + 事件响应器拥有的事件处理函数列表 + + + +### _classmethod_ `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, expire_time=None)` + + +* **说明** + + 创建一个新的事件响应器,并存储至 [matchers](#matchers) + + + +* **参数** + + + * `type_: str`: 事件响应器类型,与 `event.type` 一致时触发,空字符串表示任意 + + + * `rule: Optional[Rule]`: 匹配规则 + + + * `permission: Optional[Permission]`: 权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器,即触发一次后删除 + + + * `priority: int`: 响应优先级 + + + * `block: bool`: 是否阻止事件向更低优先级的响应器传播 + + + * `module: Optional[str]`: 事件响应器所在模块名称 + + + * `default_state: Optional[dict]`: 默认状态 `state` + + + * `expire_time: Optional[datetime]`: 事件响应器最终有效时间点,过时即被删除 + + + +* **返回** + + + * `Type[Matcher]`: 新的事件响应器类 + + + +### _async classmethod_ `check_perm(bot, event)` + + +* **说明** + + 检查是否满足触发权限 + + + +* **参数** + + + * `bot: Bot`: Bot 对象 + + + * `event: Event`: 上报事件 + + + +* **返回** + + + * `bool`: 是否满足权限 + + + +### _async classmethod_ `check_rule(bot, event, state)` + + +* **说明** + + 检查是否满足匹配规则 + + + +* **参数** + + + * `bot: Bot`: Bot 对象 + + + * `event: Event`: 上报事件 + + + * `state: dict`: 当前状态 + + + +* **返回** + + + * `bool`: 是否满足匹配规则 + + + +### _classmethod_ `args_parser(func)` + + +* **说明** + + 装饰一个函数来更改当前事件响应器的默认参数解析函数 + + + +* **参数** + + + * `func: ArgsParser`: 参数解析函数 + + + +### _classmethod_ `handle()` + + +* **说明** + + 装饰一个函数来向事件响应器直接添加一个处理函数 + + + +* **参数** + + + * 无 + + + +### _classmethod_ `receive()` + + +* **说明** + + 装饰一个函数来指示 NoneBot 在接收用户新的一条消息后继续运行该函数 + + + +* **参数** + + + * 无 + + + +### _classmethod_ `got(key, prompt=None, args_parser=None)` + + +* **说明** + + 装饰一个函数来指示 NoneBot 当要获取的 `key` 不存在时接收用户新的一条消息并经过 `ArgsParser` 处理后再运行该函数,如果 `key` 已存在则直接继续运行 + + + +* **参数** + + + * `key: str`: 参数名 + + + * `prompt: Optional[Union[str, Message, MessageSegment]]`: 在参数不存在时向用户发送的消息 + + + * `args_parser: Optional[ArgsParser]`: 可选参数解析函数,空则使用默认解析函数 + + + +### _async classmethod_ `send(message)` + + +* **说明** + + 发送一条消息给当前交互用户 + + + +* **参数** + + + * `message: Union[str, Message, MessageSegment]`: 消息内容 + + + +### _async classmethod_ `finish(message=None)` + + +* **说明** + + 发送一条消息给当前交互用户并结束当前事件响应器 + + + +* **参数** + + + * `message: Union[str, Message, MessageSegment]`: 消息内容 + + + +### _async classmethod_ `pause(prompt=None)` + + +* **说明** + + 发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后继续下一个处理函数 + + + +* **参数** + + + * `prompt: Union[str, Message, MessageSegment]`: 消息内容 + + + +### _async classmethod_ `reject(prompt=None)` + + +* **说明** + + 发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后重新运行当前处理函数 + + + +* **参数** + + + * `prompt: Union[str, Message, MessageSegment]`: 消息内容 + + + +## _class_ `MatcherGroup` + +基类:`object` + +事件响应器组合,统一管理。用法同 `Matcher` + + +### `__init__(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, expire_time=None)` + + +* **说明** + + 创建一个事件响应器组合,参数为默认值,与 `Matcher.new` 一致 + + + +### `matchers` + + +* **类型** + + `List[Type[Matcher]]` + + + +* **说明** + + 组内事件响应器列表 + + + +### `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, expire_time=None)` + + +* **说明** + + 在组中创建一个新的事件响应器,参数留空则使用组合默认值 + + +:::danger 警告 +如果使用 handlers 参数覆盖组合默认值则该事件响应器不会随组合一起添加新的事件处理函数 +::: diff --git a/archive/2.0.0a2/api/nonebot.md b/archive/2.0.0a3/api/nonebot.md similarity index 74% rename from archive/2.0.0a2/api/nonebot.md rename to archive/2.0.0a3/api/nonebot.md index 3c278a5c..7c89c882 100644 --- a/archive/2.0.0a2/api/nonebot.md +++ b/archive/2.0.0a3/api/nonebot.md @@ -5,6 +5,55 @@ sidebarDepth: 0 # NoneBot 模块 +## 快捷导入 + +为方便使用,`nonebot` 模块从子模块导入了部分内容 + + +* `on_message` => `nonebot.plugin.on_message` + + +* `on_notice` => `nonebot.plugin.on_notice` + + +* `on_request` => `nonebot.plugin.on_request` + + +* `on_metaevent` => `nonebot.plugin.on_metaevent` + + +* `on_startswith` => `nonebot.plugin.on_startswith` + + +* `on_endswith` => `nonebot.plugin.on_endswith` + + +* `on_command` => `nonebot.plugin.on_command` + + +* `on_regex` => `nonebot.plugin.on_regex` + + +* `on_regex` => `nonebot.plugin.on_regex` + + +* `on_regex` => `nonebot.plugin.on_regex` + + +* `CommandGroup` => `nonebot.plugin.CommandGroup` + + +* `load_plugin` => `nonebot.plugin.load_plugin` + + +* `load_plugins` => `nonebot.plugin.load_plugins` + + +* `load_builtin_plugins` => `nonebot.plugin.load_builtin_plugins` + + +* `get_loaded_plugins` => `nonebot.plugin.get_loaded_plugins` + ## `get_driver()` diff --git a/archive/2.0.0a2/api/permission.md b/archive/2.0.0a3/api/permission.md similarity index 100% rename from archive/2.0.0a2/api/permission.md rename to archive/2.0.0a3/api/permission.md diff --git a/archive/2.0.0a2/api/rule.md b/archive/2.0.0a3/api/rule.md similarity index 51% rename from archive/2.0.0a2/api/rule.md rename to archive/2.0.0a3/api/rule.md index 269abc57..2054d04b 100644 --- a/archive/2.0.0a2/api/rule.md +++ b/archive/2.0.0a3/api/rule.md @@ -7,10 +7,10 @@ sidebarDepth: 0 ## 规则 -每个 `Matcher` 拥有一个 `Rule` ,其中是 **异步** `RuleChecker` 的集合,只有当所有 `RuleChecker` 检查结果为 `True` 时继续运行。 +每个事件响应器 `Matcher` 拥有一个匹配规则 `Rule` ,其中是 **异步** `RuleChecker` 的集合,只有当所有 `RuleChecker` 检查结果为 `True` 时继续运行。 :::tip 提示 -`RuleChecker` 既可以是 async function 也可以是 sync function +`RuleChecker` 既可以是 async function 也可以是 sync function,但在最终会被 `nonebot.utils.run_sync` 转换为 async function ::: @@ -120,3 +120,83 @@ Rule(async_function, run_sync(sync_function)) * `msg: str`: 消息结尾字符串 + + + +## `keyword(msg)` + + +* **说明** + + 匹配消息关键词 + + + +* **参数** + + + * `msg: str`: 关键词 + + + +## `command(command)` + + +* **说明** + + 命令形式匹配,根据配置里提供的 `command_start`, `command_sep` 判断消息是否为命令。 + + + +* **参数** + + + * `command: Tuples[str, ...]`: 命令内容 + + + +* **示例** + + 使用默认 `command_start`, `command_sep` 配置 + + 命令 `("test",)` 可以匹配:`/test` 开头的消息 + 命令 `("test", "sub")` 可以匹配”`/test.sub` 开头的消息 + + +:::tip 提示 +命令内容与后续消息间无需空格! +::: + + +## `regex(regex, flags=0)` + + +* **说明** + + 根据正则表达式进行匹配 + + + +* **参数** + + + * `regex: str`: 正则表达式 + + + * `flags: Union[int, re.RegexFlag]`: 正则标志 + + + +## `to_me()` + + +* **说明** + + 通过 `event.to_me` 判断消息是否是发送给机器人 + + + +* **参数** + + + * 无 diff --git a/archive/2.0.0a2/api/sched.md b/archive/2.0.0a3/api/sched.md similarity index 100% rename from archive/2.0.0a2/api/sched.md rename to archive/2.0.0a3/api/sched.md diff --git a/archive/2.0.0a2/api/typing.md b/archive/2.0.0a3/api/typing.md similarity index 100% rename from archive/2.0.0a2/api/typing.md rename to archive/2.0.0a3/api/typing.md diff --git a/archive/2.0.0a2/api/utils.md b/archive/2.0.0a3/api/utils.md similarity index 100% rename from archive/2.0.0a2/api/utils.md rename to archive/2.0.0a3/api/utils.md diff --git a/archive/2.0.0a2/guide/README.md b/archive/2.0.0a3/guide/README.md similarity index 63% rename from archive/2.0.0a2/guide/README.md rename to archive/2.0.0a3/guide/README.md index 6cf31e90..86397ee2 100644 --- a/archive/2.0.0a2/guide/README.md +++ b/archive/2.0.0a3/guide/README.md @@ -20,11 +20,7 @@ NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人 ## 它如何工作? -NoneBot 的运行离不开 酷 Q 和 CQHTTP 插件。酷 Q 扮演着「无头 QQ 客户端」的角色,它进行实际的消息、通知、请求的接收和发送,当 酷 Q 收到消息时,它将这个消息包装为一个事件(通知和请求同理),并通过它自己的插件机制将事件传送给 CQHTTP 插件,后者再根据其配置中的 `post_url` 或 `ws_reverse_url` 等项来将事件发送至 NoneBot。 - -在 NoneBot 收到事件前,它底层的 aiocqhttp 实际已经先看到了事件,aiocqhttp 根据事件的类型信息,通知到 NoneBot 的相应函数。特别地,对于消息类型的事件,还将消息内容转换成了 `aiocqhttp.message.Message` 类型,以便处理。 - -NoneBot 的事件处理函数收到通知后,对于不同类型的事件,再做相应的预处理和解析,然后调用对应的插件,并向其提供适合此类事件的会话(Session)对象。NoneBot 插件的编写者要做的,就是利用 Session 对象中提供的数据,在插件的处理函数中实现所需的功能。 +~~未填坑~~ ## 特色 diff --git a/archive/2.0.0a2/guide/basic-configuration.md b/archive/2.0.0a3/guide/basic-configuration.md similarity index 100% rename from archive/2.0.0a2/guide/basic-configuration.md rename to archive/2.0.0a3/guide/basic-configuration.md diff --git a/archive/2.0.0a2/guide/creating-a-project.md b/archive/2.0.0a3/guide/creating-a-project.md similarity index 100% rename from archive/2.0.0a2/guide/creating-a-project.md rename to archive/2.0.0a3/guide/creating-a-project.md diff --git a/archive/2.0.0a2/guide/getting-started.md b/archive/2.0.0a3/guide/getting-started.md similarity index 100% rename from archive/2.0.0a2/guide/getting-started.md rename to archive/2.0.0a3/guide/getting-started.md diff --git a/archive/2.0.0a2/guide/installation.md b/archive/2.0.0a3/guide/installation.md similarity index 100% rename from archive/2.0.0a2/guide/installation.md rename to archive/2.0.0a3/guide/installation.md diff --git a/archive/2.0.0a2/guide/writing-a-plugin.md b/archive/2.0.0a3/guide/writing-a-plugin.md similarity index 100% rename from archive/2.0.0a2/guide/writing-a-plugin.md rename to archive/2.0.0a3/guide/writing-a-plugin.md diff --git a/archive/2.0.0a2/sidebar.config.json b/archive/2.0.0a3/sidebar.config.json similarity index 86% rename from archive/2.0.0a2/sidebar.config.json rename to archive/2.0.0a3/sidebar.config.json index bec088a6..c68d09ef 100644 --- a/archive/2.0.0a2/sidebar.config.json +++ b/archive/2.0.0a3/sidebar.config.json @@ -47,21 +47,13 @@ "title": "nonebot 模块", "path": "nonebot" }, - { - "title": "nonebot.typing 模块", - "path": "typing" - }, { "title": "nonebot.config 模块", "path": "config" }, { - "title": "nonebot.sched 模块", - "path": "sched" - }, - { - "title": "nonebot.log 模块", - "path": "log" + "title": "nonebot.matcher 模块", + "path": "matcher" }, { "title": "nonebot.rule 模块", @@ -71,14 +63,34 @@ "title": "nonebot.permission 模块", "path": "permission" }, + { + "title": "nonebot.sched 模块", + "path": "sched" + }, + { + "title": "nonebot.log 模块", + "path": "log" + }, { "title": "nonebot.utils 模块", "path": "utils" }, + { + "title": "nonebot.typing 模块", + "path": "typing" + }, { "title": "nonebot.exception 模块", "path": "exception" }, + { + "title": "nonebot.drivers 模块", + "path": "drivers/" + }, + { + "title": "nonebot.drivers.fastapi 模块", + "path": "drivers/fastapi" + }, { "title": "nonebot.adapters 模块", "path": "adapters/" diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 673e2d0c..863b0d64 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -124,6 +124,14 @@ module.exports = context => ({ title: "nonebot.exception 模块", path: "exception" }, + { + title: "nonebot.drivers 模块", + path: "drivers/" + }, + { + title: "nonebot.drivers.fastapi 模块", + path: "drivers/fastapi" + }, { title: "nonebot.adapters 模块", path: "adapters/" diff --git a/docs/.vuepress/versions.json b/docs/.vuepress/versions.json index 386fcf77..65abfcfd 100644 --- a/docs/.vuepress/versions.json +++ b/docs/.vuepress/versions.json @@ -1,3 +1,3 @@ [ - "2.0.0a2" + "2.0.0a3" ] \ No newline at end of file diff --git a/docs/api/README.md b/docs/api/README.md index 252513d8..52c6e9f6 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -34,6 +34,12 @@ * [nonebot.exception](exception.html) + * [nonebot.drivers](drivers/) + + + * [nonebot.drivers.fastapi](drivers/fastapi.html) + + * [nonebot.adapters](adapters/) diff --git a/docs/api/drivers/README.md b/docs/api/drivers/README.md new file mode 100644 index 00000000..f78812f0 --- /dev/null +++ b/docs/api/drivers/README.md @@ -0,0 +1,37 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.drivers 模块 + +## 后端驱动适配基类 + +各驱动请继承以下基类 + + +## _class_ `BaseDriver` + +基类:`abc.ABC` + +Driver 基类。将后端框架封装,以满足适配器使用。 + + +### `_adapters` + + +* **类型** + + `Dict[str, Type[Bot]]` + + + +* **说明** + + 已注册的适配器列表 + + + +### _abstract_ `__init__(env, config)` + +Initialize self. See help(type(self)) for accurate signature. diff --git a/docs/api/drivers/fastapi.md b/docs/api/drivers/fastapi.md new file mode 100644 index 00000000..029c9bc8 --- /dev/null +++ b/docs/api/drivers/fastapi.md @@ -0,0 +1,16 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.drivers.fastapi 模块 + + +## _class_ `Driver` + +基类:[`nonebot.drivers.BaseDriver`](#None) + + +### `__init__(env, config)` + +Initialize self. See help(type(self)) for accurate signature. diff --git a/docs_build/README.rst b/docs_build/README.rst index 9ce6ced7..20439caa 100644 --- a/docs_build/README.rst +++ b/docs_build/README.rst @@ -12,5 +12,7 @@ NoneBot Api Reference - `nonebot.utils `_ - `nonebot.typing `_ - `nonebot.exception `_ + - `nonebot.drivers `_ + - `nonebot.drivers.fastapi `_ - `nonebot.adapters `_ - `nonebot.adapters.cqhttp `_ diff --git a/docs_build/drivers/README.rst b/docs_build/drivers/README.rst new file mode 100644 index 00000000..e4bf6104 --- /dev/null +++ b/docs_build/drivers/README.rst @@ -0,0 +1,13 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +NoneBot.drivers 模块 +===================== + +.. automodule:: nonebot.drivers + :members: + :private-members: + :special-members: __init__ + :show-inheritance: diff --git a/docs_build/drivers/fastapi.rst b/docs_build/drivers/fastapi.rst new file mode 100644 index 00000000..bbc67caf --- /dev/null +++ b/docs_build/drivers/fastapi.rst @@ -0,0 +1,13 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +NoneBot.drivers.fastapi 模块 +===================== + +.. automodule:: nonebot.drivers.fastapi + :members: + :private-members: + :special-members: __init__ + :show-inheritance: From 5bb41395d8b0da28d2f0b7652ba52348d14896e3 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 11 Oct 2020 13:19:20 +0800 Subject: [PATCH 04/64] :bookmark: Pre Release 2.0.0a3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 17130e62..a0e3944e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nonebot2" -version = "2.0.0a2" +version = "2.0.0a3" description = "An asynchronous python bot framework." authors = ["yanyongyu "] license = "MIT" From 39a950ea80aa04f1750bada2a4d029fae3d694b3 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 11 Oct 2020 13:39:45 +0800 Subject: [PATCH 05/64] :pushpin: update lock file --- poetry.lock | 959 ++++++++++++++++++++++++++++------------------------ 1 file changed, 519 insertions(+), 440 deletions(-) diff --git a/poetry.lock b/poetry.lock index f4d0c251..e07cdc8f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,27 +1,39 @@ [[package]] -category = "dev" -description = "A configurable sidebar-enabled Sphinx theme" -name = "alabaster" -optional = false -python-versions = "*" -version = "0.7.12" - -[package.source] -reference = "aliyun" -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" - -[[package]] +name = "aiofiles" +version = "0.5.0" +description = "File support for asyncio." category = "main" -description = "In-process task scheduler with Cron-like capabilities" -name = "apscheduler" optional = true python-versions = "*" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +optional = false +python-versions = "*" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "apscheduler" version = "3.6.3" +description = "In-process task scheduler with Cron-like capabilities" +category = "main" +optional = true +python-versions = "*" [package.dependencies] pytz = "*" -setuptools = ">=0.7" six = ">=1.4.0" tzlocal = ">=1.2" @@ -39,68 +51,68 @@ twisted = ["twisted"] zookeeper = ["kazoo"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Better dates & times for Python" name = "arrow" +version = "0.17.0" +description = "Better dates & times for Python" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.16.0" [package.dependencies] python-dateutil = ">=2.7.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Classes Without Boilerplate" name = "attrs" +version = "20.2.0" +description = "Classes Without Boilerplate" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.2.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Internationalization utilities" name = "babel" +version = "2.8.0" +description = "Internationalization utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" [package.dependencies] pytz = ">=2015.7" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Modern password hashing for your software and your servers" name = "bcrypt" +version = "3.2.0" +description = "Modern password hashing for your software and your servers" +category = "main" optional = true python-versions = ">=3.6" -version = "3.2.0" [package.dependencies] cffi = ">=1.1" @@ -111,138 +123,138 @@ tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)"] typecheck = ["mypy"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Ultra-lightweight pure Python package to check if a file is binary or text." name = "binaryornot" +version = "0.4.4" +description = "Ultra-lightweight pure Python package to check if a file is binary or text." +category = "main" optional = true python-versions = "*" -version = "0.4.4" [package.dependencies] chardet = ">=3.0.2" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A decorator for caching properties in classes." name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "main" optional = true python-versions = "*" -version = "1.5.2" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" +version = "2020.6.20" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = "*" -version = "2020.6.20" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Foreign Function Interface for Python calling C code." name = "cffi" +version = "1.14.3" +description = "Foreign Function Interface for Python calling C code." +category = "main" optional = true python-versions = "*" -version = "1.14.3" [package.dependencies] pycparser = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" +version = "3.0.4" +description = "Universal encoding detector for Python 2 and 3" +category = "main" optional = false python-versions = "*" -version = "3.0.4" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Composable command line interface toolkit" name = "click" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "7.1.2" - -[package.source] -reference = "aliyun" -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" - -[[package]] +description = "Composable command line interface toolkit" category = "main" -description = "Cross-platform colored terminal text." -name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] +name = "colorama" +version = "0.4.3" +description = "Cross-platform colored terminal text." category = "main" -description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] name = "cookiecutter" +version = "1.7.2" +description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template." +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.7.2" [package.dependencies] -Jinja2 = "<3.0.0" -MarkupSafe = "<2.0.0" binaryornot = ">=0.4.4" click = ">=7.0" +Jinja2 = "<3.0.0" jinja2-time = ">=0.2.0" +MarkupSafe = "<2.0.0" poyo = ">=0.5.0" python-slugify = ">=4.0.0" requests = ">=2.23.0" six = ">=1.10" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." name = "cryptography" +version = "3.1.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = true python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -version = "3.1.1" [package.dependencies] cffi = ">=1.8,<1.11.3 || >1.11.3" @@ -256,133 +268,127 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Distro - an OS platform information API" name = "distro" +version = "1.5.0" +description = "Distro - an OS platform information API" +category = "main" optional = true python-versions = "*" -version = "1.5.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A Python library for the Docker Engine API." name = "docker" +version = "4.3.1" +description = "A Python library for the Docker Engine API." +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "4.3.1" [package.dependencies] -pywin32 = "227" +paramiko = {version = ">=2.4.2", optional = true, markers = "extra == \"ssh\""} +pywin32 = {version = "227", markers = "sys_platform == \"win32\""} requests = ">=2.14.2,<2.18.0 || >2.18.0" six = ">=1.4.0" websocket-client = ">=0.32.0" -[package.dependencies.paramiko] -optional = true -version = ">=2.4.2" - [package.extras] ssh = ["paramiko (>=2.4.2)"] tls = ["pyOpenSSL (>=17.5.0)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Multi-container orchestration for Docker" name = "docker-compose" +version = "1.27.4" +description = "Multi-container orchestration for Docker" +category = "main" optional = true python-versions = ">=3.4" -version = "1.27.4" [package.dependencies] -PyYAML = ">=3.10,<6" cached-property = ">=1.2.0,<2" -colorama = ">=0.4,<1" +colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} distro = ">=1.5.0,<2" +docker = {version = ">=4.3.1,<5", extras = ["ssh"]} dockerpty = ">=0.4.1,<1" docopt = ">=0.6.1,<1" jsonschema = ">=2.5.1,<4" python-dotenv = ">=0.13.0,<1" +PyYAML = ">=3.10,<6" requests = ">=2.20.0,<3" texttable = ">=0.9.0,<2" websocket-client = ">=0.32.0,<1" -[package.dependencies.docker] -extras = ["ssh"] -version = ">=4.3.1,<5" - [package.extras] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2)"] tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python library to use the pseudo-tty of a docker container" name = "dockerpty" +version = "0.4.1" +description = "Python library to use the pseudo-tty of a docker container" +category = "main" optional = true python-versions = "*" -version = "0.4.1" [package.dependencies] six = ">=1.3.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Pythonic argument parser, that will make you smile" name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "main" optional = true python-versions = "*" -version = "0.6.2" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Docutils -- Python Documentation Utilities" name = "docutils" +version = "0.16" +description = "Docutils -- Python Documentation Utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.16" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" name = "fastapi" +version = "0.58.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" optional = false python-versions = ">=3.6" -version = "0.58.1" [package.dependencies] pydantic = ">=0.32.2,<2.0.0" @@ -395,86 +401,86 @@ doc = ["mkdocs", "mkdocs-material", "markdown-include", "typer", "typer-cli", "p test = ["pytest (5.4.3)", "pytest-cov (2.10.0)", "mypy", "black", "isort", "requests", "email-validator", "sqlalchemy", "peewee", "databases", "orjson", "async-exit-stack", "async-generator", "python-multipart", "aiofiles", "flask"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" name = "h11" +version = "0.9.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = "*" -version = "0.9.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "HTTP/2 State-Machine based protocol implementation" name = "h2" +version = "3.2.0" +description = "HTTP/2 State-Machine based protocol implementation" +category = "main" optional = false python-versions = "*" -version = "3.2.0" [package.dependencies] hpack = ">=3.0,<4" hyperframe = ">=5.2.0,<6" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Pure-Python HPACK header compression" name = "hpack" +version = "3.0.0" +description = "Pure-Python HPACK header compression" +category = "main" optional = false python-versions = "*" -version = "3.0.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Chromium HSTS Preload list as a Python package and updated daily" name = "hstspreload" +version = "2020.10.6" +description = "Chromium HSTS Preload list as a Python package and updated daily" +category = "main" optional = false python-versions = ">=3.6" -version = "2020.9.29" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Turn HTML into equivalent Markdown-structured text." name = "html2text" +version = "2020.1.16" +description = "Turn HTML into equivalent Markdown-structured text." +category = "dev" optional = false python-versions = ">=3.5" -version = "2020.1.16" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A minimal low-level HTTP client." name = "httpcore" +version = "0.9.1" +description = "A minimal low-level HTTP client." +category = "main" optional = false python-versions = ">=3.6" -version = "0.9.1" [package.dependencies] h11 = ">=0.8,<0.10" @@ -482,34 +488,33 @@ h2 = ">=3.0.0,<4.0.0" sniffio = ">=1.0.0,<2.0.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A collection of framework independent HTTP protocol utils." -marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" name = "httptools" +version = "0.1.1" +description = "A collection of framework independent HTTP protocol utils." +category = "main" optional = false python-versions = "*" -version = "0.1.1" [package.extras] test = ["Cython (0.29.14)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "The next generation HTTP client." name = "httpx" +version = "0.13.3" +description = "The next generation HTTP client." +category = "main" optional = false python-versions = ">=3.6" -version = "0.13.3" [package.dependencies] certifi = "*" @@ -521,57 +526,56 @@ rfc3986 = ">=1.3,<2" sniffio = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "HTTP/2 framing layer for Python" name = "hyperframe" +version = "5.2.0" +description = "HTTP/2 framing layer for Python" +category = "main" optional = false python-versions = "*" -version = "5.2.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.10" - -[package.source] -reference = "aliyun" -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" - -[[package]] -category = "dev" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -name = "imagesize" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "imagesize" +version = "1.2.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" name = "importlib-metadata" +version = "2.0.0" +description = "Read metadata from Python packages" +category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "2.0.0" [package.dependencies] zipp = ">=0.5" @@ -581,17 +585,17 @@ docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A very fast and expressive template engine." name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.2" [package.dependencies] MarkupSafe = ">=0.23" @@ -600,94 +604,90 @@ MarkupSafe = ">=0.23" i18n = ["Babel (>=0.8)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Jinja2 Extension for Dates and Times" name = "jinja2-time" +version = "0.2.0" +description = "Jinja2 Extension for Dates and Times" +category = "main" optional = true python-versions = "*" -version = "0.2.0" [package.dependencies] arrow = "*" jinja2 = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "An implementation of JSON Schema validation for Python" name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +category = "main" optional = true python-versions = "*" -version = "3.2.0" [package.dependencies] attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} pyrsistent = ">=0.14.0" -setuptools = "*" six = ">=1.11.0" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - [package.extras] format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python logging made (stupidly) simple" name = "loguru" +version = "0.5.3" +description = "Python logging made (stupidly) simple" +category = "main" optional = false python-versions = ">=3.5" -version = "0.5.3" [package.dependencies] -colorama = ">=0.3.4" -win32-setctime = ">=1.0.0" +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] dev = ["codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "tox-travis (>=0.12)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "Sphinx (>=2.2.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "black (>=19.10b0)", "isort (>=5.1.1)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Safely add untrusted strings to HTML/XML markup." name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "CLI for nonebot2" name = "nb-cli" +version = "0.1.0" +description = "CLI for nonebot2" +category = "main" optional = true python-versions = ">=3.7,<4.0" -version = "0.1.0" [package.dependencies] click = ">=7.1.2,<8.0.0" @@ -699,34 +699,52 @@ pyfiglet = ">=0.8.post1,<0.9" pyinquirer = "1.0.3" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "nonebot-test" +version = "0.1.0" +description = "Test frontend for nonebot v2+" +category = "main" +optional = true +python-versions = ">=3.7,<4.0" + +[package.dependencies] +aiofiles = ">=0.5.0,<0.6.0" +nonebot2 = ">=2.0.0-alpha.1,<3.0.0" +python-socketio = ">=4.6.0,<5.0.0" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Core utilities for Python packages" name = "packaging" +version = "20.4" +description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.4" [package.dependencies] pyparsing = ">=2.0.2" six = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "SSH2 protocol library" name = "paramiko" +version = "2.7.2" +description = "SSH2 protocol library" +category = "main" optional = true python-versions = "*" -version = "2.7.2" [package.dependencies] bcrypt = ">=3.1.3" @@ -740,65 +758,63 @@ gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] invoke = ["invoke (>=1.3)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A lightweight YAML Parser for Python. 🐓" name = "poyo" +version = "0.5.0" +description = "A lightweight YAML Parser for Python. 🐓" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.5.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Library for building powerful interactive command lines in Python" name = "prompt-toolkit" +version = "1.0.14" +description = "Library for building powerful interactive command lines in Python" +category = "main" optional = true python-versions = "*" -version = "1.0.14" [package.dependencies] six = ">=1.9.0" wcwidth = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "C parser in Python" name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Data validation and settings management using python 3.6 type hinting" name = "pydantic" +version = "1.6.1" +description = "Data validation and settings management using python 3.6 type hinting" +category = "main" optional = false python-versions = ">=3.6" -version = "1.6.1" [package.dependencies] -[package.dependencies.python-dotenv] -optional = true -version = ">=0.10.4" +python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""} [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -806,90 +822,90 @@ email = ["email-validator (>=1.0.3)"] typing_extensions = ["typing-extensions (>=3.7.2)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." name = "pydash" +version = "4.8.0" +description = "The kitchen sink of Python utility libraries for doing \"stuff\" in a functional way. Based on the Lo-Dash Javascript library." +category = "dev" optional = false python-versions = "*" -version = "4.8.0" [package.extras] dev = ["coverage", "flake8", "mock", "pylint", "pytest", "pytest-cov", "sphinx", "sphinx-rtd-theme", "tox", "twine", "wheel"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Pure-python FIGlet implementation" name = "pyfiglet" +version = "0.8.post1" +description = "Pure-python FIGlet implementation" +category = "main" optional = true python-versions = "*" -version = "0.8.post1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Pygments is a syntax highlighting package written in Python." name = "pygments" +version = "2.7.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" optional = false python-versions = ">=3.5" -version = "2.7.1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Trie data structure implementation." name = "pygtrie" +version = "2.3.3" +description = "Trie data structure implementation." +category = "main" optional = false python-versions = "*" -version = "2.3.3" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A Python module for collection of common interactive command line user interfaces, based on Inquirer.js" name = "pyinquirer" +version = "1.0.3" +description = "A Python module for collection of common interactive command line user interfaces, based on Inquirer.js" +category = "main" optional = true python-versions = "*" -version = "1.0.3" [package.dependencies] -Pygments = ">=2.2.0" prompt_toolkit = "1.0.14" +Pygments = ">=2.2.0" regex = ">=2016.11.21" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python binding to the Networking and Cryptography (NaCl) library" name = "pynacl" +version = "1.4.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" [package.dependencies] cffi = ">=1.4.1" @@ -900,75 +916,95 @@ docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)", "hypothesis (>=3.27.0)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Persistent/Functional/Immutable data structures" name = "pyrsistent" +version = "0.17.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" optional = true python-versions = ">=3.5" -version = "0.17.3" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Extensions to the standard Python datetime module" name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" [package.dependencies] six = ">=1.5" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Add .env support to your django/flask apps in development and deployments" name = "python-dotenv" +version = "0.14.0" +description = "Add .env support to your django/flask apps in development and deployments" +category = "main" optional = false python-versions = "*" -version = "0.14.0" [package.extras] cli = ["click (>=5.0)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] +name = "python-engineio" +version = "3.13.2" +description = "Engine.IO server" category = "main" -description = "A Python Slugify application that handles Unicode" +optional = true +python-versions = "*" + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] name = "python-slugify" +version = "4.0.1" +description = "A Python Slugify application that handles Unicode" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "4.0.1" [package.dependencies] text-unidecode = ">=1.3" @@ -977,70 +1013,90 @@ text-unidecode = ">=1.3" unidecode = ["Unidecode (>=1.1.1)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] +name = "python-socketio" +version = "4.6.0" +description = "Socket.IO server" category = "main" -description = "World timezone definitions, modern and historical" +optional = true +python-versions = "*" + +[package.dependencies] +python-engineio = ">=3.13.0" +six = ">=1.9.0" + +[package.extras] +asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] name = "pytz" -optional = false -python-versions = "*" version = "2020.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python for Window Extensions" -marker = "sys_platform == \"win32\"" name = "pywin32" +version = "227" +description = "Python for Window Extensions" +category = "main" optional = true python-versions = "*" -version = "227" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "YAML parser and emitter for Python" name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Alternative regular expression module, to replace re." name = "regex" +version = "2020.9.27" +description = "Alternative regular expression module, to replace re." +category = "main" optional = true python-versions = "*" -version = "2020.9.27" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python HTTP for Humans." name = "requests" +version = "2.24.0" +description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" [package.dependencies] certifi = ">=2017.4.17" @@ -1053,84 +1109,83 @@ security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Validating URI References per RFC 3986" name = "rfc3986" +version = "1.4.0" +description = "Validating URI References per RFC 3986" +category = "main" optional = false python-versions = "*" -version = "1.4.0" [package.extras] idna2008 = ["idna"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Python 2 and 3 compatibility utilities" name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Sniff out which async library your code is running under" name = "sniffio" +version = "1.1.0" +description = "Sniff out which async library your code is running under" +category = "main" optional = false python-versions = ">=3.5" -version = "1.1.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." name = "snowballstemmer" +version = "2.0.0" +description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +category = "dev" optional = false python-versions = "*" -version = "2.0.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Python documentation generator" name = "sphinx" +version = "3.2.1" +description = "Python documentation generator" +category = "dev" optional = false python-versions = ">=3.5" -version = "3.2.1" [package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" -colorama = ">=0.3.5" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} docutils = ">=0.12" imagesize = "*" +Jinja2 = ">=2.3" packaging = "*" +Pygments = ">=2.0" requests = ">=2.5.0" -setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -1145,17 +1200,17 @@ lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.780)", "docutils-s test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "sphinx builder that outputs markdown files" name = "sphinx-markdown-builder" +version = "0.5.4" +description = "sphinx builder that outputs markdown files" +category = "dev" optional = false python-versions = "*" -version = "0.5.4" [package.dependencies] html2text = "*" @@ -1165,204 +1220,206 @@ unify = "*" yapf = "*" [package.source] -reference = "09751bd6c81ee246d91d63baa65d09e3618b7288" type = "git" url = "https://github.com/nonebot/sphinx-markdown-builder.git" +reference = "master" +resolved_reference = "09751bd6c81ee246d91d63baa65d09e3618b7288" + [[package]] -category = "dev" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" name = "sphinxcontrib-htmlhelp" +version = "1.0.3" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.3" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest", "html5lib"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "A sphinx extension which renders display math in HTML via JavaScript" name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" optional = false python-versions = ">=3.5" -version = "1.0.1" [package.extras] test = ["pytest", "flake8", "mypy"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." name = "sphinxcontrib-qthelp" -optional = false -python-versions = ">=3.5" version = "1.0.3" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[package.source] -reference = "aliyun" -type = "legacy" -url = "https://mirrors.aliyun.com/pypi/simple" - -[[package]] +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." category = "dev" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -name = "sphinxcontrib-serializinghtml" optional = false python-versions = ">=3.5" -version = "1.1.4" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.4" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "The little ASGI library that shines." name = "starlette" +version = "0.13.4" +description = "The little ASGI library that shines." +category = "main" optional = false python-versions = ">=3.6" -version = "0.13.4" [package.extras] full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests", "ujson"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "The most basic Text::Unidecode port" name = "text-unidecode" -optional = true -python-versions = "*" version = "1.3" +description = "The most basic Text::Unidecode port" +category = "main" +optional = true +python-versions = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "module for creating simple ASCII tables" name = "texttable" +version = "1.6.3" +description = "module for creating simple ASCII tables" +category = "main" optional = true python-versions = "*" -version = "1.6.3" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "tzinfo object for the local timezone" name = "tzlocal" +version = "2.1" +description = "tzinfo object for the local timezone" +category = "main" optional = true python-versions = "*" -version = "2.1" [package.dependencies] pytz = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Modifies strings to all use the same (single/double) quote where possible." name = "unify" +version = "0.5" +description = "Modifies strings to all use the same (single/double) quote where possible." +category = "dev" optional = false python-versions = "*" -version = "0.5" [package.dependencies] untokenize = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "Transforms tokens into original source code (while preserving whitespace)." name = "untokenize" +version = "0.1.1" +description = "Transforms tokens into original source code (while preserving whitespace)." +category = "dev" optional = false python-versions = "*" -version = "0.1.1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" +version = "1.25.10" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.10" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1370,148 +1427,150 @@ secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0 socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "The lightning-fast ASGI server." name = "uvicorn" +version = "0.11.8" +description = "The lightning-fast ASGI server." +category = "main" optional = false python-versions = "*" -version = "0.11.8" [package.dependencies] click = ">=7.0.0,<8.0.0" h11 = ">=0.8,<0.10" -httptools = ">=0.1.0,<0.2.0" -uvloop = ">=0.14.0" +httptools = {version = ">=0.1.0,<0.2.0", markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\""} +uvloop = {version = ">=0.14.0", markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\""} websockets = ">=8.0.0,<9.0.0" [package.extras] watchgodreload = ["watchgod (>=0.6,<0.7)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Fast implementation of asyncio event loop on top of libuv" -marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" name = "uvloop" +version = "0.14.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" optional = false python-versions = "*" -version = "0.14.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Measures the displayed width of unicode strings in a terminal" name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" optional = true python-versions = "*" -version = "0.2.5" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "WebSocket client for Python. hybi13 is supported." name = "websocket-client" +version = "0.57.0" +description = "WebSocket client for Python. hybi13 is supported." +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.57.0" [package.dependencies] six = "*" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" name = "websockets" +version = "8.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" optional = false python-versions = ">=3.6.1" -version = "8.1" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "A small Python utility to set file creation time on Windows" -marker = "sys_platform == \"win32\"" name = "win32-setctime" +version = "1.0.3" +description = "A small Python utility to set file creation time on Windows" +category = "main" optional = false python-versions = ">=3.5" -version = "1.0.2" [package.extras] dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "dev" -description = "A formatter for Python code." name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "dev" optional = false python-versions = "*" -version = "0.30.0" [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [[package]] -category = "main" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" name = "zipp" +version = "3.3.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = true python-versions = ">=3.6" -version = "3.2.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [package.source] -reference = "aliyun" type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" +reference = "aliyun" [extras] cli = ["nb-cli"] -full = ["nb-cli"] +full = ["nb-cli", "nonebot-test"] scheduler = ["apscheduler"] +test = ["nonebot-test"] [metadata] -content-hash = "b8e6ee3b0726717b1cfa1978693f1c4c25cf6fe044784ef5661b9bee50c34d9a" -lock-version = "1.0" +lock-version = "1.1" python-versions = "^3.7" +content-hash = "04acfd9bf32ebb7173922b1d0c28500d1a80ff22307856d61b04668e808c19be" [metadata.files] +aiofiles = [ + {file = "aiofiles-0.5.0-py3-none-any.whl", hash = "sha256:377fdf7815cc611870c59cbd07b68b180841d2a2b79812d8c218be02448c2acb"}, + {file = "aiofiles-0.5.0.tar.gz", hash = "sha256:98e6bcfd1b50f97db4980e182ddd509b7cc35909e903a8fe50d8849e02d815af"}, +] alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, @@ -1521,8 +1580,8 @@ apscheduler = [ {file = "APScheduler-3.6.3.tar.gz", hash = "sha256:3bb5229eed6fbbdafc13ce962712ae66e175aa214c69bed35a06bffcf0c5e244"}, ] arrow = [ - {file = "arrow-0.16.0-py2.py3-none-any.whl", hash = "sha256:98184d8dd3e5d30b96c2df4596526f7de679ccb467f358b82b0f686436f3a6b8"}, - {file = "arrow-0.16.0.tar.gz", hash = "sha256:92aac856ea5175c804f7ccb96aca4d714d936f1c867ba59d747a8096ec30e90a"}, + {file = "arrow-0.17.0-py2.py3-none-any.whl", hash = "sha256:e098abbd9af3665aea81bdd6c869e93af4feb078e98468dd351c383af187aac5"}, + {file = "arrow-0.17.0.tar.gz", hash = "sha256:ff08d10cda1d36c68657d6ad20d74fbea493d980f8b2d45344e00d6ed2bf6ed4"}, ] attrs = [ {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"}, @@ -1670,8 +1729,8 @@ hpack = [ {file = "hpack-3.0.0.tar.gz", hash = "sha256:8eec9c1f4bfae3408a3f30500261f7e6a65912dc138526ea054f9ad98892e9d2"}, ] hstspreload = [ - {file = "hstspreload-2020.9.29-py3-none-any.whl", hash = "sha256:b6bdbe6e36d8acea5bb97b53ae50552293b6b0425785918da7b63e48f08af4a8"}, - {file = "hstspreload-2020.9.29.tar.gz", hash = "sha256:349c59cd2889a2cd94f49b3872a195164cc50754f1bef148b7d2d0d6c0efe0de"}, + {file = "hstspreload-2020.10.6-py3-none-any.whl", hash = "sha256:f413669d7b53a6d4cd5fc0fb313562bfba9fb5fba63bbb32a62a752ed72734bd"}, + {file = "hstspreload-2020.10.6.tar.gz", hash = "sha256:01a9b58e8f32f2ef4d1f9aacc7658ec13e23c57ce9f625ea18693ec2ed38dcfb"}, ] html2text = [ {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"}, @@ -1770,6 +1829,10 @@ nb-cli = [ {file = "nb-cli-0.1.0.tar.gz", hash = "sha256:5106212dd0bae270fc547a59f8c75e20951b9fbd87af263d647f8474677a2e26"}, {file = "nb_cli-0.1.0-py3-none-any.whl", hash = "sha256:a5b5f72bd68b48da446d56623e16b08a3483c84840b3a191771cd9b3e6fde8e9"}, ] +nonebot-test = [ + {file = "nonebot-test-0.1.0.tar.gz", hash = "sha256:f83bc095927f55e55cfe61c2ccc388e2536980d6d40412879009a16484487af4"}, + {file = "nonebot_test-0.1.0-py3-none-any.whl", hash = "sha256:3f981ac001f0f6c4f408d561b11fbe337fddc0a0f0d1e7a6602f34305ff82bcd"}, +] packaging = [ {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, @@ -1836,6 +1899,8 @@ pynacl = [ {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, @@ -1861,9 +1926,17 @@ python-dotenv = [ {file = "python-dotenv-0.14.0.tar.gz", hash = "sha256:8c10c99a1b25d9a68058a1ad6f90381a62ba68230ca93966882a4dbc3bc9c33d"}, {file = "python_dotenv-0.14.0-py2.py3-none-any.whl", hash = "sha256:c10863aee750ad720f4f43436565e4c1698798d763b63234fb5021b6c616e423"}, ] +python-engineio = [ + {file = "python-engineio-3.13.2.tar.gz", hash = "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b"}, + {file = "python_engineio-3.13.2-py2.py3-none-any.whl", hash = "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6"}, +] python-slugify = [ {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, ] +python-socketio = [ + {file = "python-socketio-4.6.0.tar.gz", hash = "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a"}, + {file = "python_socketio-4.6.0-py2.py3-none-any.whl", hash = "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522"}, +] pytz = [ {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, @@ -1916,6 +1989,12 @@ regex = [ {file = "regex-2020.9.27-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8d69cef61fa50c8133382e61fd97439de1ae623fe943578e477e76a9d9471637"}, {file = "regex-2020.9.27-cp38-cp38-win32.whl", hash = "sha256:f2388013e68e750eaa16ccbea62d4130180c26abb1d8e5d584b9baf69672b30f"}, {file = "regex-2020.9.27-cp38-cp38-win_amd64.whl", hash = "sha256:4318d56bccfe7d43e5addb272406ade7a2274da4b70eb15922a071c58ab0108c"}, + {file = "regex-2020.9.27-cp39-cp39-manylinux1_i686.whl", hash = "sha256:84cada8effefe9a9f53f9b0d2ba9b7b6f5edf8d2155f9fdbe34616e06ececf81"}, + {file = "regex-2020.9.27-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:816064fc915796ea1f26966163f6845de5af78923dfcecf6551e095f00983650"}, + {file = "regex-2020.9.27-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:5d892a4f1c999834eaa3c32bc9e8b976c5825116cde553928c4c8e7e48ebda67"}, + {file = "regex-2020.9.27-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c9443124c67b1515e4fe0bb0aa18df640965e1030f468a2a5dc2589b26d130ad"}, + {file = "regex-2020.9.27-cp39-cp39-win32.whl", hash = "sha256:49f23ebd5ac073765ecbcf046edc10d63dcab2f4ae2bce160982cb30df0c0302"}, + {file = "regex-2020.9.27-cp39-cp39-win_amd64.whl", hash = "sha256:3d20024a70b97b4f9546696cbf2fd30bae5f42229fbddf8661261b1eaff0deb7"}, {file = "regex-2020.9.27.tar.gz", hash = "sha256:a6f32aea4260dfe0e55dc9733ea162ea38f0ea86aa7d0f77b15beac5bf7b369d"}, ] requests = [ @@ -2041,14 +2120,14 @@ websockets = [ {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, ] win32-setctime = [ - {file = "win32_setctime-1.0.2-py3-none-any.whl", hash = "sha256:02b4c5959ca0b195f45c98115826c6e8a630b7cf648e724feaab1a5aa6250640"}, - {file = "win32_setctime-1.0.2.tar.gz", hash = "sha256:47aa7c43548c1fc0a4f026d1944b748b37036df116c7c4cf908e82638d854313"}, + {file = "win32_setctime-1.0.3-py3-none-any.whl", hash = "sha256:dc925662de0a6eb987f0b01f599c01a8236cb8c62831c22d9cada09ad958243e"}, + {file = "win32_setctime-1.0.3.tar.gz", hash = "sha256:4e88556c32fdf47f64165a2180ba4552f8bb32c1103a2fafd05723a0bd42bd4b"}, ] yapf = [ {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, ] zipp = [ - {file = "zipp-3.2.0-py3-none-any.whl", hash = "sha256:43f4fa8d8bb313e65d8323a3952ef8756bf40f9a5c3ea7334be23ee4ec8278b6"}, - {file = "zipp-3.2.0.tar.gz", hash = "sha256:b52f22895f4cfce194bc8172f3819ee8de7540aa6d873535a8668b730b8b411f"}, + {file = "zipp-3.3.0-py3-none-any.whl", hash = "sha256:eed8ec0b8d1416b2ca33516a37a08892442f3954dee131e92cfd92d8fe3e7066"}, + {file = "zipp-3.3.0.tar.gz", hash = "sha256:64ad89efee774d1897a58607895d80789c59778ea02185dd846ac38394a8642b"}, ] From 3c5d06a2de88500b30c6751e31d524e4b33d43c0 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 11 Oct 2020 13:49:58 +0800 Subject: [PATCH 06/64] :memo: add todo tag --- docs/guide/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/guide/README.md b/docs/guide/README.md index 86397ee2..43b7f325 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -20,6 +20,8 @@ NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人 ## 它如何工作? + + ~~未填坑~~ ## 特色 From 1e4b058681511d87158b4ce36cf663148c2927fc Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 11 Oct 2020 14:51:37 +0800 Subject: [PATCH 07/64] :alien: update repo link --- docs/.vuepress/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 863b0d64..76787cf8 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -41,9 +41,9 @@ module.exports = context => ({ theme: "titanium", themeConfig: { logo: "/logo.png", - repo: "nonebot/nonebot", + repo: "nonebot/nonebot2", docsDir: "docs", - docsBranch: "dev2", + docsBranch: "dev", docsDirVersioned: "archive", docsDirPages: "pages", editLinks: true, From 0a64959973c8bf6b821fde4951e53026ccecdb09 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 01:10:46 +0800 Subject: [PATCH 08/64] :bulb: add driver docstring --- docs/api/drivers/README.md | 211 +++++++++++++++++++++++++++++++++++- docs/api/drivers/fastapi.md | 111 ++++++++++++++++++- nonebot/drivers/__init__.py | 59 ++++++++++ nonebot/drivers/fastapi.py | 17 +++ 4 files changed, 396 insertions(+), 2 deletions(-) diff --git a/docs/api/drivers/README.md b/docs/api/drivers/README.md index f78812f0..624220ba 100644 --- a/docs/api/drivers/README.md +++ b/docs/api/drivers/README.md @@ -34,4 +34,213 @@ Driver 基类。将后端框架封装,以满足适配器使用。 ### _abstract_ `__init__(env, config)` -Initialize self. See help(type(self)) for accurate signature. + +* **参数** + + + * `env: Env`: 包含环境信息的 Env 对象 + + + * `config: Config`: 包含配置信息的 Config 对象 + + + +### `env` + + +* **类型** + + `str` + + + +* **说明** + + 环境名称 + + + +### `config` + + +* **类型** + + `Config` + + + +* **说明** + + 配置对象 + + + +### `_clients` + + +* **类型** + + `Dict[str, Bot]` + + + +* **说明** + + 已连接的 Bot + + + +### _classmethod_ `register_adapter(name, adapter)` + + +* **说明** + + 注册一个协议适配器 + + + +* **参数** + + + * `name: str`: 适配器名称,用于在连接时进行识别 + + + * `adapter: Type[Bot]`: 适配器 Class + + + +### _abstract property_ `type` + +驱动类型名称 + + +### _abstract property_ `server_app` + +驱动 APP 对象 + + +### _abstract property_ `asgi` + +驱动 ASGI 对象 + + +### _abstract property_ `logger` + +驱动专属 logger 日志记录器 + + +### _property_ `bots` + + +* **类型** + + `Dict[str, Bot]` + + + +* **说明** + + 获取当前所有已连接的 Bot + + + +### _abstract_ `on_startup(func)` + +注册一个在驱动启动时运行的函数 + + +### _abstract_ `on_shutdown(func)` + +注册一个在驱动停止时运行的函数 + + +### _abstract_ `run(host=None, port=None, *args, **kwargs)` + + +* **说明** + + 启动驱动框架 + + + +* **参数** + + + * `host: Optional[str]`: 驱动绑定 IP + + + * `post: Optional[int]`: 驱动绑定端口 + + + * `*args` + + + * `**kwargs` + + + +### _abstract async_ `_handle_http()` + +用于处理 HTTP 类型请求的函数 + + +### _abstract async_ `_handle_ws_reverse()` + +用于处理 WebSocket 类型请求的函数 + + +## _class_ `BaseWebSocket` + +基类:`object` + +WebSocket 连接封装,统一接口方便外部调用。 + + +### _abstract_ `__init__(websocket)` + + +* **参数** + + + * `websocket: Any`: WebSocket 连接对象 + + + +### _property_ `websocket` + +WebSocket 连接对象 + + +### _abstract property_ `closed` + + +* **类型** + + `bool` + + + +* **说明** + + 连接是否已经关闭 + + + +### _abstract async_ `accept()` + +接受 WebSocket 连接请求 + + +### _abstract async_ `close(code)` + +关闭 WebSocket 连接请求 + + +### _abstract async_ `receive()` + +接收一条 WebSocket 信息 + + +### _abstract async_ `send(data)` + +发送一条 WebSocket 信息 diff --git a/docs/api/drivers/fastapi.md b/docs/api/drivers/fastapi.md index 029c9bc8..523b09b2 100644 --- a/docs/api/drivers/fastapi.md +++ b/docs/api/drivers/fastapi.md @@ -5,12 +5,121 @@ sidebarDepth: 0 # NoneBot.drivers.fastapi 模块 +## FastAPI 驱动适配 + +后端使用方法请参考: [FastAPI 文档](https://fastapi.tiangolo.com/) + ## _class_ `Driver` 基类:[`nonebot.drivers.BaseDriver`](#None) +FastAPI 驱动框架 + ### `__init__(env, config)` -Initialize self. See help(type(self)) for accurate signature. + +* **参数** + + + +* `env: Env`: 包含环境信息的 Env 对象 + + +* `config: Config`: 包含配置信息的 Config 对象 + + +### _property_ `type` + +驱动名称: `fastapi` + + +### _property_ `server_app` + +`FastAPI APP` 对象 + + +### _property_ `asgi` + +`FastAPI APP` 对象 + + +### _property_ `logger` + +fastapi 使用的 logger + + +### `on_startup(func)` + +参考文档: [Events](https://fastapi.tiangolo.com/advanced/events/#startup-event) + + +### `on_shutdown(func)` + +参考文档: [Events](https://fastapi.tiangolo.com/advanced/events/#startup-event) + + +### `run(host=None, port=None, *, app=None, **kwargs)` + +使用 `uvicorn` 启动 FastAPI + + +### _async_ `_handle_http(adapter, data=Body(Ellipsis), x_self_id=Header(None), x_signature=Header(None), auth=Depends(get_auth_bearer))` + +用于处理 HTTP 类型请求的函数 + + +### _async_ `_handle_ws_reverse(adapter, websocket, x_self_id=Header(None), auth=Depends(get_auth_bearer))` + +用于处理 WebSocket 类型请求的函数 + + +## _class_ `WebSocket` + +基类:[`nonebot.drivers.BaseWebSocket`](#None) + + +### `__init__(websocket)` + + +* **参数** + + + +* `websocket: Any`: WebSocket 连接对象 + + +### _property_ `closed` + + +* **类型** + + `bool` + + + +* **说明** + + 连接是否已经关闭 + + + +### _async_ `accept()` + +接受 WebSocket 连接请求 + + +### _async_ `close(code=1000)` + +关闭 WebSocket 连接请求 + + +### _async_ `receive()` + +接收一条 WebSocket 信息 + + +### _async_ `send(data)` + +发送一条 WebSocket 信息 diff --git a/nonebot/drivers/__init__.py b/nonebot/drivers/__init__.py index 396622ed..5100e130 100644 --- a/nonebot/drivers/__init__.py +++ b/nonebot/drivers/__init__.py @@ -27,12 +27,36 @@ class BaseDriver(abc.ABC): @abc.abstractmethod def __init__(self, env: Env, config: Config): + """ + :参数: + * ``env: Env``: 包含环境信息的 Env 对象 + * ``config: Config``: 包含配置信息的 Config 对象 + """ self.env = env.environment + """ + :类型: ``str`` + :说明: 环境名称 + """ self.config = config + """ + :类型: ``Config`` + :说明: 配置对象 + """ self._clients: Dict[str, Bot] = {} + """ + :类型: ``Dict[str, Bot]`` + :说明: 已连接的 Bot + """ @classmethod def register_adapter(cls, name: str, adapter: Type[Bot]): + """ + :说明: + 注册一个协议适配器 + :参数: + * ``name: str``: 适配器名称,用于在连接时进行识别 + * ``adapter: Type[Bot]``: 适配器 Class + """ cls._adapters[name] = adapter logger.opt( colors=True).debug(f'Succeeded to load adapter "{name}"') @@ -40,33 +64,43 @@ class BaseDriver(abc.ABC): @property @abc.abstractmethod def type(self): + """驱动类型名称""" raise NotImplementedError @property @abc.abstractmethod def server_app(self): + """驱动 APP 对象""" raise NotImplementedError @property @abc.abstractmethod def asgi(self): + """驱动 ASGI 对象""" raise NotImplementedError @property @abc.abstractmethod def logger(self): + """驱动专属 logger 日志记录器""" raise NotImplementedError @property def bots(self) -> Dict[str, Bot]: + """ + :类型: ``Dict[str, Bot]`` + :说明: 获取当前所有已连接的 Bot + """ return self._clients @abc.abstractmethod def on_startup(self, func: Callable) -> Callable: + """注册一个在驱动启动时运行的函数""" raise NotImplementedError @abc.abstractmethod def on_shutdown(self, func: Callable) -> Callable: + """注册一个在驱动停止时运行的函数""" raise NotImplementedError @abc.abstractmethod @@ -75,44 +109,69 @@ class BaseDriver(abc.ABC): port: Optional[int] = None, *args, **kwargs): + """ + :说明: + 启动驱动框架 + :参数: + * ``host: Optional[str]``: 驱动绑定 IP + * ``post: Optional[int]``: 驱动绑定端口 + * ``*args`` + * ``**kwargs`` + """ raise NotImplementedError @abc.abstractmethod async def _handle_http(self): + """用于处理 HTTP 类型请求的函数""" raise NotImplementedError @abc.abstractmethod async def _handle_ws_reverse(self): + """用于处理 WebSocket 类型请求的函数""" raise NotImplementedError class BaseWebSocket(object): + """WebSocket 连接封装,统一接口方便外部调用。""" @abc.abstractmethod def __init__(self, websocket): + """ + :参数: + * ``websocket: Any``: WebSocket 连接对象 + """ self._websocket = websocket @property def websocket(self): + """WebSocket 连接对象""" return self._websocket @property @abc.abstractmethod def closed(self): + """ + :类型: ``bool`` + :说明: 连接是否已经关闭 + """ raise NotImplementedError @abc.abstractmethod async def accept(self): + """接受 WebSocket 连接请求""" raise NotImplementedError @abc.abstractmethod async def close(self, code: int): + """关闭 WebSocket 连接请求""" raise NotImplementedError @abc.abstractmethod async def receive(self) -> dict: + """接收一条 WebSocket 信息""" raise NotImplementedError @abc.abstractmethod async def send(self, data: dict): + """发送一条 WebSocket 信息""" raise NotImplementedError diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index 8a52b3df..e15beb26 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -1,5 +1,14 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +FastAPI 驱动适配 +================ + +后端使用方法请参考: `FastAPI 文档`_ + +.. _FastAPI 文档: + https://fastapi.tiangolo.com/ +""" import hmac import json @@ -31,6 +40,7 @@ def get_auth_bearer(access_token: Optional[str] = Header( class Driver(BaseDriver): + """FastAPI 驱动框架""" def __init__(self, env: Env, config: Config): super().__init__(env, config) @@ -50,29 +60,35 @@ class Driver(BaseDriver): @property @overrides(BaseDriver) def type(self) -> str: + """驱动名称: ``fastapi``""" return "fastapi" @property @overrides(BaseDriver) def server_app(self) -> FastAPI: + """``FastAPI APP`` 对象""" return self._server_app @property @overrides(BaseDriver) def asgi(self): + """``FastAPI APP`` 对象""" return self._server_app @property @overrides(BaseDriver) def logger(self) -> logging.Logger: + """fastapi 使用的 logger""" return logging.getLogger("fastapi") @overrides(BaseDriver) def on_startup(self, func: Callable) -> Callable: + """参考文档: `Events `_""" return self.server_app.on_event("startup")(func) @overrides(BaseDriver) def on_shutdown(self, func: Callable) -> Callable: + """参考文档: `Events `_""" return self.server_app.on_event("shutdown")(func) @overrides(BaseDriver) @@ -82,6 +98,7 @@ class Driver(BaseDriver): *, app: Optional[str] = None, **kwargs): + """使用 ``uvicorn`` 启动 FastAPI""" LOGGING_CONFIG = { "version": 1, "disable_existing_loggers": False, From 1d79ac232fe8cd90ef91dfe355d32b881e746378 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 15:12:15 +0800 Subject: [PATCH 09/64] :bug: fix missing param for on event --- nonebot/plugin.py | 5 +++-- nonebot/plugin.pyi | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/nonebot/plugin.py b/nonebot/plugin.py index 82439f1a..94628b29 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -27,7 +27,8 @@ class Plugin(object): matcher: Set[Type[Matcher]] -def on(rule: Optional[Union[Rule, RuleChecker]] = None, +def on(type: str = "", + rule: Optional[Union[Rule, RuleChecker]] = None, permission: Optional[Permission] = None, *, handlers: Optional[List[Handler]] = None, @@ -35,7 +36,7 @@ def on(rule: Optional[Union[Rule, RuleChecker]] = None, priority: int = 1, block: bool = False, state: Optional[dict] = None) -> Type[Matcher]: - matcher = Matcher.new("", + matcher = Matcher.new(type, Rule() & rule, permission or Permission(), temp=temp, diff --git a/nonebot/plugin.pyi b/nonebot/plugin.pyi index f75a2ee4..ccb8aed4 100644 --- a/nonebot/plugin.pyi +++ b/nonebot/plugin.pyi @@ -18,7 +18,8 @@ class Plugin(object): matcher: Set[Type[Matcher]] -def on(rule: Optional[Union[Rule, RuleChecker]] = ..., +def on(type: str = ..., + rule: Optional[Union[Rule, RuleChecker]] = ..., permission: Optional[Permission] = ..., *, handlers: Optional[List[Handler]] = ..., From 6afe9b6f4f2109847d2d596d4185ff6845dd240a Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 15:59:34 +0800 Subject: [PATCH 10/64] :memo: Update Readme (fix #27) --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 31fd5ac3..999134d8 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,46 @@ -
- +

+ nonebot +

+ +
# NoneBot -[![License](https://img.shields.io/github/license/nonebot/nonebot2.svg)](LICENSE) -[![PyPI](https://img.shields.io/pypi/v/nonebot2.svg)](https://pypi.python.org/pypi/nonebot2) -![Python Version](https://img.shields.io/badge/python-3.7+-blue.svg) -![CQHTTP Version](https://img.shields.io/badge/cqhttp-11+-black.svg) -[![QQ 群](https://img.shields.io/badge/qq%E7%BE%A4-768887710-orange.svg)](https://jq.qq.com/?_wv=1027&k=5OFifDh) -[![Telegram](https://img.shields.io/badge/telegram-chat-blue.svg)](https://t.me/cqhttp) -[![QQ 版本发布群](https://img.shields.io/badge/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E7%BE%A4-218529254-green.svg)](https://jq.qq.com/?_wv=1027&k=5Nl0zhE) -[![Telegram 版本发布频道](https://img.shields.io/badge/%E7%89%88%E6%9C%AC%E5%8F%91%E5%B8%83%E9%A2%91%E9%81%93-join-green.svg)](https://t.me/cqhttp_release) +_✨ Python 异步机器人框架 ✨_
+

+ + license + + + pypi + + python + cqhttp
+ + QQ Chat + + + Telegram Chat + + + QQ Release + + + Telegram Release + +

+ +

+ 文档 + · + 安装 + · + 开始使用 +

+ ## 简介 NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功能。 @@ -26,6 +53,11 @@ NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人 需要注意的是,NoneBot 仅支持 Python 3.7+ 及 CQHTTP(OneBot) 插件 v11+。 +此外,NoneBot2 还有可配套使用的额外脚手架/框架: + +- [NB-CLI](https://github.com/nonebot/nb-cli) +- [NoneBot-Test](https://github.com/nonebot/nonebot-test) + ## 文档 文档目前尚未完成,「API」部分由 sphinx 自动生成,你可以在 [这里](https://v2.nonebot.dev/) 查看。 From df517b6b363902d9765330167f5b998d14120f9c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 16:03:49 +0800 Subject: [PATCH 11/64] :memo: use p instead of div --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 999134d8..0f9b6c45 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,10 @@ nonebot

-
- -# NoneBot - -_✨ Python 异步机器人框架 ✨_ - -
+

+

NoneBot

+ ✨ Python 异步机器人框架 ✨ +

From 5f44212faa85b3e100f7f81bb065268477ebe5ce Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 16:07:04 +0800 Subject: [PATCH 12/64] :ambulance: restore div --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f9b6c45..25d80cf0 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ nonebot

-

+

NoneBot

✨ Python 异步机器人框架 ✨ -

+

From 78433bdae9c596ed3e3dae1d9013b5251d00ec55 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 16:08:51 +0800 Subject: [PATCH 13/64] :ambulance: restore markdown --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 25d80cf0..999134d8 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,11 @@

-

NoneBot

- ✨ Python 异步机器人框架 ✨ + +# NoneBot + +_✨ Python 异步机器人框架 ✨_ +

From 9ad629841b3ae099da2612e968ed7bae67be9c8d Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 16 Oct 2020 17:15:40 +0800 Subject: [PATCH 14/64] :memo: add uninstall nonebot 1.x tip --- docs/guide/installation.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 06a88598..4f6e68e1 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -6,7 +6,10 @@ 请确保你的 Python 版本 >= 3.7。 ::: +请在安装 nonebot2 之前卸载 nonebot 1.x + ```bash +pip uninstall nonebot pip install nonebot2 ``` From 56c9c24dc6e3db5e87d5a687c83cfe5b1810a69c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sat, 17 Oct 2020 19:50:25 +0800 Subject: [PATCH 15/64] :sparkles: add kwargs support for matcher send/finish/pause/reject --- nonebot/matcher.py | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 9f0d7a9d..f0fe78f9 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -298,66 +298,70 @@ class Matcher(metaclass=MatcherMeta): return _decorator @classmethod - async def send(cls, message: Union[str, Message, MessageSegment]): + async def send(cls, message: Union[str, Message, MessageSegment], **kwargs): """ :说明: 发送一条消息给当前交互用户 :参数: * ``message: Union[str, Message, MessageSegment]``: 消息内容 + * ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api """ bot = current_bot.get() event = current_event.get() - await bot.send(event=event, message=message) + await bot.send(event=event, message=message, **kwargs) @classmethod - async def finish( - cls, - message: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def finish(cls, + message: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: """ :说明: 发送一条消息给当前交互用户并结束当前事件响应器 :参数: * ``message: Union[str, Message, MessageSegment]``: 消息内容 + * ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api """ bot = current_bot.get() event = current_event.get() if message: - await bot.send(event=event, message=message) + await bot.send(event=event, message=message, **kwargs) raise FinishedException @classmethod - async def pause( - cls, - prompt: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def pause(cls, + prompt: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: """ :说明: 发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后继续下一个处理函数 :参数: * ``prompt: Union[str, Message, MessageSegment]``: 消息内容 + * ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api """ bot = current_bot.get() event = current_event.get() if prompt: - await bot.send(event=event, message=prompt) + await bot.send(event=event, message=prompt, **kwargs) raise PausedException @classmethod - async def reject( - cls, - prompt: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def reject(cls, + prompt: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: """ :说明: 发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后重新运行当前处理函数 :参数: * ``prompt: Union[str, Message, MessageSegment]``: 消息内容 + * ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api """ bot = current_bot.get() event = current_event.get() if prompt: - await bot.send(event=event, message=prompt) + await bot.send(event=event, message=prompt, **kwargs) raise RejectedException # 运行handlers From c5a30a8a79a25dc522d9894fce74a58ee8bf5bd9 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 01:39:34 +0800 Subject: [PATCH 16/64] :heavy_plus_sign: use custom theme --- docs/.vuepress/config.js | 80 +-- package-lock.json | 1349 +++++++++++++++++--------------------- package.json | 12 +- 3 files changed, 648 insertions(+), 793 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 76787cf8..298cd1ab 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,10 +1,10 @@ const path = require("path"); -module.exports = context => ({ +module.exports = (context) => ({ title: "NoneBot", description: "基于 酷Q 的 Python 异步 QQ 机器人框架", markdown: { - lineNumbers: true + lineNumbers: true, }, /** * Extra tags to be injected to the page HTML `` @@ -19,26 +19,26 @@ module.exports = context => ({ ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }], [ "meta", - { name: "apple-mobile-web-app-status-bar-style", content: "black" } + { name: "apple-mobile-web-app-status-bar-style", content: "black" }, ], [ "link", { rel: "stylesheet", href: - "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" - } - ] + "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css", + }, + ], ], locales: { "/": { lang: "zh-CN", title: "NoneBot", - description: "基于 酷Q 的 Python 异步 QQ 机器人框架" - } + description: "基于 酷Q 的 Python 异步 QQ 机器人框架", + }, }, - theme: "titanium", + theme: "nonebot", themeConfig: { logo: "/logo.png", repo: "nonebot/nonebot2", @@ -58,7 +58,7 @@ module.exports = context => ({ nav: [ { text: "主页", link: "/" }, { text: "指南", link: "/guide/" }, - { text: "API", link: "/api/" } + { text: "API", link: "/api/" }, ], sidebarDepth: 2, sidebar: { @@ -74,9 +74,9 @@ module.exports = context => ({ "getting-started", "creating-a-project", "basic-configuration", - "writing-a-plugin" - ] - } + "writing-a-plugin", + ], + }, ], "/api/": [ { @@ -86,66 +86,66 @@ module.exports = context => ({ children: [ { title: "nonebot 模块", - path: "nonebot" + path: "nonebot", }, { title: "nonebot.config 模块", - path: "config" + path: "config", }, { title: "nonebot.matcher 模块", - path: "matcher" + path: "matcher", }, { title: "nonebot.rule 模块", - path: "rule" + path: "rule", }, { title: "nonebot.permission 模块", - path: "permission" + path: "permission", }, { title: "nonebot.sched 模块", - path: "sched" + path: "sched", }, { title: "nonebot.log 模块", - path: "log" + path: "log", }, { title: "nonebot.utils 模块", - path: "utils" + path: "utils", }, { title: "nonebot.typing 模块", - path: "typing" + path: "typing", }, { title: "nonebot.exception 模块", - path: "exception" + path: "exception", }, { title: "nonebot.drivers 模块", - path: "drivers/" + path: "drivers/", }, { title: "nonebot.drivers.fastapi 模块", - path: "drivers/fastapi" + path: "drivers/fastapi", }, { title: "nonebot.adapters 模块", - path: "adapters/" + path: "adapters/", }, { title: "nonebot.adapters.cqhttp 模块", - path: "adapters/cqhttp" - } - ] - } - ] - } - } - } + path: "adapters/cqhttp", + }, + ], + }, + ], + }, + }, + }, }, plugins: [ @@ -158,16 +158,16 @@ module.exports = context => ({ pagesSourceDir: path.resolve(context.sourceDir, "..", "pages"), onNewVersion(version, versionDestPath) { console.log(`Created version ${version} in ${versionDestPath}`); - } - } + }, + }, ], [ "container", { type: "vue", before: '

',
-        after: "
" - } - ] - ] + after: "", + }, + ], + ], }); diff --git a/package-lock.json b/package-lock.json index 71d7b190..a12f167d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,30 +14,25 @@ } }, "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", + "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "dev": true }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -49,12 +44,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -79,41 +74,39 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", + "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-validator-option": "^7.12.1", "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "regexpu-core": "^4.7.1" } }, "@babel/helper-define-map": { @@ -128,12 +121,12 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-function-name": { @@ -166,35 +159,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -223,46 +218,44 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -280,10 +273,16 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -293,14 +292,14 @@ } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/highlight": { @@ -315,47 +314,47 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", + "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" + "@babel/plugin-syntax-decorators": "^7.12.1" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -363,9 +362,9 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -373,9 +372,9 @@ } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -383,9 +382,9 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -393,9 +392,9 @@ } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -403,9 +402,9 @@ } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", + "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -413,20 +412,20 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/plugin-transform-parameters": "^7.12.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -434,33 +433,33 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-create-class-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, @@ -474,18 +473,18 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -519,9 +518,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -582,56 +581,56 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", @@ -639,52 +638,52 @@ "@babel/helper-function-name": "^7.10.4", "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", @@ -692,18 +691,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.4", @@ -711,168 +710,168 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", + "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", "resolve": "^1.8.1", "semver": "^5.5.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -880,68 +879,68 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-create-regexp-features-plugin": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", "dev": true, "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-class-properties": "^7.12.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -951,45 +950,42 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", + "@babel/types": "^7.12.1", "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", "semver": "^5.5.0" } }, @@ -1007,9 +1003,9 @@ } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1027,26 +1023,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1085,12 +1081,6 @@ "defer-to-connect": "^1.0.1" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1114,9 +1104,9 @@ "dev": true }, "@types/node": { - "version": "14.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", - "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==", + "version": "14.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz", + "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA==", "dev": true }, "@types/q": { @@ -1126,9 +1116,9 @@ "dev": true }, "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", "dev": true }, "@vue/babel-helper-vue-transform-on": { @@ -1154,14 +1144,14 @@ } }, "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", "html-tags": "^2.0.0", "lodash.kebabcase": "^4.1.1", "svg-tags": "^1.0.0" @@ -1176,9 +1166,9 @@ } }, "@vue/babel-preset-app": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.6.tgz", - "integrity": "sha512-Eps83UNiBJeqlbpR9afYnhvjVLElVtA4fDLNuVUr1r3RbepoxWuq+mUTr3TBArPQebnAaDcrZaNHBWTLRbfo3A==", + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.7.tgz", + "integrity": "sha512-A9ujqmvR9wb8nWiMnEYZW/8QfGZbqxC/etzbKIDrUdsqJ27jx106leMHJc8nmAn58RqGd6iww6uZ3Sx7aYiG3A==", "dev": true, "requires": { "@babel/core": "^7.11.0", @@ -1208,46 +1198,66 @@ } }, "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.2.tgz", + "integrity": "sha512-+PQKZwoh98oHnRnifT5XD4Ybkwe0McDGkcZcFQRfynL1SFg5zfGRscntZ8Lt4QmYs5NiYc2WOQbyrolUlLZedQ==", "dev": true, "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "@vue/babel-sugar-functional-vue": "^1.1.2", - "@vue/babel-sugar-inject-h": "^1.1.2", - "@vue/babel-sugar-v-model": "^1.1.2", - "@vue/babel-sugar-v-on": "^1.1.2" + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.1", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.1", + "@vue/babel-sugar-v-on": "^1.2.1" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.1.tgz", + "integrity": "sha512-F2gQbEMOUPyapqc85/O1Tbw0qBuvgXC/qBcBsjMKqC7KWJ4hK1eJUvU3iLHHTbre6V7zzIjrqEe0SoE1lR4mfw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.1.tgz", + "integrity": "sha512-6kTx+hZVJ6dclAwWXSvfnv4XlkzCzKthQ/xlnypFW8+9uhy3E5ehNiAaHfr83R8+7d3DlvbZrQ9xgbZc1quuJg==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", "camelcase": "^5.0.0", "html-tags": "^2.0.0", "svg-tags": "^1.0.0" @@ -1268,13 +1278,13 @@ } }, "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.1.tgz", + "integrity": "sha512-rQhM52dC/vWxgMmi8ZY5MwudOb9sWrqN4gffbPDV44TNqyd2j1+PmW2qLR0QfcDsAccR5U+gcguHc3qhLSrXNw==", "dev": true, "requires": { "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", "camelcase": "^5.0.0" }, "dependencies": { @@ -1328,18 +1338,18 @@ } }, "@vuepress/core": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.5.4.tgz", - "integrity": "sha512-RaHJiX0Yno4S3zoV64JNd3xE55sza8rayyWvXAJY381XVMxKrsLBrgW6ntNYSkzGnZcxi6fwMV/CVOUhEtkEkA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.7.1.tgz", + "integrity": "sha512-M5sxZq30Ke1vXa4ZZjk6185fwtpiJOqzXNnzcIe0GxtvtaF8Yij6b+KqQKlUJnnUXm+CKxiLCr8PTzDY26N7yw==", "dev": true, "requires": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.5.4", - "@vuepress/markdown-loader": "1.5.4", - "@vuepress/plugin-last-updated": "1.5.4", - "@vuepress/plugin-register-components": "1.5.4", - "@vuepress/shared-utils": "1.5.4", + "@vuepress/markdown": "1.7.1", + "@vuepress/markdown-loader": "1.7.1", + "@vuepress/plugin-last-updated": "1.7.1", + "@vuepress/plugin-register-components": "1.7.1", + "@vuepress/shared-utils": "1.7.1", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", "cache-loader": "^3.0.0", @@ -1361,7 +1371,7 @@ "url-loader": "^1.0.1", "vue": "^2.6.10", "vue-loader": "^15.7.1", - "vue-router": "^3.1.3", + "vue-router": "^3.4.5", "vue-server-renderer": "^2.6.10", "vue-template-compiler": "^2.6.10", "vuepress-html-webpack-plugin": "^3.2.0", @@ -1371,177 +1381,101 @@ "webpack-dev-server": "^3.5.1", "webpack-merge": "^4.1.2", "webpackbar": "3.2.0" - }, - "dependencies": { - "@vuepress/shared-utils": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.5.4.tgz", - "integrity": "sha512-HCeMPEAPjFN1Ongii0BUCI1iB4gBBiQ4PUgh7F4IGG8yBg4tMqWO4NHqCuDCuGEvK7lgHy8veto0SsSvdSKp3g==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "gray-matter": "^4.0.1", - "hash-sum": "^1.0.2", - "semver": "^6.0.0", - "toml": "^3.0.0", - "upath": "^1.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "@vuepress/markdown": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.5.4.tgz", - "integrity": "sha512-bgrR9LTcAa2O0WipTbH3OFKeAfXc/2oU6cUIoMkyihSKUo1Mr5yt1XKM7vHe1uFEZygNr8EAemep8chsuVuISA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.7.1.tgz", + "integrity": "sha512-Ava9vJECHG1+RC53ut1dXSze35IH5tc3qesC06Ny37WS93iDSQy09j8y+a0Lugy12j1369+QQeRFWa40tdHczA==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.5.4", + "@vuepress/shared-utils": "1.7.1", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0", "markdown-it-emoji": "^1.4.0", "markdown-it-table-of-contents": "^0.4.0", "prismjs": "^1.13.0" - }, - "dependencies": { - "@vuepress/shared-utils": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.5.4.tgz", - "integrity": "sha512-HCeMPEAPjFN1Ongii0BUCI1iB4gBBiQ4PUgh7F4IGG8yBg4tMqWO4NHqCuDCuGEvK7lgHy8veto0SsSvdSKp3g==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "gray-matter": "^4.0.1", - "hash-sum": "^1.0.2", - "semver": "^6.0.0", - "toml": "^3.0.0", - "upath": "^1.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "@vuepress/markdown-loader": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.5.4.tgz", - "integrity": "sha512-3R5quGIXQm7gfPWN67SVZ9OBA7VrGEEXJjjV01MYkbfhqVGgO6lBRq73Og0XdKs4RPx4nqJUPthhL8FJVNRTIg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.7.1.tgz", + "integrity": "sha512-GM1F/tRhP9qZydTC89FXJPlLH+BmZijMKom5BYLAMEXsU20A9kABTRoatPjOUbZuKT+gn03JgG97qVd8xa/ETw==", "dev": true, "requires": { - "@vuepress/markdown": "1.5.4", + "@vuepress/markdown": "1.7.1", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" } }, "@vuepress/plugin-active-header-links": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.5.4.tgz", - "integrity": "sha512-FI1Dr/44HVqxLMRSuaVEEwegGVEGFlaWYE3nsXwL7klKr6c+2kXHEw9rSQlAxzJyzVfovTk4dd+s/AMOKuLGZQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.7.1.tgz", + "integrity": "sha512-Wgf/oB9oPZLnYoLjQ/xbQc4Qa3RU5tXAo2dB4Xl/7bUL6SqBxO866kX3wPxKdSOIL58tq8iH9XbUe3Sxi8/ISQ==", "dev": true, "requires": { "lodash.debounce": "^4.0.8" } }, "@vuepress/plugin-back-to-top": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.5.4.tgz", - "integrity": "sha512-FqT3F8VztSiDXtI7xjD4SOeEuyaPYx2zxxU3cH3wfe/amlFWyFPjTWJwAf1GRT5CqS13J2qfEnfWMU/Ct7Xg/Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.7.1.tgz", + "integrity": "sha512-Hw/5kQjqtkHEstifcq4gpdVwS38C3ecruLCUibq3YEES6DJUYZ8tN1oo3FTugYgpXsyn3HxWftyalozcZ2IutA==", "dev": true, "requires": { "lodash.debounce": "^4.0.8" } }, "@vuepress/plugin-last-updated": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.5.4.tgz", - "integrity": "sha512-9kezBCxPM+cevKRNML6Q7v6qkI8NQvKbVkwohlzsElM8FBmjlZmgFyZje66ksTnb/U6ogazCCq9jdOyipNcQ2A==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.7.1.tgz", + "integrity": "sha512-VW5jhBuO0WRHDsBmFsKC6QtEyBLCgyhuH9nQ65aairCn3tdoJPz0uQ4g3lr/boVbgsPexO677Sn3dRPgYqnMug==", "dev": true, "requires": { "cross-spawn": "^6.0.5" } }, "@vuepress/plugin-medium-zoom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.5.4.tgz", - "integrity": "sha512-4lK6HmdjyBbWAyYKKGYgIjW7cM8xu/OMTsPwJZQPj/fY1QVVZzy/4FhxSvQDm47JSru6NMQaCQv7DJIdBNA7VQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.7.1.tgz", + "integrity": "sha512-pYI6myr4bi9SYzvR6D4r7+YpjpXgudCbontXKZIARS7hJ+kVBapVYnetrbeNFKq+7a/QGOkAuAK2j39dQLaMXQ==", "dev": true, "requires": { "medium-zoom": "^1.0.4" } }, "@vuepress/plugin-nprogress": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.5.3.tgz", - "integrity": "sha512-SBa4uoRBaBPF+TrN38y/eFSnj1c2a53EuyY+vYijrWq5+nmDCQkpoClpS4a90f2eG2shMIvsMxUsS8waMKFZ8w==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.7.1.tgz", + "integrity": "sha512-KtqfI3RitbsEbm22EhbooTvhjfMf6zttKlbND7LcyJwP3MEPVYyzQJuET03hk9z4SgCfNV2r/W3sYyejzzTMog==", "dev": true, "requires": { "nprogress": "^0.2.0" } }, "@vuepress/plugin-register-components": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.5.4.tgz", - "integrity": "sha512-Y1U9j6unZp1ZhnHjQ9yOPY+vxldUA3C1EwT6UgI75j5gxa5Hz6NakoIo6mbhaYHlGmx33o/MXrxufLPapo/YlQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz", + "integrity": "sha512-MlFdH6l3rTCJlGMvyssXVG998cq5LSMzxCuQLYcRdtHQT4HbikIcV4HSPGarWInD1mP12+qX/PvKUawGwp1eVg==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.5.4" - }, - "dependencies": { - "@vuepress/shared-utils": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.5.4.tgz", - "integrity": "sha512-HCeMPEAPjFN1Ongii0BUCI1iB4gBBiQ4PUgh7F4IGG8yBg4tMqWO4NHqCuDCuGEvK7lgHy8veto0SsSvdSKp3g==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "escape-html": "^1.0.3", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "gray-matter": "^4.0.1", - "hash-sum": "^1.0.2", - "semver": "^6.0.0", - "toml": "^3.0.0", - "upath": "^1.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@vuepress/shared-utils": "1.7.1" } }, "@vuepress/plugin-search": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.5.3.tgz", - "integrity": "sha512-LCqqgKQ1I26oWE3N5OKeZMV0xtWv2WURI+bhxirM1xL0OpCQyqwk/rLHWBto+j4Y0ScxgXiRxa9Zs2E6eY6Dnw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.7.1.tgz", + "integrity": "sha512-OmiGM5eYg9c+uC50b6/cSxAhqxfD7AIui6JEztFGeECrlP33RLHmteXK9YBBZjp5wTNmoYs+NXI/cWggYUPW8Q==", "dev": true }, "@vuepress/shared-utils": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.5.3.tgz", - "integrity": "sha512-/eTSADRZ0Iz1REnIkQ1ouoWY0ZH9ivH6IuGT19H/WBe8gru2EoK7jUqpXE8JHcGf6pxkK3qB4E/DNCO9Cyy4yg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.7.1.tgz", + "integrity": "sha512-ydB2ZKsFZE6hFRb9FWqzZksxAPIMJjtBawk50RP6F+YX5HbID/HlyYYZM9aDSbk6RTkjgB5UzJjggA2xM8POlw==", "dev": true, "requires": { "chalk": "^2.3.2", - "diacritics": "^1.3.0", "escape-html": "^1.0.3", "fs-extra": "^7.0.1", "globby": "^9.2.0", @@ -1561,37 +1495,20 @@ } }, "@vuepress/theme-default": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.5.4.tgz", - "integrity": "sha512-kHst1yXzqTiocVU7w9x4cfJ08vR9ZbREC6kTRtH1ytQSEUL5tM0b9HFicfg1kDp7YNq2qntRro+WmfjU9Ps/eg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.7.1.tgz", + "integrity": "sha512-a9HeTrlcWQj3ONHiABmlN2z9TyIxKfQtLsA8AL+WgjN3PikhFuZFIJGzfr+NLt67Y9oiI+S9ZfiaVyvWM+7bWQ==", "dev": true, "requires": { - "@vuepress/plugin-active-header-links": "1.5.4", - "@vuepress/plugin-nprogress": "1.5.4", - "@vuepress/plugin-search": "1.5.4", + "@vuepress/plugin-active-header-links": "1.7.1", + "@vuepress/plugin-nprogress": "1.7.1", + "@vuepress/plugin-search": "1.7.1", "docsearch.js": "^2.5.2", "lodash": "^4.17.15", - "stylus": "^0.54.5", + "stylus": "^0.54.8", "stylus-loader": "^3.0.2", "vuepress-plugin-container": "^2.0.2", "vuepress-plugin-smooth-scroll": "^0.0.3" - }, - "dependencies": { - "@vuepress/plugin-nprogress": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.5.4.tgz", - "integrity": "sha512-2bGKoO/o2e5mIfOU80q+AkxOK5wVijA/+8jGjSQVf2ccMpJw+Ly1mMi69r81Q0QkEihgfI9VN42a5+a6LUgPBw==", - "dev": true, - "requires": { - "nprogress": "^0.2.0" - } - }, - "@vuepress/plugin-search": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.5.4.tgz", - "integrity": "sha512-wikU9XYiZ3Olbii0lI+56mcSdpzHHkduVBMB4MNEV5iob23qDxGPmvfZirjsZV20w1UnLRptERyHtZkTLW9Mbg==", - "dev": true - } } }, "@webassemblyjs/ast": { @@ -1798,9 +1715,9 @@ } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "agentkeepalive": { @@ -1810,9 +1727,9 @@ "dev": true }, "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -2381,12 +2298,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -2622,14 +2538,14 @@ } }, "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", "node-releases": "^1.1.61" } }, @@ -2832,9 +2748,9 @@ } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", "dev": true }, "caniuse-api": { @@ -2850,9 +2766,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001131", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", - "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==", + "version": "1.0.30001148", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001148.tgz", + "integrity": "sha512-E66qcd0KMKZHNJQt9hiLZGE3J4zuTqE1OnU53miEVtylFbwOEmeA5OsRu90noZful+XGSQOni1aT2tiqu/9yYw==", "dev": true }, "caseless": { @@ -3040,13 +2956,13 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-string": "^1.5.4" } }, "color-convert": { @@ -3065,9 +2981,9 @@ "dev": true }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -3602,9 +3518,9 @@ } }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssesc": { @@ -3745,12 +3661,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -3945,12 +3861,6 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, - "diacritics": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", - "integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E=", - "dev": true - }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -4045,9 +3955,9 @@ "dev": true }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true } } @@ -4133,9 +4043,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.569", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.569.tgz", - "integrity": "sha512-HViXDebvp9yx3GHjNmMEzfl7RhE1N+r+4iHmRAswpwWTtf/UaYi4QGSfjOhYn5MACiONjh9+XwZzHA6NccAEtQ==", + "version": "1.3.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz", + "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==", "dev": true }, "elliptic": { @@ -4252,21 +4162,21 @@ } }, "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", + "is-callable": "^1.2.2", "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -4289,9 +4199,9 @@ "dev": true }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-goat": { @@ -5536,15 +5446,6 @@ "ipaddr.js": "^1.9.0" } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -5617,9 +5518,9 @@ "dev": true }, "is-callable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz", - "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -6053,21 +5954,6 @@ "package-json": "^6.3.0" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -6188,15 +6074,6 @@ "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -6593,9 +6470,9 @@ "dev": true }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "dev": true, "optional": true }, @@ -6691,9 +6568,9 @@ } }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "version": "1.1.63", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.63.tgz", + "integrity": "sha512-ukW3iCfQaoxJkSPN+iK7KznTeqDGVJatAEuXsJERYHa9tn/KaT5lBdIyxQjLEVTzSkyjJEuQ17/vaEjrOauDkg==", "dev": true }, "nopt": { @@ -6808,34 +6685,13 @@ "dev": true }, "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", - "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.18.0-next.1" } }, "object-keys": { @@ -6876,20 +6732,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -6918,20 +6774,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -7290,9 +7146,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -7318,9 +7174,9 @@ } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "dev": true, "requires": { "postcss": "^7.0.27", @@ -7404,9 +7260,9 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -7848,14 +7704,15 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { @@ -7925,9 +7782,9 @@ "dev": true }, "prismjs": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.21.0.tgz", - "integrity": "sha512-uGdSIu1nk3kej2iZsLyDoJ7e9bnPzIgY0naW/HdknGj61zScaprVEVGHrPoXqI+M9sP0NDnTK2jpkvmldpuqDw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.22.0.tgz", + "integrity": "sha512-lLJ/Wt9yy0AiSYBf212kK3mM5L8ycwlyTlSxHBAneXLR0nzFMlZ5y7riFPF3E33zXOF2IH95xdY5jIyZbM9z/w==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -8233,20 +8090,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -8254,9 +8111,9 @@ } }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { "regenerate": "^1.4.0", @@ -9292,20 +9149,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -9323,20 +9180,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -9719,9 +9576,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tty-browserify": { @@ -9950,9 +9807,9 @@ "dev": true }, "update-notifier": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", - "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", "dev": true, "requires": { "boxen": "^4.2.0", @@ -9971,12 +9828,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -10029,9 +9885,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -10146,20 +10002,20 @@ }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -10239,9 +10095,9 @@ } }, "vue-router": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.3.tgz", - "integrity": "sha512-BADg1mjGWX18Dpmy6bOGzGNnk7B/ZA0RxuA6qedY/YJwirMfKXIDzcccmHbQI0A6k5PzMdMloc0ElHfyOoX35A==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.7.tgz", + "integrity": "sha512-CbHXue5BLrDivOk5O4eZ0WT4Yj8XwdXa4kCnsEIOzYUPF/07ZukayA2jGxDCJxLc9SgVQX9QX0OuGOwGlVB4Qg==", "dev": true }, "vue-server-renderer": { @@ -10329,13 +10185,13 @@ "dev": true }, "vuepress": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.5.4.tgz", - "integrity": "sha512-F25r65BzxDFAJmWIN9s9sQSndLIf1ldAKEwkeXCqE4p2lsx/eVvQJL3DzOeeR2WgCFOkhFMKWIV+CthTGdNTZg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.7.1.tgz", + "integrity": "sha512-AdA3do1L4DNzeF8sMTE+cSUJ5hR/6f3YujU8DVowi/vFOg/SX2lJF8urvDkZUSXzaAT6aSgkI9L+B6D+i7SJjA==", "dev": true, "requires": { - "@vuepress/core": "1.5.4", - "@vuepress/theme-default": "1.5.4", + "@vuepress/core": "1.7.1", + "@vuepress/theme-default": "1.7.1", "cac": "^6.5.6", "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", @@ -10400,11 +10256,12 @@ } }, "vuepress-plugin-container": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.4.tgz", - "integrity": "sha512-l+EkeL+rC6DJch1wAZUFIkNDaz2TNOg4NQTHa3yMAsYkC+QaSRubGdN6YwOSmfjxVmM9s9D3gwBWw0O7OBhqRg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", "dev": true, "requires": { + "@vuepress/shared-utils": "^1.2.0", "markdown-it-container": "^2.0.0" } }, @@ -10418,9 +10275,8 @@ } }, "vuepress-plugin-versioning": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vuepress-plugin-versioning/-/vuepress-plugin-versioning-4.5.0.tgz", - "integrity": "sha512-tnth/oXq5yqTHvfbSfl1GaPIQcr8ckSDX+wyecnm3tS/FSaZH55Fb8wPwhdM2jEEXWPe6DpQCh9O7fvsthIvRQ==", + "version": "git+https://github.com/nonebot/vuepress-plugin-versioning.git#cae7ad04c266f8bd9af91883d5942204c9197c17", + "from": "git+https://github.com/nonebot/vuepress-plugin-versioning.git", "dev": true, "requires": { "@vuepress/shared-utils": "^1.5.2", @@ -10440,10 +10296,9 @@ } } }, - "vuepress-theme-titanium": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vuepress-theme-titanium/-/vuepress-theme-titanium-4.5.1.tgz", - "integrity": "sha512-yWDbv4Omwk611ftN0WEAf30n4dE0TbyH7ROPYTt3u185hhE8qRiba9HJBwm8CU2CKfp+Yjv5y24V/OHGfSqJzQ==", + "vuepress-theme-nonebot": { + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#50350c979ce5a0a8ef21c1d17d936ac263ae691a", + "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { "@vuepress/plugin-nprogress": "^1.5.2", @@ -10468,9 +10323,9 @@ } }, "vuetify": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.10.tgz", - "integrity": "sha512-KzL/MhZ7ajubm9kwbdCoA/cRV50RX+a5Hcqiwt7Am1Fni2crDtl2no05UNwKroTfscrYYf07gq3WIFSurPsnCA==" + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.14.tgz", + "integrity": "sha512-1Ys1MreJQOL/Ddp3YotBi1SlC2+1A0/RVkDXX3Azspt8incPdAnNB0JyChHiJ/TM+L+KSA7T4EXF9YDrCWENmg==" }, "watchpack": { "version": "1.7.4", @@ -10513,9 +10368,9 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "optional": true, "requires": { @@ -10526,7 +10381,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "fill-range": { @@ -10574,9 +10429,9 @@ "optional": true }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "optional": true, "requires": { @@ -10615,9 +10470,9 @@ } }, "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", diff --git a/package.json b/package.json index 0b6ca771..5612d90b 100644 --- a/package.json +++ b/package.json @@ -20,14 +20,14 @@ }, "license": "MIT", "devDependencies": { - "@vuepress/plugin-back-to-top": "^1.5.4", - "@vuepress/plugin-medium-zoom": "^1.5.4", - "vuepress": "^1.5.4", - "vuepress-plugin-versioning": "^4.5.0", - "vuepress-theme-titanium": "^4.5.1" + "@vuepress/plugin-back-to-top": "^1.7.1", + "@vuepress/plugin-medium-zoom": "^1.7.1", + "vuepress": "^1.7.1", + "vuepress-plugin-versioning": "git+https://github.com/nonebot/vuepress-plugin-versioning.git", + "vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git" }, "dependencies": { - "vuetify": "^2.3.10", + "vuetify": "^2.3.14", "wowjs": "^1.1.3" } } From 1b6924a104a0a84dff35bbbb0b2a363776397927 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 02:04:32 +0800 Subject: [PATCH 17/64] :alien: update lock file --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index a12f167d..09ce9a94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10297,7 +10297,7 @@ } }, "vuepress-theme-nonebot": { - "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#50350c979ce5a0a8ef21c1d17d936ac263ae691a", + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#435dd344a8f3522fba5309ae413002fb5cd48981", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { From 8db70dbb0caa23df007c9a4a66a4d1a681d623a6 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 02:30:01 +0800 Subject: [PATCH 18/64] :alien: fix theme smooth scroll --- docs/.vuepress/config.js | 78 ++++++++++++++++++++-------------------- package-lock.json | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 298cd1ab..7ab0bf99 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,10 +1,10 @@ const path = require("path"); -module.exports = (context) => ({ +module.exports = context => ({ title: "NoneBot", description: "基于 酷Q 的 Python 异步 QQ 机器人框架", markdown: { - lineNumbers: true, + lineNumbers: true }, /** * Extra tags to be injected to the page HTML `` @@ -19,23 +19,23 @@ module.exports = (context) => ({ ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }], [ "meta", - { name: "apple-mobile-web-app-status-bar-style", content: "black" }, + { name: "apple-mobile-web-app-status-bar-style", content: "black" } ], [ "link", { rel: "stylesheet", href: - "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css", - }, - ], + "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" + } + ] ], locales: { "/": { lang: "zh-CN", title: "NoneBot", - description: "基于 酷Q 的 Python 异步 QQ 机器人框架", - }, + description: "基于 酷Q 的 Python 异步 QQ 机器人框架" + } }, theme: "nonebot", @@ -58,7 +58,7 @@ module.exports = (context) => ({ nav: [ { text: "主页", link: "/" }, { text: "指南", link: "/guide/" }, - { text: "API", link: "/api/" }, + { text: "API", link: "/api/" } ], sidebarDepth: 2, sidebar: { @@ -74,9 +74,9 @@ module.exports = (context) => ({ "getting-started", "creating-a-project", "basic-configuration", - "writing-a-plugin", - ], - }, + "writing-a-plugin" + ] + } ], "/api/": [ { @@ -86,66 +86,66 @@ module.exports = (context) => ({ children: [ { title: "nonebot 模块", - path: "nonebot", + path: "nonebot" }, { title: "nonebot.config 模块", - path: "config", + path: "config" }, { title: "nonebot.matcher 模块", - path: "matcher", + path: "matcher" }, { title: "nonebot.rule 模块", - path: "rule", + path: "rule" }, { title: "nonebot.permission 模块", - path: "permission", + path: "permission" }, { title: "nonebot.sched 模块", - path: "sched", + path: "sched" }, { title: "nonebot.log 模块", - path: "log", + path: "log" }, { title: "nonebot.utils 模块", - path: "utils", + path: "utils" }, { title: "nonebot.typing 模块", - path: "typing", + path: "typing" }, { title: "nonebot.exception 模块", - path: "exception", + path: "exception" }, { title: "nonebot.drivers 模块", - path: "drivers/", + path: "drivers/" }, { title: "nonebot.drivers.fastapi 模块", - path: "drivers/fastapi", + path: "drivers/fastapi" }, { title: "nonebot.adapters 模块", - path: "adapters/", + path: "adapters/" }, { title: "nonebot.adapters.cqhttp 模块", - path: "adapters/cqhttp", - }, - ], - }, - ], - }, - }, - }, + path: "adapters/cqhttp" + } + ] + } + ] + } + } + } }, plugins: [ @@ -158,16 +158,16 @@ module.exports = (context) => ({ pagesSourceDir: path.resolve(context.sourceDir, "..", "pages"), onNewVersion(version, versionDestPath) { console.log(`Created version ${version} in ${versionDestPath}`); - }, - }, + } + } ], [ "container", { type: "vue", before: '
',
-        after: "
", - }, - ], - ], + after: "" + } + ] + ] }); diff --git a/package-lock.json b/package-lock.json index 09ce9a94..cc682d09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10297,7 +10297,7 @@ } }, "vuepress-theme-nonebot": { - "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#435dd344a8f3522fba5309ae413002fb5cd48981", + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#886b82a648d8d216254a5bab87add573d30f5d28", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { From 26207f762b467e88f022942e11f81828e1d7e84b Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 15:02:56 +0800 Subject: [PATCH 19/64] :label: fix class inherit in pyi --- nonebot/adapters/cqhttp.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nonebot/adapters/cqhttp.pyi b/nonebot/adapters/cqhttp.pyi index 25e8a7a3..7920bfe3 100644 --- a/nonebot/adapters/cqhttp.pyi +++ b/nonebot/adapters/cqhttp.pyi @@ -1,7 +1,7 @@ import asyncio from nonebot.config import Config -from nonebot.adapters import BaseBot +from nonebot.adapters import BaseBot, BaseEvent, BaseMessage, BaseMessageSegment from nonebot.typing import Any, Dict, List, Union, Driver, Optional, NoReturn, WebSocket, Iterable @@ -750,7 +750,7 @@ class Bot(BaseBot): ... -class Event: +class Event(BaseEvent): def __init__(self, raw_event: dict): ... @@ -856,7 +856,7 @@ class Event: ... -class MessageSegment: +class MessageSegment(BaseMessageSegment): def __init__(self, type: str, data: Dict[str, Any]) -> None: ... @@ -982,7 +982,7 @@ class MessageSegment: ... -class Message: +class Message(BaseMessage): @staticmethod def _construct(msg: Union[str, dict, list]) -> Iterable[MessageSegment]: From 7c1741210650da5418027a312cbed630c4fe270e Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 15:04:45 +0800 Subject: [PATCH 20/64] :bulb: add plugin docstring --- docs/.vuepress/config.js | 4 + docs/api/README.md | 3 + docs/api/matcher.md | 20 +- docs/api/plugin.md | 591 +++++++++++++++++++++++++++++++++++++++ docs/api/rule.md | 4 + docs_build/README.rst | 1 + docs_build/plugin.rst | 12 + nonebot/plugin.py | 252 +++++++++++++++-- nonebot/rule.py | 4 + 9 files changed, 866 insertions(+), 25 deletions(-) create mode 100644 docs/api/plugin.md create mode 100644 docs_build/plugin.rst diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 7ab0bf99..2713db96 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -92,6 +92,10 @@ module.exports = context => ({ title: "nonebot.config 模块", path: "config" }, + { + title: "nonebot.plugin 模块", + path: "plugin" + }, { title: "nonebot.matcher 模块", path: "matcher" diff --git a/docs/api/README.md b/docs/api/README.md index 52c6e9f6..dcfb548c 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -10,6 +10,9 @@ * [nonebot.config](config.html) + * [nonebot.plugin](plugin.html) + + * [nonebot.matcher](matcher.html) diff --git a/docs/api/matcher.md b/docs/api/matcher.md index c1176030..b061cd64 100644 --- a/docs/api/matcher.md +++ b/docs/api/matcher.md @@ -377,7 +377,7 @@ sidebarDepth: 0 -### _async classmethod_ `send(message)` +### _async classmethod_ `send(message, **kwargs)` * **说明** @@ -392,8 +392,11 @@ sidebarDepth: 0 * `message: Union[str, Message, MessageSegment]`: 消息内容 + * `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api -### _async classmethod_ `finish(message=None)` + + +### _async classmethod_ `finish(message=None, **kwargs)` * **说明** @@ -408,8 +411,11 @@ sidebarDepth: 0 * `message: Union[str, Message, MessageSegment]`: 消息内容 + * `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api -### _async classmethod_ `pause(prompt=None)` + + +### _async classmethod_ `pause(prompt=None, **kwargs)` * **说明** @@ -424,8 +430,11 @@ sidebarDepth: 0 * `prompt: Union[str, Message, MessageSegment]`: 消息内容 + * `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api -### _async classmethod_ `reject(prompt=None)` + + +### _async classmethod_ `reject(prompt=None, **kwargs)` * **说明** @@ -440,6 +449,9 @@ sidebarDepth: 0 * `prompt: Union[str, Message, MessageSegment]`: 消息内容 + * `**kwargs`: 其他传递给 `bot.send` 的参数,请参考对应 adapter 的 bot 对象 api + + ## _class_ `MatcherGroup` diff --git a/docs/api/plugin.md b/docs/api/plugin.md new file mode 100644 index 00000000..6ec390e3 --- /dev/null +++ b/docs/api/plugin.md @@ -0,0 +1,591 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +# NoneBot.plugin 模块 + +## 插件 + +为 NoneBot 插件开发提供便携的定义函数。 + + +## `plugins` + + +* **类型** + + `Dict[str, Plugin]` + + + +* **说明** + + 已加载的插件 + + + +## _class_ `Plugin` + +基类:`object` + +存储插件信息 + + +### `name` + + +* **类型**: `str` + + +* **说明**: 插件名称,使用 文件/文件夹 名称作为插件名 + + +### `module` + + +* **类型**: `ModuleType` + + +* **说明**: 插件模块对象 + + +### `matcher` + + +* **类型**: `Set[Type[Matcher]]` + + +* **说明**: 插件内定义的 `Matcher` + + +## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` + + +* **说明** + + 注册一个基础事件响应器,可自定义类型。 + + + +* **参数** + + + * `type: str`: 事件响应器类型 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_metaevent(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` + + +* **说明** + + 注册一个元事件响应器。 + + + +* **参数** + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_message(rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=True, state=None)` + + +* **说明** + + 注册一个消息事件响应器。 + + + +* **参数** + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_notice(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` + + +* **说明** + + 注册一个通知事件响应器。 + + + +* **参数** + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_request(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` + + +* **说明** + + 注册一个请求事件响应器。 + + + +* **参数** + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_startswith(msg, rule=None, **kwargs)` + + +* **说明** + + 注册一个消息事件响应器,并且当消息的\*\*文本部分\*\*以指定内容开头时响应。 + + + +* **参数** + + + * `msg: str`: 指定消息开头内容 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_endswith(msg, rule=None, **kwargs)` + + +* **说明** + + 注册一个消息事件响应器,并且当消息的\*\*文本部分\*\*以指定内容结尾时响应。 + + + +* **参数** + + + * `msg: str`: 指定消息结尾内容 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## `on_command(cmd, rule=None, aliases=None, **kwargs)` + + +* **说明** + + 注册一个消息事件响应器,并且当消息以指定命令开头时响应。 + + 命令匹配规则参考: [命令形式匹配](rule.html#command-command) + + + +* **参数** + + + * `cmd: Union[str, Tuple[str, ...]]`: 指定命令内容 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `aliases: Optional[Set[Union[str, Tuple[str, ...]]]]`: 命令别名 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + * `MatcherGroup` + + + +## `on_regex(pattern, flags=0, rule=None, **kwargs)` + + +* **说明** + + 注册一个消息事件响应器,并且当消息匹配正则表达式时响应。 + + 命令匹配规则参考: [正则匹配](rule.html#regex-regex-flags-0) + + + +* **参数** + + + * `pattern: str`: 正则表达式 + + + * `flags: Union[int, re.RegexFlag]`: 正则匹配标志 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + +## _class_ `CommandGroup` + +基类:`object` + +命令组,用于声明一组有相同名称前缀的命令。 + + +### `__init__(cmd, **kwargs)` + + +* **参数** + + + * `cmd: Union[str, Tuple[str, ...]]`: 命令前缀 + + + * `**kwargs`: 其他传递给 `on_command` 的参数默认值,参考 [on_command](#on-command-cmd-rule-none-aliases-none-kwargs) + + + +### `basecmd` + + +* **类型**: `Tuple[str, ...]` + + +* **说明**: 命令前缀 + + +### `base_kwargs` + + +* **类型**: `Dict[str, Any]` + + +* **说明**: 其他传递给 `on_command` 的参数默认值 + + +### `command(cmd, **kwargs)` + + +* **说明** + + 注册一个新的命令。 + + + +* **参数** + + + * `cmd: Union[str, Tuple[str, ...]]`: 命令前缀 + + + * `**kwargs`: 其他传递给 `on_command` 的参数,将会覆盖命令组默认值 + + + +* **返回** + + + * `Type[Matcher]` + + + * `MatcherGroup` + + + +## `load_plugin(module_path)` + + +* **说明** + + 使用 `importlib` 加载单个插件,可以是本地插件或是通过 `pip` 安装的插件。 + + + +* **参数** + + + * `module_path: str`: 插件名称 `path.to.your.plugin` + + + +* **返回** + + + * `Optional[Plugin]` + + + +## `load_plugins(*plugin_dir)` + + +* **说明** + + 导入目录下多个插件,以 `_` 开头的插件不会被导入! + + + +* **参数** + + + * `*plugin_dir: str`: 插件路径 + + + +* **返回** + + + * `Set[Plugin]` + + + +## `load_builtin_plugins()` + + +* **说明** + + 导入 NoneBot 内置插件 + + + +* **返回** + + + * `Plugin` + + + +## `get_loaded_plugins()` + + +* **说明** + + 获取当前已导入的插件。 + + + +* **返回** + + + * `Set[Plugin]` diff --git a/docs/api/rule.md b/docs/api/rule.md index 2054d04b..d3eac6ad 100644 --- a/docs/api/rule.md +++ b/docs/api/rule.md @@ -186,6 +186,10 @@ Rule(async_function, run_sync(sync_function)) * `flags: Union[int, re.RegexFlag]`: 正则标志 +:::tip 提示 +正则表达式匹配使用 search 而非 match,如需从头匹配请使用 `r"^xxx"` 来确保匹配开头 +::: + ## `to_me()` diff --git a/docs_build/README.rst b/docs_build/README.rst index 20439caa..02d097be 100644 --- a/docs_build/README.rst +++ b/docs_build/README.rst @@ -4,6 +4,7 @@ NoneBot Api Reference :模块索引: - `nonebot `_ - `nonebot.config `_ + - `nonebot.plugin `_ - `nonebot.matcher `_ - `nonebot.rule `_ - `nonebot.permission `_ diff --git a/docs_build/plugin.rst b/docs_build/plugin.rst new file mode 100644 index 00000000..752fbe4a --- /dev/null +++ b/docs_build/plugin.rst @@ -0,0 +1,12 @@ +--- +contentSidebar: true +sidebarDepth: 0 +--- + +NoneBot.plugin 模块 +==================== + +.. automodule:: nonebot.plugin + :members: + :show-inheritance: + :special-members: __init__ diff --git a/nonebot/plugin.py b/nonebot/plugin.py index 94628b29..c247b91a 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -1,5 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +插件 +==== + +为 NoneBot 插件开发提供便携的定义函数。 +""" import re import sys @@ -13,18 +19,35 @@ from nonebot.permission import Permission from nonebot.typing import Handler, RuleChecker from nonebot.matcher import Matcher, MatcherGroup from nonebot.rule import Rule, startswith, endswith, command, regex -from nonebot.typing import Set, List, Dict, Type, Tuple, Union, Optional, ModuleType +from nonebot.typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, ModuleType plugins: Dict[str, "Plugin"] = {} +""" +:类型: ``Dict[str, Plugin]`` +:说明: 已加载的插件 +""" _tmp_matchers: Set[Type[Matcher]] = set() @dataclass(eq=False) class Plugin(object): + """存储插件信息""" name: str + """ + - **类型**: ``str`` + - **说明**: 插件名称,使用 文件/文件夹 名称作为插件名 + """ module: ModuleType + """ + - **类型**: ``ModuleType`` + - **说明**: 插件模块对象 + """ matcher: Set[Type[Matcher]] + """ + - **类型**: ``Set[Type[Matcher]]`` + - **说明**: 插件内定义的 ``Matcher`` + """ def on(type: str = "", @@ -36,6 +59,21 @@ def on(type: str = "", priority: int = 1, block: bool = False, state: Optional[dict] = None) -> Type[Matcher]: + """ + :说明: + 注册一个基础事件响应器,可自定义类型。 + :参数: + * ``type: str``: 事件响应器类型 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ matcher = Matcher.new(type, Rule() & rule, permission or Permission(), @@ -55,6 +93,19 @@ def on_metaevent(rule: Optional[Union[Rule, RuleChecker]] = None, priority: int = 1, block: bool = False, state: Optional[dict] = None) -> Type[Matcher]: + """ + :说明: + 注册一个元事件响应器。 + :参数: + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ matcher = Matcher.new("meta_event", Rule() & rule, Permission(), @@ -75,6 +126,20 @@ def on_message(rule: Optional[Union[Rule, RuleChecker]] = None, priority: int = 1, block: bool = True, state: Optional[dict] = None) -> Type[Matcher]: + """ + :说明: + 注册一个消息事件响应器。 + :参数: + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ matcher = Matcher.new("message", Rule() & rule, permission or Permission(), @@ -94,6 +159,19 @@ def on_notice(rule: Optional[Union[Rule, RuleChecker]] = None, priority: int = 1, block: bool = False, state: Optional[dict] = None) -> Type[Matcher]: + """ + :说明: + 注册一个通知事件响应器。 + :参数: + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ matcher = Matcher.new("notice", Rule() & rule, Permission(), @@ -113,6 +191,19 @@ def on_request(rule: Optional[Union[Rule, RuleChecker]] = None, priority: int = 1, block: bool = False, state: Optional[dict] = None) -> Type[Matcher]: + """ + :说明: + 注册一个请求事件响应器。 + :参数: + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ matcher = Matcher.new("request", Rule() & rule, Permission(), @@ -128,6 +219,21 @@ def on_request(rule: Optional[Union[Rule, RuleChecker]] = None, def on_startswith(msg: str, rule: Optional[Optional[Union[Rule, RuleChecker]]] = None, **kwargs) -> Type[Matcher]: + """ + :说明: + 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容开头时响应。 + :参数: + * ``msg: str``: 指定消息开头内容 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ return on_message(startswith(msg) & rule, **kwargs) if rule else on_message( startswith(msg), **kwargs) @@ -135,6 +241,21 @@ def on_startswith(msg: str, def on_endswith(msg: str, rule: Optional[Optional[Union[Rule, RuleChecker]]] = None, **kwargs) -> Type[Matcher]: + """ + :说明: + 注册一个消息事件响应器,并且当消息的**文本部分**以指定内容结尾时响应。 + :参数: + * ``msg: str``: 指定消息结尾内容 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ return on_message(endswith(msg) & rule, **kwargs) if rule else on_message( startswith(msg), **kwargs) @@ -143,6 +264,25 @@ def on_command(cmd: Union[str, Tuple[str, ...]], rule: Optional[Union[Rule, RuleChecker]] = None, aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None, **kwargs) -> Union[Type[Matcher], MatcherGroup]: + """ + :说明: + 注册一个消息事件响应器,并且当消息以指定命令开头时响应。 + + 命令匹配规则参考: `命令形式匹配 `_ + :参数: + * ``cmd: Union[str, Tuple[str, ...]]``: 指定命令内容 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``aliases: Optional[Set[Union[str, Tuple[str, ...]]]]``: 命令别名 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + - ``MatcherGroup`` + """ if isinstance(cmd, str): cmd = (cmd,) @@ -173,12 +313,80 @@ def on_regex(pattern: str, flags: Union[int, re.RegexFlag] = 0, rule: Optional[Rule] = None, **kwargs) -> Type[Matcher]: + """ + :说明: + 注册一个消息事件响应器,并且当消息匹配正则表达式时响应。 + + 命令匹配规则参考: `正则匹配 `_ + :参数: + * ``pattern: str``: 正则表达式 + * ``flags: Union[int, re.RegexFlag]``: 正则匹配标志 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ return on_message(regex(pattern, flags) & rule, **kwargs) if rule else on_message( regex(pattern, flags), **kwargs) +class CommandGroup: + """命令组,用于声明一组有相同名称前缀的命令。""" + + def __init__(self, cmd: Union[str, Tuple[str, ...]], **kwargs): + """ + :参数: + * ``cmd: Union[str, Tuple[str, ...]]``: 命令前缀 + * ``**kwargs``: 其他传递给 ``on_command`` 的参数默认值,参考 `on_command <#on-command-cmd-rule-none-aliases-none-kwargs>`_ + """ + self.basecmd: Tuple[str, ...] = (cmd,) if isinstance(cmd, str) else cmd + """ + - **类型**: ``Tuple[str, ...]`` + - **说明**: 命令前缀 + """ + if "aliases" in kwargs: + del kwargs["aliases"] + self.base_kwargs: Dict[str, Any] = kwargs + """ + - **类型**: ``Dict[str, Any]`` + - **说明**: 其他传递给 ``on_command`` 的参数默认值 + """ + + def command(self, cmd: Union[str, Tuple[str, ...]], + **kwargs) -> Union[Type[Matcher], MatcherGroup]: + """ + :说明: + 注册一个新的命令。 + :参数: + * ``cmd: Union[str, Tuple[str, ...]]``: 命令前缀 + * ``**kwargs``: 其他传递给 ``on_command`` 的参数,将会覆盖命令组默认值 + :返回: + - ``Type[Matcher]`` + - ``MatcherGroup`` + """ + sub_cmd = (cmd,) if isinstance(cmd, str) else cmd + cmd = self.basecmd + sub_cmd + + final_kwargs = self.base_kwargs.copy() + final_kwargs.update(kwargs) + return on_command(cmd, **final_kwargs) + + def load_plugin(module_path: str) -> Optional[Plugin]: + """ + :说明: + 使用 ``importlib`` 加载单个插件,可以是本地插件或是通过 ``pip`` 安装的插件。 + :参数: + * ``module_path: str``: 插件名称 ``path.to.your.plugin`` + :返回: + - ``Optional[Plugin]`` + """ try: _tmp_matchers.clear() if module_path in plugins: @@ -203,6 +411,14 @@ def load_plugin(module_path: str) -> Optional[Plugin]: def load_plugins(*plugin_dir: str) -> Set[Plugin]: + """ + :说明: + 导入目录下多个插件,以 ``_`` 开头的插件不会被导入! + :参数: + - ``*plugin_dir: str``: 插件路径 + :返回: + - ``Set[Plugin]`` + """ loaded_plugins = set() for module_info in pkgutil.iter_modules(plugin_dir): _tmp_matchers.clear() @@ -210,7 +426,7 @@ def load_plugins(*plugin_dir: str) -> Set[Plugin]: if name.startswith("_"): continue - spec = module_info.module_finder.find_spec(name) + spec = module_info.module_finder.find_spec(name, None) if spec.name in plugins: continue elif spec.name in sys.modules: @@ -233,27 +449,21 @@ def load_plugins(*plugin_dir: str) -> Set[Plugin]: return loaded_plugins -def load_builtin_plugins(): +def load_builtin_plugins() -> Optional[Plugin]: + """ + :说明: + 导入 NoneBot 内置插件 + :返回: + - ``Plugin`` + """ return load_plugin("nonebot.plugins.base") def get_loaded_plugins() -> Set[Plugin]: + """ + :说明: + 获取当前已导入的插件。 + :返回: + - ``Set[Plugin]`` + """ return set(plugins.values()) - - -class CommandGroup: - - def __init__(self, cmd: Union[str, Tuple[str, ...]], **kwargs): - self.basecmd = (cmd,) if isinstance(cmd, str) else cmd - if "aliases" in kwargs: - del kwargs["aliases"] - self.base_kwargs = kwargs - - def command(self, cmd: Union[str, Tuple[str, ...]], - **kwargs) -> Union[Type[Matcher], MatcherGroup]: - sub_cmd = (cmd,) if isinstance(cmd, str) else cmd - cmd = self.basecmd + sub_cmd - - final_kwargs = self.base_kwargs.copy() - final_kwargs.update(kwargs) - return on_command(cmd, **final_kwargs) diff --git a/nonebot/rule.py b/nonebot/rule.py index b12d4ae1..b1927e59 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -238,6 +238,10 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: :参数: * ``regex: str``: 正则表达式 * ``flags: Union[int, re.RegexFlag]``: 正则标志 + + \:\:\:tip 提示 + 正则表达式匹配使用 search 而非 match,如需从头匹配请使用 ``r"^xxx"`` 来确保匹配开头 + \:\:\: """ pattern = re.compile(regex, flags) From 8ca677c27114c8ceb361968cfe77a663a4551a84 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 18 Oct 2020 15:34:14 +0800 Subject: [PATCH 21/64] :alien: fix home link --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index cc682d09..e59f17b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10297,7 +10297,7 @@ } }, "vuepress-theme-nonebot": { - "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#886b82a648d8d216254a5bab87add573d30f5d28", + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#0325cd2403c210125907c4f7adcd64fb8754acae", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { From 2c13303d89217eee0690435f55ebb9ac7f3b33a7 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Mon, 19 Oct 2020 00:00:11 +0800 Subject: [PATCH 22/64] :construction_worker: Update issue templates --- .github/ISSUE_TEMPLATE/bug-report.md | 33 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 16 +++++++++++ 2 files changed, 49 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 00000000..5d454e8f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a bug report to help us improve +title: 'Bug: Something went wrong' +labels: bug +assignees: '' + +--- + +**描述问题:** + +A clear and concise description of what the bug is. + +**如何复现?** + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**期望的结果** + +A clear and concise description of what you expected to happen. + +**环境信息:** + + - OS: [e.g. Linux] + - Python Version: [e.g. 3.8] + - Nonebot Version [e.g. 2.0.0] + +**截图** + +If applicable, add screenshots to help explain your problem. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..045a2e25 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,16 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: 'Feature: Something you want' +labels: enhancement +assignees: '' + +--- + +**是否在使用中遇到某些问题而需要新的特性?请描述:** + +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**描述你所需要的特性:** + +A clear and concise description of what you want to happen. From c3ed96283775c3109b2079ecf8e14c722feafec3 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 19 Oct 2020 15:49:18 +0800 Subject: [PATCH 23/64] :zap: add site cache to improve performance #29 --- docs/.vuepress/config.js | 33 +- .../public/icons/android-chrome-192x192.png | Bin 0 -> 8104 bytes .../public/icons/android-chrome-384x384.png | Bin 0 -> 19205 bytes .../public/icons/apple-touch-icon-180x180.png | Bin 0 -> 3071 bytes docs/.vuepress/public/icons/favicon-16x16.png | Bin 0 -> 626 bytes docs/.vuepress/public/icons/favicon-32x32.png | Bin 0 -> 1008 bytes docs/.vuepress/public/icons/favicon.ico | Bin 0 -> 15086 bytes .../.vuepress/public/icons/mstile-150x150.png | Bin 0 -> 3043 bytes .../public/icons/safari-pinned-tab.svg | 29 ++ docs/.vuepress/public/manifest.json | 20 ++ package-lock.json | 331 ++++++++++++++++++ package.json | 1 + 12 files changed, 413 insertions(+), 1 deletion(-) create mode 100644 docs/.vuepress/public/icons/android-chrome-192x192.png create mode 100644 docs/.vuepress/public/icons/android-chrome-384x384.png create mode 100644 docs/.vuepress/public/icons/apple-touch-icon-180x180.png create mode 100644 docs/.vuepress/public/icons/favicon-16x16.png create mode 100644 docs/.vuepress/public/icons/favicon-32x32.png create mode 100644 docs/.vuepress/public/icons/favicon.ico create mode 100644 docs/.vuepress/public/icons/mstile-150x150.png create mode 100644 docs/.vuepress/public/icons/safari-pinned-tab.svg create mode 100644 docs/.vuepress/public/manifest.json diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 2713db96..b3eb6c01 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -13,7 +13,8 @@ module.exports = context => ({ */ head: [ ["link", { rel: "icon", href: "/logo.png" }], - ["meta", { name: "theme-color", content: "#d32f2f" }], + ["link", { rel: "manifest", href: "/manifest.json" }], + ["meta", { name: "theme-color", content: "#ea5252" }], ["meta", { name: "application-name", content: "NoneBot" }], ["meta", { name: "apple-mobile-web-app-title", content: "NoneBot" }], ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }], @@ -21,6 +22,26 @@ module.exports = context => ({ "meta", { name: "apple-mobile-web-app-status-bar-style", content: "black" } ], + [ + "link", + { rel: "apple-touch-icon", href: "/icons/apple-touch-icon-180x180.png" } + ], + [ + "link", + { + rel: "mask-icon", + href: "/icons/safari-pinned-tab.svg", + color: "#ea5252" + } + ], + [ + "meta", + { + name: "msapplication-TileImage", + content: "/icons/mstile-150x150.png" + } + ], + ["meta", { name: "msapplication-TileColor", content: "#ea5252" }], [ "link", { @@ -155,6 +176,16 @@ module.exports = context => ({ plugins: [ "@vuepress/plugin-back-to-top", "@vuepress/plugin-medium-zoom", + [ + "@vuepress/pwa", + { + serviceWorker: true, + updatePopup: { + message: "发现新内容", + buttonText: "刷新" + } + } + ], [ "versioning", { diff --git a/docs/.vuepress/public/icons/android-chrome-192x192.png b/docs/.vuepress/public/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d3541259fa330231c224f0634bf26bd2bf4a2f GIT binary patch literal 8104 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
;Wi^h z=v{PL^7;8m`#xlk4PL1s})$CWs+-+pVHas>bm3P_%3;ytN5SFps&DBy4+KJm5mLXKQQ zN&MR5<5E2Mca{Z6Xpu71ZtwbV#PCy1 znYM?Gm*c?w>rq#pWncXDB{|hz!hFQp)fpFdKVHr=_(s2p1!MeP$SxIq2EA1~y@m{y zT*fB)t4orTHbxz8t=Yq z1!W3zo3iiKh|?rcPw>$x-5BSW$FL^9l_dP0Xk_X(B%3UuE7K5(rLs^(lp+=lOz_|bcL zbg3h5C@*ZXN-|N=z)GCIt^~LJXkla22j~K~4pJ&g`p6kAdEiW?a7N04!2+OyET?(%Q@D&zjl=KlQ>fC^v(B;YmfC&#HOc7<5#ts zWuj-Sj|=VPk=w=Zec0pQuU)Gn(;!}^iQcf@SpQqpj*GU2^Qc%#cTr+UAM&fe!aJ>R z)aGb7E5fP8gfGB4DzvuRE?WSQQ{TNSprpzrogNJ+km#U|0w~&*R2A%wqinuOms_z3 zUkvb;QOdjkK7=K94UvJczGP~*Q(#uLM^MQSBWB~6Cz-9avxXt!;?>ev*KYh+hL!^916q; z@IhcN~y9+B&2eId_3pSd{XoPo_Hf$-XCE<871R>QOp5WqpV9MNEj zu!>ySBW)xDjd~U!^wa;4BmY=MBUx%Bp_@E}bvk$gwj_AO%k7t9)>2a#o(@i`gns0; zVU7q4R8*qUfLnYLQ(jv(rhsEbtGrwg<(9lYs1p=;lV9c9<64vgrDWPw?bVzUmbTou zmBl{i7;dThHy&qjJnCxW_&Ho?R#T}WpD3jVR>(uGIilP49zq>?%hh>8^!@P;G2ELs z4SaPAm%8MCnJxzX8bi#it9}Y-@3qca0CO)S1Z{QLHM!ow4D$J^gRYx7)pmGjP!rOc9Rvo+fjt>ZzR?V>C_r z_@V8=n+BIjD0X5f*Mx+CIi?|A{39`Ee%Uo1TId)jgy|yD`1;|_(pKtNUb@{4Xe>wY z?1llXOeit|U-8D5Y~9nP>+By}t-mnHFU z<;_R!xFYXWDoo@6(a;9cFBxmU&pcw01m<;sTZU*M}{Ur6`AEv_bQ+F$@&G=5}+_xalEm_03m8McJ!e zA9$eZ+59NKItE|2ID@B1z{I3_ef^G#n?+TF_c}<8^$r7`H(qbmQL|~^P2eg!cTqC) z3)izOaM_tO7#^KZpYg0_0MQf|`SDADi9oH&J}A;n2;9zB(eBV;KzOZO`BVN0 zSJUUJh^hPS3~K9Q`v_jSF64dLb1rMB@@S0@;Oj1G$cua*OLC1#!@X$+$g>E$e(3&t z488n10iMhFD^!)S-Pcp!=4+q2*&x+jinU&NzL?HcRVR&fDFE#pqgx#lMn-)kt&{@lga;jOebO zkxlVR8&mn0T*O9Dtf;pj26v`llu7g z8ViAioRI0oAy>M(v1v;z(H|!W+xE;@(ZpVMcg$qb&HKLiZdeGT&ku;Wd=gdA0eX=sd;?PL5N-^eu z7Ld^S8E3a?QlD(n_HKNBIj0K!drMNK%m{OJj{yI@5DuCB?^ZbO0bVa|jq1Day`FC# z2nJ%J)C1pvC|C-t=_wCai;sdageLkTJs&0d>qdybci72HlM=1W*fSz02Nm#wmmsyZ zwHRW9NaC-Ep&wJ?U)uN@C@%<)YIzb_&Q`91uDZ~S;K&R>FhrmMs+8b|cq{#Laj|ho zko`-jyope&dY{-TvDvxne*H=(<(2ZlxJ14z%BQWbbS=8I)j{@18@uS1vGfwun;H8z z-#@Go10QD|Y<3rl8=LJRWpd?d-%r=uLh={V&Sb8~q!@=jY!FD^PzDc3Xl7vZJt(*J zj6%eY7_b5JkK?xb7j|7v^k`?W}M(M1(1 z4W7mF6wdFTTR?hY4k`Y$R^I4rgj9ZP`X&L2ze!!3{@Ah;hU3xRAzM*+)rbq_6kzRv zrh8;a-E73%x55i^9b3n+-ZaeUkL^91%v;r&T-6WtF|g#)UC_r)V=Tavo^jCvmxLqI z+3*vwl#)|s?bqg|-<0-(=Zg!aLhw>4a_Sv4SLM{~rW;jo&DH64dl;s7DJ`^fR39)98vs zgpeppBfD%N#9UjJ7Ic3-&;QN;#sBsH)p_+j-{&mPdCv1a=kxIsDsJASUn$|=NB+p9 z@2V)=>N3q-LnKN%?nWhad@7rW-F^hs|1ej1U9X6tt`>zEV=fVi^5VX>Uclrd9to=c z8B5U3qwjeDuxbcT+x}kig16&Gegyy=i#%Ywh>O*xECJwL&;a*@*c|NA^TL(~Yoz*3vQXXjRQ@57;?s{V0&QjChcWQ=Z&^wF>R9{g#K}8c_w;zvt3SAzl-rkyd z`7S14dMy2T6EoBi`wQxwaRT5WNLZOVkNdZBxFG^^v-%|HW5^SnD)PG#O^2q7I36B^ z*~)mY&n`auYzl0J!jmt|?ixz%vvASu`eJpKRmNVApZusK>}a*~MC4h@?(%CTpxgdB zfPXHd6Itr6|~u=ucPpKtYgFa`cNm?s(~f14I^6cwD*Z)N@fxV_L6(_pwO+{Ehd zY=ui-)J~~RkL2(gE$0}I?Pi5vG$rLV1Y0(J6@w4?o?T)GZJ7WGhPgG3Ir^{*M{!5SDe@s~$HSRINy@T&+wvBrEAW^)tf$>CAgafWEyP>W=YlSRifp zRkZ$~O?gd)w-iMkt!KTBlqt!(3PT!(Enh7(bmt7azQY6xy#%>3`wGZpP->g*80NNiqfQ1@gDvN}vhxisFK5CZHJGrN zC$TZ}8MsZ+sf2jV>yrHD$4z?x_fuUE5BdFyPR}k2^~RFiiRtbE3=~|ChRt#w z%RIAnrNP`S%f9DF9_%&ioD)Xk>Y<1vuDz7yU*?EQ2e{FMa3UFwEN~s?Rg9>lHGH1y zw(sMerteHiR7csr=50JQ2fPR&=gXW)>|!j5eAmX3lG8(px5!h0tP9!&dp`)VoAHR6 zbDR#~X+mQnPpCS(*2z>E)RmvpVV`Sx~g?JMESICOb>JWafs<)<{sV#+D~aG8{^E=(A~i4vyWG8bQxzTxXrA zeYB$bjft%visNpb83&K)(O}#fT!Gm|hqNzRQgK@I~ zT81eZVu6sv!_)H{Cs=r?^l^_Cl$!=$t3o=9Bz+);5^Kc8^0<*Ni<5(O4ly=jO7Es7 z8-z<~)Xg-TidL+a7$jS*g%Z-Ooq*2(&^rqyr^yQ3^7vLau-KNC?6?zBt^a6>&j&w~ z+#x__a#>w0L^#SA$*|)F8T>^DJ-gW_kd^_>S@gQ&DXmYb#`r$v1pQLx&BQf<3e?S| z>md5(wVBXvSgz?qD~rz@!THtJd4vtVK#2GQvQK-qawTu|G`jzy0)pnO&8xg)wH|?_ znBG1R0k#CN$+5&xJ9orJ;$Wu#H3z+$n$9YCq-%Y9bPKZL6oYHyEKkTQ5=TiCebW%$P&_+`EyRW_t+69&!JrGT}0M zk)qyd$9Hf*w;bz$X#4*T!!ko=u8&hj{^#dJuBIMbwZA3=P%dL5U0k}gHQg9 zDqp&=zdxMWdPhw!0p1}N7E;Q^pPcoATDXzqwM3Kj<4GnkyWh+SlhJG!c;ce2tmQ>* z-n(e8DKk07&IekE<lKO-GP9&kd7v6oqeMD9rR6I2@WX652RIcE)~EyZ zO@{|IPo6(FQn-UZ|Mkz+*;{XSr8DlP@6YCZ94yW)rJzaigw9dRik#l@zne%fQkb`m&rw z51hCTdLt)GKJx++$+7t=h}0p#%kEQ8r=jRSdZcv0PYLWmz1PqIjxZo`(xKaW z(fuj(04xA+0S)K~>IljRg)u^z5>3poCMMV;7KW%JSQH8hJRtv9z{OC1YGB0w4j>z< zmjeNwOrjUvjl$5RT?!4P1_x-;BWMAdR2tn61PU*lS(lXz^U%|K>(bd}|H%y`q9tSO zCj--hIc6)0z%+3&=vIFbttz5s=Wu_=tFBjSuOvESP8B;CgBDew^mQB493TbA-WHF0 IY(u{BFRU5!XaE2J literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/icons/apple-touch-icon-180x180.png b/docs/.vuepress/public/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..38b5ff252be8fa86cdf0b2b115a78b4cc453bc7a GIT binary patch literal 3071 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/icons/favicon-32x32.png b/docs/.vuepress/public/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e967a40d1e9e6471037040af05b07ee01870ab GIT binary patch literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10;%9(Qh%1o(Kj7fszyE*# z{`>y@_x<}nPM-X}fB*MAdw!fa@%!Grf8W0S`|;!F#f#r|?D%o~_}_Q${(brK_x=0d z4<7tHfBw(Qmp{*)`}g(h&kGm+Jb(WC(W7tMw*7hW;?JvB-?nf6`|;!Vef$3Z`Sbhk z-M_D2|NZpo&(o)Wo;~~h@ZrysC;$8u*bel(c1e(5FarZu)ZP#OJ|0Ts6`A(s+k8pR zg?!PUzh~|_{r<8Yu)?* z21PAPGpLIUFdp>OYrcLwQ}En5 z*M%2z%#M6@<RA5fDJIG?^sa>9hC z8~*I$cTak6SUTxILWcVB`4<9MtWsLSlN>}CIreN}T_?@V_3?7U{u__v1FDV0tF_oo zLfKYGu`k-k^J2S%!Bt(!gqOa2KV~z^+`J?vIR9WlN<(r%!m^VLxyKkM&v^MOC??`9 zYvzL2N5jtVm0N$!euXB3#gfS>e<#-^3LfB-RsWx_Z(R4(N$7*;RK34xmMJ@52_4?3 zd;i~0Rk?KS0^#?oxAb~kS58)w`6c%5-O+o!FHJrctTL@Q@tF5x1baw@)_U#mdGXKI zON)B156%3!Hq8A6|BOBBJBq9}F9Qa=YKdz^NlIc#s#S7PDv)9@GB7gGHL%b%Fby#@ zvobWaGP2M%FtRc**v`0iDT;>N{FKbJO57Tb#fVA*HH24%M3e+2mMat#<)>xlq$-qD z7Nja<7L+72FjUNW{E3I7Fib<^l>g~7o=<}qn3cKplDUPIg}o<>FbgZVG?*MtVOHK8 sqHy}gl@mwK9FaM~e!9V9ftMb`D{;Y+Pfn&&fmSehy85}Sb4q9e05H%H%K!iX literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/icons/favicon.ico b/docs/.vuepress/public/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7fdcadefe1a6c712e45fe80169bc8f59c6373fe GIT binary patch literal 15086 zcmeI3$!{D*6vjJ*MM!}x2q}sLvJgaEKoJ6tzzO~bxB#bc;|v!c5L^%(kjUaBjv}1h ziIhm$oW+oRb2cT)YCHQLJDC~J;u#m;uj~%($;|XRGq%K&KKFEYRlV0$@4b5Us_ZyZ zoT<*dd5*3v&gyp@=VQllT3W{LXE;u;p3Tse_w%23oS#+TU6oN4=WBuImfjw{)cR|T zc|rI@SR(WbC81d~BE~m_zl6_)mwaTOqcXn<_k@W?0}^Pl@K&X7(DS*%E@7h65efK# z_ZxISTj-kTf_vmUtlxGVbbU_v#q(~m{6v>t6h0ELk;z66CGZ!*uSp0#B2O_mIAShd z95x3IfMZ{zupEyx43l^lznKK20&c`L%ICrjK7A{O#or>FDt@^IM z+_@9I&#Se6|9;6VU79xg_DM18Ks`NqYoCuEB`>=xF8+&ez_yd5YuAcaXX?@K<#OJ; zSF*a4ls({Q+S}7s-^+Q`>;CN7g2AS<+4vmL$Ii~7L~J#TG#fSyS>GC_PI=jMdc^wZ zM(9mBZ+J34#F^u;Bl@9P1n;P}j9>2P$e0TkhMOh6<&6wc<{9EF;+Y^ZLA^c@-pDX8 z5PqU0R$Q|tQ!mj1w~Gu>bbxrbt1AHq7Fg2C1&L*e$HNjaJ8^Hb>CmCP*}gq|KeF~9 zes4ArFK*r(-Um*0`OzQNP|YS{-YEKm&0sstCS=D3!V>Fn*0Rke*43;x!_wo&qjLu_ zP_qc$%wNb7h4^;XcFiJq$I$_N*SdAh(;;~G^hEDJavkJHZro^0ZooUvH*Xd#Z)Au= z_)uby1aoG-;t+4r_xR4ZRM7CPSdor3j$vgueY#-tOZoWXTh_O3jjrDtp+~H{$S;v2 zOOnV}En1W^8ToW-Z=T z-i1~O>;ap`FJTi=)~CoqpOd>LzZ65?+1CqA_$Agi%p8dSY#QefKhk2fFA?9#nM(hv}KN8EjWmc}t*gcN~asz!5{3jvaBu4{kfjEm; z5gSBa)=hx#p`VFq$=q-OS3GVMo#!uM?*7Zjr_82tyn>i;ibxi(Q z`rX-J{&CptQsp^id+=}Q*#;rBKaC?ugt}d-GuJD-`&-W$haZGKVWR2NP07SLf!VIS zm9Bcvd4l%@{L)c@`Jox#0?#MHNr64~4+X35Ub&0h$chKKPIsJst~zDY%~hpaxlZ}- z%I*JDy$4!(rT*&nUe%BN+^b)6T-DERzjIEjMfgm3dQMAcxvG)I@Ks^Ha9pTIpi8pk zl<>VU(<_JWXA3KY=n;o12PD32o$w|y=sHbk7aC2-FjM$e2%kt*CF1NDu{Ntn#^P@w z5OJQOw|Cg)Klkj(*|Q^@AKAS-XJfG|SB6caJUL(Z2WgYNUDoN;VLcIt_|C0cvys-e4<3|k-M+qPGH`wc z-cO!HpJLc!rH!!tKtI!e?D@wf@&dFKWb9mCtSyqxxI5I9eS{UC2hJ90&@cy;?T zNSoMjJ@z+fleYbcH66B`G+|3Y_8ahJQTBEHJU(N{?mIXu7qho?KgB+VZ`9K^0DSC3pBZ3dYOm}~JrN$Q~M)0i8BP#Aw1 zq`k2IoIW6qVD67g%whB=ZH6JvfNt56wXsc@dfu|k-ORsH&!Td^4;hdpEHUrGJHUCp zngIs9-Iy-O{KZ_y+)bYc{BGYoD`SUFA_sE_--JKGMgabbISc!y4Eh#O*NMS*1?^kp zfH!=+@i)JDMri!F{NGC4< literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/icons/mstile-150x150.png b/docs/.vuepress/public/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..62563e36c0d3a30f08df36848a0bde517245aff9 GIT binary patch literal 3043 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 + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/docs/.vuepress/public/manifest.json b/docs/.vuepress/public/manifest.json new file mode 100644 index 00000000..dcb62739 --- /dev/null +++ b/docs/.vuepress/public/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "NoneBot", + "short_name": "NoneBot", + "background-color": "#ffffff", + "theme-color": "#ea5252", + "description": "An asynchronous python bot framework.", + "display": "standalone", + "icons": [ + { + "src": "/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icons/android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ] +} diff --git a/package-lock.json b/package-lock.json index e59f17b2..8d3f579f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1050,6 +1050,45 @@ "to-fast-properties": "^2.0.0" } }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1454,6 +1493,17 @@ "nprogress": "^0.2.0" } }, + "@vuepress/plugin-pwa": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-pwa/-/plugin-pwa-1.7.1.tgz", + "integrity": "sha512-c3oozxPPGpraU+UnY3gp3sWnKYO3mOLcexQWXaYABWnUC3yFbHx4e8wIF8LGqp7Z75bjQuUoI+LcHqpQXyYNag==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.7.1", + "register-service-worker": "^1.7.0", + "workbox-build": "^4.3.1" + } + }, "@vuepress/plugin-register-components": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.7.1.tgz", @@ -2076,6 +2126,15 @@ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dev": true, + "requires": { + "babylon": "^6.18.0" + } + }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -2098,6 +2157,52 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -3011,6 +3116,12 @@ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4817,6 +4928,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5736,6 +5853,12 @@ "has-symbols": "^1.0.1" } }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -7765,6 +7888,12 @@ "dev": true, "optional": true }, + "pretty-bytes": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==", + "dev": true + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -8124,6 +8253,12 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "register-service-worker": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.1.tgz", + "integrity": "sha512-IdTfUZ4u8iJL8o1w8es8l6UMGPmkwHolUdT+UmM1UypC80IB4KbpuIlvwWVj8UDS7eJwkEYRcKRgfRX+oTmJsw==", + "dev": true + }, "registry-auth-token": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", @@ -9209,6 +9344,25 @@ "safe-buffer": "~5.1.0" } }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -9224,6 +9378,16 @@ "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", "dev": true }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -10757,6 +10921,173 @@ } } }, + "workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==", + "dev": true + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "dev": true, + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==", + "dev": true + }, + "workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "dev": true, + "requires": { + "workbox-core": "^4.3.1" + } + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index 5612d90b..0d01b7b2 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "devDependencies": { "@vuepress/plugin-back-to-top": "^1.7.1", "@vuepress/plugin-medium-zoom": "^1.7.1", + "@vuepress/plugin-pwa": "^1.7.1", "vuepress": "^1.7.1", "vuepress-plugin-versioning": "git+https://github.com/nonebot/vuepress-plugin-versioning.git", "vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git" From 308824d0b1ab7b2de1aa62dc6442babe75c83583 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 20 Oct 2020 00:01:26 +0800 Subject: [PATCH 24/64] :bug: fix matcher group args parser --- nonebot/matcher.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index f0fe78f9..11bf08d7 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -496,6 +496,7 @@ class MatcherGroup: return matcher def args_parser(self, func: ArgsParser) -> ArgsParser: + self._default_parser = func for matcher in self.matchers: matcher.args_parser(func) return func From 444156766a4e95ccfcf2e90b74310c712cf38400 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Tue, 20 Oct 2020 17:27:41 +0800 Subject: [PATCH 25/64] :construction_worker: Update release drafter --- .github/workflows/release-draft.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/release-draft.yml diff --git a/.github/workflows/release-draft.yml b/.github/workflows/release-draft.yml new file mode 100644 index 00000000..17fdb961 --- /dev/null +++ b/.github/workflows/release-draft.yml @@ -0,0 +1,14 @@ +name: Release Drafter + +on: + push: + branches: + - master + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c85e50d73d09f537e158b543db4d889c3d2e17b7 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Tue, 20 Oct 2020 17:28:51 +0800 Subject: [PATCH 26/64] :construction_worker: Add release draft config --- .github/release-drafter.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/release-drafter.yml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..fcca4ea8 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,31 @@ +name-template: 'v$RESOLVED_VERSION 🌈' +tag-template: 'v$RESOLVED_VERSION' +categories: + - title: '🚀 Features' + labels: + - 'feature' + - 'enhancement' + - title: '🐛 Bug Fixes' + labels: + - 'fix' + - 'bugfix' + - 'bug' + - title: '🧰 Maintenance' + label: 'chore' +change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - 'major' + minor: + labels: + - 'minor' + patch: + labels: + - 'patch' + default: patch +template: | + ## Changes + + $CHANGES From 24141b1a4b2de0be4b6b5fb5aefc4bbe86c34ec4 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Tue, 20 Oct 2020 22:24:36 +0800 Subject: [PATCH 27/64] :art: remove shebang line #31 --- nonebot/__init__.py | 2 -- nonebot/adapters/__init__.py | 2 -- nonebot/adapters/cqhttp.py | 2 -- nonebot/config.py | 2 -- nonebot/drivers/__init__.py | 2 -- nonebot/drivers/fastapi.py | 2 -- nonebot/exception.py | 2 -- nonebot/log.py | 2 -- nonebot/matcher.py | 2 -- nonebot/message.py | 3 --- nonebot/permission.py | 2 -- nonebot/plugin.py | 2 -- nonebot/plugin.pyi | 3 --- nonebot/rule.py | 2 -- nonebot/sched.py | 2 -- nonebot/typing.py | 2 -- nonebot/utils.py | 3 --- tests/bot.py | 3 --- tests/test_plugins/test_metaevent.py | 3 --- tests/test_plugins/test_package/__init__.py | 3 --- tests/test_plugins/test_package/test_command.py | 3 --- tests/test_plugins/test_permission.py | 3 --- 22 files changed, 52 deletions(-) diff --git a/nonebot/__init__.py b/nonebot/__init__.py index cbf14115..9e25268f 100644 --- a/nonebot/__init__.py +++ b/nonebot/__init__.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 快捷导入 ======== diff --git a/nonebot/adapters/__init__.py b/nonebot/adapters/__init__.py index ba9b712b..b7abd955 100644 --- a/nonebot/adapters/__init__.py +++ b/nonebot/adapters/__init__.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 协议适配基类 ============ diff --git a/nonebot/adapters/cqhttp.py b/nonebot/adapters/cqhttp.py index 33aee948..0f214e36 100644 --- a/nonebot/adapters/cqhttp.py +++ b/nonebot/adapters/cqhttp.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ CQHTTP (OneBot) v11 协议适配 ============================ diff --git a/nonebot/config.py b/nonebot/config.py index 70b8e3cb..252b39ad 100644 --- a/nonebot/config.py +++ b/nonebot/config.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 配置 ==== diff --git a/nonebot/drivers/__init__.py b/nonebot/drivers/__init__.py index 5100e130..09c182fe 100644 --- a/nonebot/drivers/__init__.py +++ b/nonebot/drivers/__init__.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 后端驱动适配基类 =============== diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index e15beb26..b8c9ccbe 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ FastAPI 驱动适配 ================ diff --git a/nonebot/exception.py b/nonebot/exception.py index e129bd01..45062635 100644 --- a/nonebot/exception.py +++ b/nonebot/exception.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 异常 ==== diff --git a/nonebot/log.py b/nonebot/log.py index f088fc98..854b4b78 100644 --- a/nonebot/log.py +++ b/nonebot/log.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 日志 ==== diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 11bf08d7..157e4cf8 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 事件响应器 ========== diff --git a/nonebot/message.py b/nonebot/message.py index 9374d46a..4d64c25d 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - import asyncio from datetime import datetime diff --git a/nonebot/permission.py b/nonebot/permission.py index e194f453..df6c099b 100644 --- a/nonebot/permission.py +++ b/nonebot/permission.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 权限 ==== diff --git a/nonebot/plugin.py b/nonebot/plugin.py index c247b91a..12a27799 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 插件 ==== diff --git a/nonebot/plugin.pyi b/nonebot/plugin.pyi index ccb8aed4..5bd5b771 100644 --- a/nonebot/plugin.pyi +++ b/nonebot/plugin.pyi @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - import re from typing import overload diff --git a/nonebot/rule.py b/nonebot/rule.py index b1927e59..69b3cd15 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 规则 ==== diff --git a/nonebot/sched.py b/nonebot/sched.py index 58447b67..e47d95b7 100644 --- a/nonebot/sched.py +++ b/nonebot/sched.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 计划任务 ======== diff --git a/nonebot/typing.py b/nonebot/typing.py index 5b722655..ec9a666b 100644 --- a/nonebot/typing.py +++ b/nonebot/typing.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 类型 ==== diff --git a/nonebot/utils.py b/nonebot/utils.py index 9efeb8ca..db447401 100644 --- a/nonebot/utils.py +++ b/nonebot/utils.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - import re import json import asyncio diff --git a/tests/bot.py b/tests/bot.py index e66875e9..7a294564 100644 --- a/tests/bot.py +++ b/tests/bot.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - import os import sys diff --git a/tests/test_plugins/test_metaevent.py b/tests/test_plugins/test_metaevent.py index f683716a..439513b1 100644 --- a/tests/test_plugins/test_metaevent.py +++ b/tests/test_plugins/test_metaevent.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - from nonebot.typing import Bot, Event from nonebot.plugin import on_metaevent diff --git a/tests/test_plugins/test_package/__init__.py b/tests/test_plugins/test_package/__init__.py index 60c5cee2..139447bf 100644 --- a/tests/test_plugins/test_package/__init__.py +++ b/tests/test_plugins/test_package/__init__.py @@ -1,4 +1 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - from . import test_command diff --git a/tests/test_plugins/test_package/test_command.py b/tests/test_plugins/test_package/test_command.py index af060fff..fd85b1d9 100644 --- a/tests/test_plugins/test_package/test_command.py +++ b/tests/test_plugins/test_package/test_command.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - from nonebot.rule import to_me from nonebot.typing import Event from nonebot.plugin import on_command diff --git a/tests/test_plugins/test_permission.py b/tests/test_plugins/test_permission.py index a7f577a7..ed03b80f 100644 --- a/tests/test_plugins/test_permission.py +++ b/tests/test_plugins/test_permission.py @@ -1,6 +1,3 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - from nonebot.rule import to_me from nonebot.typing import Event from nonebot.plugin import on_startswith From c2c28cebf556abcee33d766e41b27ab62bea4733 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 21 Oct 2020 00:54:09 +0800 Subject: [PATCH 28/64] :alien: update nonebot theme --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8d3f579f..efb2f7bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10461,7 +10461,7 @@ } }, "vuepress-theme-nonebot": { - "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#0325cd2403c210125907c4f7adcd64fb8754acae", + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#16c96d1cd12cbb72d0233875b0a671cada93ca2a", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { From 4e2b74af7576b766ff91487d4ff5272d6f101007 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 21 Oct 2020 00:55:23 +0800 Subject: [PATCH 29/64] :construction: add plugin store page --- docs/.vuepress/components/Plugins.vue | 28 +++++++++++++++++++++++++++ docs/.vuepress/config.js | 3 ++- docs/.vuepress/public/plugins.json | 8 ++++++++ pages/plugin-store.md | 6 ++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 docs/.vuepress/components/Plugins.vue create mode 100644 docs/.vuepress/public/plugins.json create mode 100644 pages/plugin-store.md diff --git a/docs/.vuepress/components/Plugins.vue b/docs/.vuepress/components/Plugins.vue new file mode 100644 index 00000000..ca97311a --- /dev/null +++ b/docs/.vuepress/components/Plugins.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index b3eb6c01..f2656b4d 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -79,7 +79,8 @@ module.exports = context => ({ nav: [ { text: "主页", link: "/" }, { text: "指南", link: "/guide/" }, - { text: "API", link: "/api/" } + { text: "API", link: "/api/" }, + { text: "插件广场", link: "/plugin-store" } ], sidebarDepth: 2, sidebar: { diff --git a/docs/.vuepress/public/plugins.json b/docs/.vuepress/public/plugins.json new file mode 100644 index 00000000..c30a4f1d --- /dev/null +++ b/docs/.vuepress/public/plugins.json @@ -0,0 +1,8 @@ +[ + { + "name": "nonebot-plugin-status", + "desc": "通过戳一戳获取服务器状态", + "author": "nonebot", + "repo": "nonebot/nonebot2" + } +] diff --git a/pages/plugin-store.md b/pages/plugin-store.md new file mode 100644 index 00000000..28b142e2 --- /dev/null +++ b/pages/plugin-store.md @@ -0,0 +1,6 @@ +--- +--- + +# 插件广场 + + From d9f8bf38c61e2920c9efd8c849ac1808b6ffcede Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 22 Oct 2020 00:00:29 +0800 Subject: [PATCH 30/64] :bug: fix matcher group send --- nonebot/matcher.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 157e4cf8..f4f67245 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -570,37 +570,38 @@ class MatcherGroup: return _decorator - async def send(self, message: Union[str, Message, MessageSegment]): + async def send(self, message: Union[str, Message, MessageSegment], + **kwargs): bot = current_bot.get() event = current_event.get() - await bot.send(event=event, message=message) + await bot.send(event=event, message=message, **kwargs) - async def finish( - self, - message: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def finish(self, + message: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: bot = current_bot.get() event = current_event.get() if message: - await bot.send(event=event, message=message) + await bot.send(event=event, message=message, **kwargs) raise FinishedException - async def pause( - self, - prompt: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def pause(self, + prompt: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: bot = current_bot.get() event = current_event.get() if prompt: - await bot.send(event=event, message=prompt) + await bot.send(event=event, message=prompt, **kwargs) raise PausedException - async def reject( - self, - prompt: Optional[Union[str, Message, - MessageSegment]] = None) -> NoReturn: + async def reject(self, + prompt: Optional[Union[str, Message, + MessageSegment]] = None, + **kwargs) -> NoReturn: bot = current_bot.get() event = current_event.get() if prompt: - await bot.send(event=event, message=prompt) + await bot.send(event=event, message=prompt, **kwargs) raise RejectedException From 32388d070d2c5c92aa2249f66eb939d6bcfc84f4 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 22 Oct 2020 22:08:19 +0800 Subject: [PATCH 31/64] :art: improve command implementation --- docs/api/plugin.md | 6 ------ docs/api/rule.md | 4 ++-- nonebot/plugin.py | 27 +++++++-------------------- nonebot/plugin.pyi | 43 +++++++++++++------------------------------ nonebot/rule.py | 23 ++++++++++++++--------- 5 files changed, 36 insertions(+), 67 deletions(-) diff --git a/docs/api/plugin.md b/docs/api/plugin.md index 6ec390e3..7aeeabc9 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -394,9 +394,6 @@ sidebarDepth: 0 * `Type[Matcher]` - * `MatcherGroup` - - ## `on_regex(pattern, flags=0, rule=None, **kwargs)` @@ -510,9 +507,6 @@ sidebarDepth: 0 * `Type[Matcher]` - * `MatcherGroup` - - ## `load_plugin(module_path)` diff --git a/docs/api/rule.md b/docs/api/rule.md index d3eac6ad..32d1ae2a 100644 --- a/docs/api/rule.md +++ b/docs/api/rule.md @@ -139,7 +139,7 @@ Rule(async_function, run_sync(sync_function)) -## `command(command)` +## `command(*cmds)` * **说明** @@ -151,7 +151,7 @@ Rule(async_function, run_sync(sync_function)) * **参数** - * `command: Tuples[str, ...]`: 命令内容 + * `*cmds: Union[str, Tuple[str, ...]]`: 命令内容 diff --git a/nonebot/plugin.py b/nonebot/plugin.py index 12a27799..b0196bd2 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -13,9 +13,9 @@ from dataclasses import dataclass from importlib._bootstrap import _load from nonebot.log import logger +from nonebot.matcher import Matcher from nonebot.permission import Permission from nonebot.typing import Handler, RuleChecker -from nonebot.matcher import Matcher, MatcherGroup from nonebot.rule import Rule, startswith, endswith, command, regex from nonebot.typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, ModuleType @@ -261,7 +261,7 @@ def on_endswith(msg: str, def on_command(cmd: Union[str, Tuple[str, ...]], rule: Optional[Union[Rule, RuleChecker]] = None, aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None, - **kwargs) -> Union[Type[Matcher], MatcherGroup]: + **kwargs) -> Type[Matcher]: """ :说明: 注册一个消息事件响应器,并且当消息以指定命令开头时响应。 @@ -279,10 +279,7 @@ def on_command(cmd: Union[str, Tuple[str, ...]], * ``state: Optional[dict]``: 默认的 state :返回: - ``Type[Matcher]`` - - ``MatcherGroup`` """ - if isinstance(cmd, str): - cmd = (cmd,) async def _strip_cmd(bot, event, state: dict): message = event.message @@ -292,19 +289,10 @@ def on_command(cmd: Union[str, Tuple[str, ...]], handlers = kwargs.pop("handlers", []) handlers.insert(0, _strip_cmd) - if aliases: - aliases = set(map(lambda x: (x,) if isinstance(x, str) else x, aliases)) - group = MatcherGroup("message", - Rule() & rule, - handlers=handlers, - **kwargs) - for cmd_ in [cmd, *aliases]: - _tmp_matchers.add(group.new(rule=command(cmd_))) - return group - else: - return on_message(command(cmd) & rule, handlers=handlers, ** - kwargs) if rule else on_message( - command(cmd), handlers=handlers, **kwargs) + commands = set([cmd]) | (aliases or set()) + return on_message(command(*commands) & rule, handlers=handlers, ** + kwargs) if rule else on_message( + command(*commands), handlers=handlers, **kwargs) def on_regex(pattern: str, @@ -357,7 +345,7 @@ class CommandGroup: """ def command(self, cmd: Union[str, Tuple[str, ...]], - **kwargs) -> Union[Type[Matcher], MatcherGroup]: + **kwargs) -> Type[Matcher]: """ :说明: 注册一个新的命令。 @@ -366,7 +354,6 @@ class CommandGroup: * ``**kwargs``: 其他传递给 ``on_command`` 的参数,将会覆盖命令组默认值 :返回: - ``Type[Matcher]`` - - ``MatcherGroup`` """ sub_cmd = (cmd,) if isinstance(cmd, str) else cmd cmd = self.basecmd + sub_cmd diff --git a/nonebot/plugin.pyi b/nonebot/plugin.pyi index 5bd5b771..dbd96365 100644 --- a/nonebot/plugin.pyi +++ b/nonebot/plugin.pyi @@ -1,7 +1,6 @@ import re -from typing import overload -from nonebot.typing import Rule, Matcher, Handler, Permission, RuleChecker, MatcherGroup +from nonebot.typing import Rule, Matcher, Handler, Permission, RuleChecker from nonebot.typing import Set, List, Dict, Type, Tuple, Union, Optional, ModuleType plugins: Dict[str, "Plugin"] = ... @@ -92,10 +91,9 @@ def on_endswith(msg: str, ... -@overload def on_command(cmd: Union[str, Tuple[str, ...]], rule: Optional[Union[Rule, RuleChecker]] = ..., - aliases: None = ..., + aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., permission: Optional[Permission] = ..., *, handlers: Optional[List[Handler]] = ..., @@ -106,20 +104,6 @@ def on_command(cmd: Union[str, Tuple[str, ...]], ... -@overload -def on_command(cmd: Union[str, Tuple[str, ...]], - rule: Optional[Union[Rule, RuleChecker]] = ..., - aliases: Set[Union[str, Tuple[str, ...]]] = ..., - permission: Optional[Permission] = ..., - *, - handlers: Optional[List[Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[dict] = ...) -> MatcherGroup: - ... - - def on_regex(pattern: str, flags: Union[int, re.RegexFlag] = 0, rule: Optional[Rule] = ..., @@ -163,16 +147,15 @@ class CommandGroup: state: Optional[dict] = ...): ... - def command( - self, - cmd: Union[str, Tuple[str, ...]], - rule: Optional[Union[Rule, RuleChecker]] = ..., - aliases: Set[Union[str, Tuple[str, ...]]] = ..., - permission: Optional[Permission] = ..., - *, - handlers: Optional[List[Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[dict] = ...) -> Union[Type[Matcher], MatcherGroup]: + def command(self, + cmd: Union[str, Tuple[str, ...]], + rule: Optional[Union[Rule, RuleChecker]] = ..., + aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., + permission: Optional[Permission] = ..., + *, + handlers: Optional[List[Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[dict] = ...) -> Type[Matcher]: ... diff --git a/nonebot/rule.py b/nonebot/rule.py index 69b3cd15..f0da99a9 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -196,12 +196,12 @@ def keyword(msg: str) -> Rule: return Rule(_keyword) -def command(command: Tuple[str, ...]) -> Rule: +def command(*cmds: Union[str, Tuple[str, ...]]) -> Rule: """ :说明: 命令形式匹配,根据配置里提供的 ``command_start``, ``command_sep`` 判断消息是否为命令。 :参数: - * ``command: Tuples[str, ...]``: 命令内容 + * ``*cmds: Union[str, Tuple[str, ...]]``: 命令内容 :示例: 使用默认 ``command_start``, ``command_sep`` 配置 @@ -216,15 +216,20 @@ def command(command: Tuple[str, ...]) -> Rule: config = get_driver().config command_start = config.command_start command_sep = config.command_sep - if len(command) == 1: - for start in command_start: - TrieRule.add_prefix(f"{start}{command[0]}", command) - else: - for start, sep in product(command_start, command_sep): - TrieRule.add_prefix(f"{start}{sep.join(command)}", command) + commands = list(cmds) + for index, command in enumerate(commands): + if isinstance(command, str): + commands[index] = command = (command,) + + if len(command) == 1: + for start in command_start: + TrieRule.add_prefix(f"{start}{command[0]}", command) + else: + for start, sep in product(command_start, command_sep): + TrieRule.add_prefix(f"{start}{sep.join(command)}", command) async def _command(bot: Bot, event: Event, state: dict) -> bool: - return command == state["_prefix"]["command"] + return state["_prefix"]["command"] in commands return Rule(_command) From 5d08d53c27e17ffc5ff533644e6ba4bac99a1c75 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 25 Oct 2020 14:42:46 +0800 Subject: [PATCH 32/64] :alien: update auth header --- nonebot/drivers/fastapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py index b8c9ccbe..bb0009b4 100644 --- a/nonebot/drivers/fastapi.py +++ b/nonebot/drivers/fastapi.py @@ -30,7 +30,7 @@ def get_auth_bearer(access_token: Optional[str] = Header( if not access_token: return None scheme, _, param = access_token.partition(" ") - if scheme.lower() != "bearer": + if scheme.lower() not in ["bearer", "token"]: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated", headers={"WWW-Authenticate": "Bearer"}) From 59a8bd8c975bec485e1c4f4c81d07e2f0c6be561 Mon Sep 17 00:00:00 2001 From: rkroom <53672435+rkroom@users.noreply.github.com> Date: Mon, 26 Oct 2020 17:18:26 +0800 Subject: [PATCH 33/64] add matched_string when rule regex MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当使用正则匹配消息成功时,向state添加matched_string以保存匹配到的内容供接下来使用。 --- nonebot/rule.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/nonebot/rule.py b/nonebot/rule.py index b1927e59..fed21d70 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -247,8 +247,12 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: pattern = re.compile(regex, flags) async def _regex(bot: Bot, event: Event, state: dict) -> bool: - return bool(pattern.search(str(event.message))) - + matched_string = pattern.search(str(event.message)) + if matched_string: + state["matched_string"] = matched_string.group() + return True + else: + return False return Rule(_regex) From 38469611a4a8fc75cc3f5df6f1b499aaf7dd628f Mon Sep 17 00:00:00 2001 From: ayayaneru <870672449@gmail.com> Date: Wed, 28 Oct 2020 10:01:33 +0800 Subject: [PATCH 34/64] Update README --- docs/api/README.md | 26 +++++++++++++------------- docs_build/README.rst | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/api/README.md b/docs/api/README.md index dcfb548c..710d44bd 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -4,46 +4,46 @@ * **模块索引** - * [nonebot](nonebot.html) + * [nonebot](nonebot.md) - * [nonebot.config](config.html) + * [nonebot.config](config.md) - * [nonebot.plugin](plugin.html) + * [nonebot.plugin](plugin.md) - * [nonebot.matcher](matcher.html) + * [nonebot.matcher](matcher.md) - * [nonebot.rule](rule.html) + * [nonebot.rule](rule.md) - * [nonebot.permission](permission.html) + * [nonebot.permission](permission.md) - * [nonebot.sched](sched.html) + * [nonebot.sched](sched.md) - * [nonebot.log](log.html) + * [nonebot.log](log.md) - * [nonebot.utils](utils.html) + * [nonebot.utils](utils.md) - * [nonebot.typing](typing.html) + * [nonebot.typing](typing.md) - * [nonebot.exception](exception.html) + * [nonebot.exception](exception.md) * [nonebot.drivers](drivers/) - * [nonebot.drivers.fastapi](drivers/fastapi.html) + * [nonebot.drivers.fastapi](drivers/fastapi.md) * [nonebot.adapters](adapters/) - * [nonebot.adapters.cqhttp](adapters/cqhttp.html) + * [nonebot.adapters.cqhttp](adapters/cqhttp.md) diff --git a/docs_build/README.rst b/docs_build/README.rst index 02d097be..716c153c 100644 --- a/docs_build/README.rst +++ b/docs_build/README.rst @@ -2,18 +2,18 @@ NoneBot Api Reference ===================== :模块索引: - - `nonebot `_ - - `nonebot.config `_ - - `nonebot.plugin `_ - - `nonebot.matcher `_ - - `nonebot.rule `_ - - `nonebot.permission `_ - - `nonebot.sched `_ - - `nonebot.log `_ - - `nonebot.utils `_ - - `nonebot.typing `_ - - `nonebot.exception `_ + - `nonebot `_ + - `nonebot.config `_ + - `nonebot.plugin `_ + - `nonebot.matcher `_ + - `nonebot.rule `_ + - `nonebot.permission `_ + - `nonebot.sched `_ + - `nonebot.log `_ + - `nonebot.utils `_ + - `nonebot.typing `_ + - `nonebot.exception `_ - `nonebot.drivers `_ - - `nonebot.drivers.fastapi `_ + - `nonebot.drivers.fastapi `_ - `nonebot.adapters `_ - - `nonebot.adapters.cqhttp `_ + - `nonebot.adapters.cqhttp `_ From c636186321a139cbffab2b33852aafa6b8329053 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 28 Oct 2020 13:05:51 +0800 Subject: [PATCH 35/64] :construction_worker: update api doc action --- .github/workflows/api_docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/api_docs.yml b/.github/workflows/api_docs.yml index ac01aa18..efbde69f 100644 --- a/.github/workflows/api_docs.yml +++ b/.github/workflows/api_docs.yml @@ -12,6 +12,7 @@ jobs: - uses: actions/checkout@v2 with: ref: ${{ github.event.pull_request.head.sha }} + token: ${{ secrets.GH_TOKEN }} - name: Set up Python uses: actions/setup-python@v2 From dc5c35a9edbe9c52ff7f6ef7683294dc41c49549 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 28 Oct 2020 13:17:41 +0800 Subject: [PATCH 36/64] :bulb: update command docstrinrg --- docs/api/README.md | 26 +++++++++++++------------- docs/api/rule.md | 2 ++ docs_build/README.rst | 26 +++++++++++++------------- nonebot/rule.py | 2 ++ 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/docs/api/README.md b/docs/api/README.md index 710d44bd..dcfb548c 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -4,46 +4,46 @@ * **模块索引** - * [nonebot](nonebot.md) + * [nonebot](nonebot.html) - * [nonebot.config](config.md) + * [nonebot.config](config.html) - * [nonebot.plugin](plugin.md) + * [nonebot.plugin](plugin.html) - * [nonebot.matcher](matcher.md) + * [nonebot.matcher](matcher.html) - * [nonebot.rule](rule.md) + * [nonebot.rule](rule.html) - * [nonebot.permission](permission.md) + * [nonebot.permission](permission.html) - * [nonebot.sched](sched.md) + * [nonebot.sched](sched.html) - * [nonebot.log](log.md) + * [nonebot.log](log.html) - * [nonebot.utils](utils.md) + * [nonebot.utils](utils.html) - * [nonebot.typing](typing.md) + * [nonebot.typing](typing.html) - * [nonebot.exception](exception.md) + * [nonebot.exception](exception.html) * [nonebot.drivers](drivers/) - * [nonebot.drivers.fastapi](drivers/fastapi.md) + * [nonebot.drivers.fastapi](drivers/fastapi.html) * [nonebot.adapters](adapters/) - * [nonebot.adapters.cqhttp](adapters/cqhttp.md) + * [nonebot.adapters.cqhttp](adapters/cqhttp.html) diff --git a/docs/api/rule.md b/docs/api/rule.md index 32d1ae2a..9142ce2e 100644 --- a/docs/api/rule.md +++ b/docs/api/rule.md @@ -146,6 +146,8 @@ Rule(async_function, run_sync(sync_function)) 命令形式匹配,根据配置里提供的 `command_start`, `command_sep` 判断消息是否为命令。 + 可以通过 `state["_prefix"]["command"]` 获取匹配成功的命令(例:`("test",)`),通过 `state["_prefix"]["raw_command"]` 获取匹配成功的原始命令文本(例:`"/test"`)。 + * **参数** diff --git a/docs_build/README.rst b/docs_build/README.rst index 716c153c..02d097be 100644 --- a/docs_build/README.rst +++ b/docs_build/README.rst @@ -2,18 +2,18 @@ NoneBot Api Reference ===================== :模块索引: - - `nonebot `_ - - `nonebot.config `_ - - `nonebot.plugin `_ - - `nonebot.matcher `_ - - `nonebot.rule `_ - - `nonebot.permission `_ - - `nonebot.sched `_ - - `nonebot.log `_ - - `nonebot.utils `_ - - `nonebot.typing `_ - - `nonebot.exception `_ + - `nonebot `_ + - `nonebot.config `_ + - `nonebot.plugin `_ + - `nonebot.matcher `_ + - `nonebot.rule `_ + - `nonebot.permission `_ + - `nonebot.sched `_ + - `nonebot.log `_ + - `nonebot.utils `_ + - `nonebot.typing `_ + - `nonebot.exception `_ - `nonebot.drivers `_ - - `nonebot.drivers.fastapi `_ + - `nonebot.drivers.fastapi `_ - `nonebot.adapters `_ - - `nonebot.adapters.cqhttp `_ + - `nonebot.adapters.cqhttp `_ diff --git a/nonebot/rule.py b/nonebot/rule.py index f0da99a9..2802fdd8 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -200,6 +200,8 @@ def command(*cmds: Union[str, Tuple[str, ...]]) -> Rule: """ :说明: 命令形式匹配,根据配置里提供的 ``command_start``, ``command_sep`` 判断消息是否为命令。 + + 可以通过 ``state["_prefix"]["command"]`` 获取匹配成功的命令(例:``("test",)``),通过 ``state["_prefix"]["raw_command"]`` 获取匹配成功的原始命令文本(例:``"/test"``)。 :参数: * ``*cmds: Union[str, Tuple[str, ...]]``: 命令内容 :示例: From 47f491039c73c75af24fd17b400ad14ad4075528 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Wed, 28 Oct 2020 13:23:48 +0800 Subject: [PATCH 37/64] :bulb: update regex docstring --- nonebot/rule.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nonebot/rule.py b/nonebot/rule.py index fed21d70..6694c2b2 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -234,7 +234,9 @@ def command(command: Tuple[str, ...]) -> Rule: def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: """ :说明: - 根据正则表达式进行匹配 + 根据正则表达式进行匹配。 + + 可以通过 ``state["matched"]`` 获取正则表达式匹配成功的文本。 :参数: * ``regex: str``: 正则表达式 * ``flags: Union[int, re.RegexFlag]``: 正则标志 @@ -247,9 +249,9 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: pattern = re.compile(regex, flags) async def _regex(bot: Bot, event: Event, state: dict) -> bool: - matched_string = pattern.search(str(event.message)) - if matched_string: - state["matched_string"] = matched_string.group() + matched = pattern.search(str(event.message)) + if matched: + state["matched"] = matched.group() return True else: return False From c9c615c8cbe258033df6a82650c3743ffb01a32f Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 28 Oct 2020 13:42:20 +0800 Subject: [PATCH 38/64] :construction_worker: try pull request target --- .github/workflows/api_docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/api_docs.yml b/.github/workflows/api_docs.yml index efbde69f..f4ee792b 100644 --- a/.github/workflows/api_docs.yml +++ b/.github/workflows/api_docs.yml @@ -1,7 +1,7 @@ name: Build API Doc on: - pull_request: + pull_request_target: types: [ opened, synchronize, reopened ] jobs: From c3bd8ebf57d73dc91d5658bfd45c5b75dd7fe010 Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Wed, 28 Oct 2020 13:45:54 +0800 Subject: [PATCH 39/64] :construction: change result store --- nonebot/rule.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nonebot/rule.py b/nonebot/rule.py index 6694c2b2..4bb4063d 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -236,7 +236,7 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: :说明: 根据正则表达式进行匹配。 - 可以通过 ``state["matched"]`` 获取正则表达式匹配成功的文本。 + 可以通过 ``state["_matched"]`` 获取正则表达式匹配成功的文本。 :参数: * ``regex: str``: 正则表达式 * ``flags: Union[int, re.RegexFlag]``: 正则标志 @@ -251,9 +251,10 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: async def _regex(bot: Bot, event: Event, state: dict) -> bool: matched = pattern.search(str(event.message)) if matched: - state["matched"] = matched.group() + state["_matched"] = matched.group() return True else: + state["_matched"] = None return False return Rule(_regex) From a40f1a453ca9bf580017ac2da27d9eaaac69135c Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 29 Oct 2020 16:27:20 +0800 Subject: [PATCH 40/64] :memo: replace say with echo due to superuser perm --- docs/guide/getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index d52a9396..9c358ead 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -136,11 +136,11 @@ QQ 协议端举例: 现在,尝试向你的 QQ 机器人账号发送如下内容: ```default -/say 你好,世界 +/echo 你好,世界 ``` 到这里如果一切 OK,你应该会收到机器人给你回复了 `你好,世界`。这一历史性的对话标志着你已经成功地运行了一个 NoneBot 的最小实例,开始了编写更强大的 QQ 机器人的创意之旅! - + From 06f20281a5c111493e361060e82da9510378a935 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 29 Oct 2020 17:06:07 +0800 Subject: [PATCH 41/64] :mute: remove meta event logs #21 --- nonebot/message.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/nonebot/message.py b/nonebot/message.py index 4d64c25d..d9e61c63 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -54,6 +54,7 @@ async def _run_matcher(Matcher: Type[Matcher], bot: Bot, event: Event, async def handle_event(bot: Bot, event: Event): + show_log = True log_msg = f"{bot.type.upper()} | {event.self_id} [{event.name}]: " if event.type == "message": log_msg += f"Message {event.id} from " @@ -71,8 +72,10 @@ async def handle_event(bot: Bot, event: Event): elif event.type == "request": log_msg += f"Request {event.raw_event}" elif event.type == "meta_event": - log_msg += f"MetaEvent {event.detail_type}" - logger.opt(colors=True).info(log_msg) + # log_msg += f"MetaEvent {event.detail_type}" + show_log = False + if show_log: + logger.opt(colors=True).info(log_msg) coros = [] state = {} @@ -100,7 +103,8 @@ async def handle_event(bot: Bot, event: Event): for matcher in matchers[priority] ] - logger.debug(f"Checking for matchers in priority {priority}...") + if show_log: + logger.debug(f"Checking for matchers in priority {priority}...") results = await asyncio.gather(*pending_tasks, return_exceptions=True) i = 0 From 383c0031a563e99ea7e4a6969c5582c64ff3b985 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 30 Oct 2020 01:59:45 +0800 Subject: [PATCH 42/64] :memo: update plugin --- docs/.vuepress/components/Plugins.vue | 17 ++++++++++++++--- docs/.vuepress/public/plugins.json | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/docs/.vuepress/components/Plugins.vue b/docs/.vuepress/components/Plugins.vue index ca97311a..a36b9d39 100644 --- a/docs/.vuepress/components/Plugins.vue +++ b/docs/.vuepress/components/Plugins.vue @@ -1,9 +1,20 @@ diff --git a/docs/.vuepress/public/plugins.json b/docs/.vuepress/public/plugins.json index c30a4f1d..b92dde26 100644 --- a/docs/.vuepress/public/plugins.json +++ b/docs/.vuepress/public/plugins.json @@ -1,4 +1,22 @@ [ + { + "name": "nonebot-plugin-status", + "desc": "通过戳一戳获取服务器状态", + "author": "nonebot", + "repo": "nonebot/nonebot2" + }, + { + "name": "nonebot-plugin-status", + "desc": "通过戳一戳获取服务器状态", + "author": "nonebot", + "repo": "nonebot/nonebot2" + }, + { + "name": "nonebot-plugin-status", + "desc": "通过戳一戳获取服务器状态", + "author": "nonebot", + "repo": "nonebot/nonebot2" + }, { "name": "nonebot-plugin-status", "desc": "通过戳一戳获取服务器状态", From 89c3aa38a65fb49529061dd2745c4cc1b504a747 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 30 Oct 2020 16:26:04 +0800 Subject: [PATCH 43/64] :art: allow multi value for keyword rule --- docs/api/plugin.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ docs/api/rule.md | 8 +++++--- nonebot/plugin.py | 37 ++++++++++++++++++++++++++----------- nonebot/plugin.pyi | 20 ++++++++++++++++---- nonebot/rule.py | 10 ++++++---- 5 files changed, 97 insertions(+), 22 deletions(-) diff --git a/docs/api/plugin.md b/docs/api/plugin.md index 7aeeabc9..42cdf84f 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -346,6 +346,50 @@ sidebarDepth: 0 +## `on_keyword(keywords, rule=None, **kwargs)` + + +* **说明** + + 注册一个消息事件响应器,并且当消息纯文本部分包含关键词时响应。 + + + +* **参数** + + + * `keywords: Set[str]`: 关键词列表 + + + * `rule: Optional[Union[Rule, RuleChecker]]`: 事件响应规则 + + + * `permission: Optional[Permission]`: 事件响应权限 + + + * `handlers: Optional[List[Handler]]`: 事件处理函数列表 + + + * `temp: bool`: 是否为临时事件响应器(仅执行一次) + + + * `priority: int`: 事件响应器优先级 + + + * `block: bool`: 是否阻止事件向更低优先级传递 + + + * `state: Optional[dict]`: 默认的 state + + + +* **返回** + + + * `Type[Matcher]` + + + ## `on_command(cmd, rule=None, aliases=None, **kwargs)` diff --git a/docs/api/rule.md b/docs/api/rule.md index 9142ce2e..dade2a5b 100644 --- a/docs/api/rule.md +++ b/docs/api/rule.md @@ -123,7 +123,7 @@ Rule(async_function, run_sync(sync_function)) -## `keyword(msg)` +## `keyword(*keywords)` * **说明** @@ -135,7 +135,7 @@ Rule(async_function, run_sync(sync_function)) * **参数** - * `msg: str`: 关键词 + * `*keywords: str`: 关键词 @@ -175,7 +175,9 @@ Rule(async_function, run_sync(sync_function)) * **说明** - 根据正则表达式进行匹配 + 根据正则表达式进行匹配。 + + 可以通过 `state["_matched"]` 获取正则表达式匹配成功的文本。 diff --git a/nonebot/plugin.py b/nonebot/plugin.py index b0196bd2..32be4dbc 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -16,7 +16,7 @@ from nonebot.log import logger from nonebot.matcher import Matcher from nonebot.permission import Permission from nonebot.typing import Handler, RuleChecker -from nonebot.rule import Rule, startswith, endswith, command, regex +from nonebot.rule import Rule, startswith, endswith, keyword, command, regex from nonebot.typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, ModuleType plugins: Dict[str, "Plugin"] = {} @@ -232,8 +232,7 @@ def on_startswith(msg: str, :返回: - ``Type[Matcher]`` """ - return on_message(startswith(msg) & rule, **kwargs) if rule else on_message( - startswith(msg), **kwargs) + return on_message(startswith(msg) & rule, **kwargs) def on_endswith(msg: str, @@ -254,8 +253,28 @@ def on_endswith(msg: str, :返回: - ``Type[Matcher]`` """ - return on_message(endswith(msg) & rule, **kwargs) if rule else on_message( - startswith(msg), **kwargs) + return on_message(endswith(msg) & rule, **kwargs) + + +def on_keyword(keywords: Set[str], + rule: Optional[Union[Rule, RuleChecker]] = None, + **kwargs) -> Type[Matcher]: + """ + :说明: + 注册一个消息事件响应器,并且当消息纯文本部分包含关键词时响应。 + :参数: + * ``keywords: Set[str]``: 关键词列表 + * ``rule: Optional[Union[Rule, RuleChecker]]``: 事件响应规则 + * ``permission: Optional[Permission]``: 事件响应权限 + * ``handlers: Optional[List[Handler]]``: 事件处理函数列表 + * ``temp: bool``: 是否为临时事件响应器(仅执行一次) + * ``priority: int``: 事件响应器优先级 + * ``block: bool``: 是否阻止事件向更低优先级传递 + * ``state: Optional[dict]``: 默认的 state + :返回: + - ``Type[Matcher]`` + """ + return on_message(keyword(*keywords) & rule, **kwargs) def on_command(cmd: Union[str, Tuple[str, ...]], @@ -290,9 +309,7 @@ def on_command(cmd: Union[str, Tuple[str, ...]], handlers.insert(0, _strip_cmd) commands = set([cmd]) | (aliases or set()) - return on_message(command(*commands) & rule, handlers=handlers, ** - kwargs) if rule else on_message( - command(*commands), handlers=handlers, **kwargs) + return on_message(command(*commands) & rule, handlers=handlers, **kwargs) def on_regex(pattern: str, @@ -317,9 +334,7 @@ def on_regex(pattern: str, :返回: - ``Type[Matcher]`` """ - return on_message(regex(pattern, flags) & - rule, **kwargs) if rule else on_message( - regex(pattern, flags), **kwargs) + return on_message(regex(pattern, flags) & rule, **kwargs) class CommandGroup: diff --git a/nonebot/plugin.pyi b/nonebot/plugin.pyi index dbd96365..6cf93b97 100644 --- a/nonebot/plugin.pyi +++ b/nonebot/plugin.pyi @@ -69,8 +69,8 @@ def on_request(rule: Optional[Union[Rule, RuleChecker]] = ..., def on_startswith(msg: str, rule: Optional[Optional[Union[Rule, RuleChecker]]] = ..., - permission: Optional[Permission] = ..., *, + permission: Optional[Permission] = ..., handlers: Optional[List[Handler]] = ..., temp: bool = ..., priority: int = ..., @@ -81,8 +81,8 @@ def on_startswith(msg: str, def on_endswith(msg: str, rule: Optional[Optional[Union[Rule, RuleChecker]]] = ..., - permission: Optional[Permission] = ..., *, + permission: Optional[Permission] = ..., handlers: Optional[List[Handler]] = ..., temp: bool = ..., priority: int = ..., @@ -91,11 +91,23 @@ def on_endswith(msg: str, ... +def on_keyword(keywords: Set[str], + rule: Optional[Optional[Union[Rule, RuleChecker]]] = ..., + *, + permission: Optional[Permission] = ..., + handlers: Optional[List[Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[dict] = ...) -> Type[Matcher]: + ... + + def on_command(cmd: Union[str, Tuple[str, ...]], rule: Optional[Union[Rule, RuleChecker]] = ..., aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., - permission: Optional[Permission] = ..., *, + permission: Optional[Permission] = ..., handlers: Optional[List[Handler]] = ..., temp: bool = ..., priority: int = ..., @@ -107,8 +119,8 @@ def on_command(cmd: Union[str, Tuple[str, ...]], def on_regex(pattern: str, flags: Union[int, re.RegexFlag] = 0, rule: Optional[Rule] = ..., - permission: Optional[Permission] = ..., *, + permission: Optional[Permission] = ..., handlers: Optional[List[Handler]] = ..., temp: bool = ..., priority: int = ..., diff --git a/nonebot/rule.py b/nonebot/rule.py index c950c449..faefbd76 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -182,16 +182,17 @@ def endswith(msg: str) -> Rule: return Rule(_endswith) -def keyword(msg: str) -> Rule: +def keyword(*keywords: str) -> Rule: """ :说明: 匹配消息关键词 :参数: - * ``msg: str``: 关键词 + * ``*keywords: str``: 关键词 """ async def _keyword(bot: Bot, event: Event, state: dict) -> bool: - return bool(event.plain_text and msg in event.plain_text) + return bool(event.plain_text and + any(keyword in event.plain_text for keyword in keywords)) return Rule(_keyword) @@ -240,7 +241,7 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: """ :说明: 根据正则表达式进行匹配。 - + 可以通过 ``state["_matched"]`` 获取正则表达式匹配成功的文本。 :参数: * ``regex: str``: 正则表达式 @@ -261,6 +262,7 @@ def regex(regex: str, flags: Union[int, re.RegexFlag] = 0) -> Rule: else: state["_matched"] = None return False + return Rule(_regex) From 70c7927006320a24ad38acd48787249f3a72e6bf Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Fri, 30 Oct 2020 16:49:31 +0800 Subject: [PATCH 44/64] :bulb: add docstring for cqhttp message --- docs/api/adapters/cqhttp.md | 4 ++++ nonebot/adapters/cqhttp.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/docs/api/adapters/cqhttp.md b/docs/api/adapters/cqhttp.md index aae78f86..73b4e044 100644 --- a/docs/api/adapters/cqhttp.md +++ b/docs/api/adapters/cqhttp.md @@ -405,7 +405,11 @@ CQHTTP 协议 Event 适配。继承属性参考 [BaseEvent](./#class-baseevent) 基类:[`nonebot.adapters.BaseMessageSegment`](#None) +CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 + ## _class_ `Message` 基类:[`nonebot.adapters.BaseMessage`](#None) + +CQHTTP 协议 Message 适配。 diff --git a/nonebot/adapters/cqhttp.py b/nonebot/adapters/cqhttp.py index 0f214e36..8a895f17 100644 --- a/nonebot/adapters/cqhttp.py +++ b/nonebot/adapters/cqhttp.py @@ -633,6 +633,9 @@ class Event(BaseEvent): class MessageSegment(BaseMessageSegment): + """ + CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 + """ @overrides(BaseMessageSegment) def __init__(self, type: str, data: Dict[str, Any]) -> None: @@ -811,6 +814,9 @@ class MessageSegment(BaseMessageSegment): class Message(BaseMessage): + """ + CQHTTP 协议 Message 适配。 + """ @staticmethod @overrides(BaseMessage) From 22962d55e1f410bb56976189b6073c73e6bf13c6 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 1 Nov 2020 16:18:57 +0800 Subject: [PATCH 45/64] :construction_worker: create plugin issue template --- .github/ISSUE_TEMPLATE/plugin-publish.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/plugin-publish.md diff --git a/.github/ISSUE_TEMPLATE/plugin-publish.md b/.github/ISSUE_TEMPLATE/plugin-publish.md new file mode 100644 index 00000000..9ecc8321 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/plugin-publish.md @@ -0,0 +1,22 @@ +--- +name: Plugin Publish +about: Publish your plugin to nonebot homepage and nb-cli +title: "Plugin: blabla 的插件" +labels: Plugin +assignees: "" + +--- + +**你的插件名称:** + +nonebot-plugin-example + +> 请事先发布插件到[pypi](https://pypi.org/),插件名称应与 pypi 项目名称**保持一致** + +**简短描述插件功能** + +例:复读机 + +**插件项目仓库/主页链接** + +your project link here From 15e59a1778a5249830c78645861ffbefc59c2386 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 1 Nov 2020 18:21:10 +0800 Subject: [PATCH 46/64] :construction_worker: update plugin template --- .github/ISSUE_TEMPLATE/plugin-publish.md | 34 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/plugin-publish.md b/.github/ISSUE_TEMPLATE/plugin-publish.md index 9ecc8321..a6189f77 100644 --- a/.github/ISSUE_TEMPLATE/plugin-publish.md +++ b/.github/ISSUE_TEMPLATE/plugin-publish.md @@ -1,22 +1,34 @@ --- + name: Plugin Publish about: Publish your plugin to nonebot homepage and nb-cli title: "Plugin: blabla 的插件" labels: Plugin assignees: "" - ---- - -**你的插件名称:** - -nonebot-plugin-example - -> 请事先发布插件到[pypi](https://pypi.org/),插件名称应与 pypi 项目名称**保持一致** - -**简短描述插件功能** +---**你的插件名称:** 例:复读机 +**简短描述插件功能:** + +例:复读群友的消息 + +**插件 import 使用的名称** + +例:nonebot-plugin-example + +**插件 install 使用的名称** + +例 1:nonebot-plugin-example + +通过 pypi 安装 + +> 请事先发布插件到[pypi](https://pypi.org/) + +例 2:git+https://github.com/nonebot/nonebot-plugin-example + +从 github 仓库安装 + **插件项目仓库/主页链接** -your project link here +例:nonebot/nonebot2(默认 github )或其他链接 From af7f42ac60472fddc585559f254b97d38fe0361b Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 1 Nov 2020 18:21:31 +0800 Subject: [PATCH 47/64] :memo: update plugin store page --- docs/.vuepress/components/Plugins.vue | 92 +++++++++++++++++++++------ docs/.vuepress/public/plugins.json | 22 +------ package-lock.json | 21 ++++-- package.json | 3 +- 4 files changed, 95 insertions(+), 43 deletions(-) diff --git a/docs/.vuepress/components/Plugins.vue b/docs/.vuepress/components/Plugins.vue index a36b9d39..977ed165 100644 --- a/docs/.vuepress/components/Plugins.vue +++ b/docs/.vuepress/components/Plugins.vue @@ -1,33 +1,77 @@ @@ -37,3 +81,13 @@ export default { min-height: 0 !important; } + + diff --git a/docs/.vuepress/public/plugins.json b/docs/.vuepress/public/plugins.json index b92dde26..8f97eaa6 100644 --- a/docs/.vuepress/public/plugins.json +++ b/docs/.vuepress/public/plugins.json @@ -1,24 +1,8 @@ [ { - "name": "nonebot-plugin-status", - "desc": "通过戳一戳获取服务器状态", - "author": "nonebot", - "repo": "nonebot/nonebot2" - }, - { - "name": "nonebot-plugin-status", - "desc": "通过戳一戳获取服务器状态", - "author": "nonebot", - "repo": "nonebot/nonebot2" - }, - { - "name": "nonebot-plugin-status", - "desc": "通过戳一戳获取服务器状态", - "author": "nonebot", - "repo": "nonebot/nonebot2" - }, - { - "name": "nonebot-plugin-status", + "id": "nonebot-plugin-status", + "link": "nonebot-plugin-status", + "name": "状态监控", "desc": "通过戳一戳获取服务器状态", "author": "nonebot", "repo": "nonebot/nonebot2" diff --git a/package-lock.json b/package-lock.json index efb2f7bf..34a6742d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3313,6 +3313,14 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, "copy-webpack-plugin": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", @@ -9711,6 +9719,11 @@ "repeat-string": "^1.6.1" } }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -10461,7 +10474,7 @@ } }, "vuepress-theme-nonebot": { - "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#16c96d1cd12cbb72d0233875b0a671cada93ca2a", + "version": "git+https://github.com/nonebot/vuepress-theme-nonebot.git#29b6c7a7b0f69eee8fa98b78094057de20c4233c", "from": "git+https://github.com/nonebot/vuepress-theme-nonebot.git", "dev": true, "requires": { @@ -10487,9 +10500,9 @@ } }, "vuetify": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.14.tgz", - "integrity": "sha512-1Ys1MreJQOL/Ddp3YotBi1SlC2+1A0/RVkDXX3Azspt8incPdAnNB0JyChHiJ/TM+L+KSA7T4EXF9YDrCWENmg==" + "version": "2.3.16", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.16.tgz", + "integrity": "sha512-LHPqY+Gmyb/75xJscO0a3CuB4ZdpqHLNaGMAbmfTyapI8Q02+hjABEZzitFU/XObD2KhrNWPJzmGZPhbshGUzg==" }, "watchpack": { "version": "1.7.4", diff --git a/package.json b/package.json index 0d01b7b2..3aec35d7 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "vuepress-theme-nonebot": "git+https://github.com/nonebot/vuepress-theme-nonebot.git" }, "dependencies": { - "vuetify": "^2.3.14", + "copy-to-clipboard": "^3.3.1", + "vuetify": "^2.3.16", "wowjs": "^1.1.3" } } From d9ea95c67ee637accf4d73d6ce4ddcd01ef9b940 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 1 Nov 2020 19:20:18 +0800 Subject: [PATCH 48/64] :ambulance: fix message segment get --- nonebot/adapters/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nonebot/adapters/__init__.py b/nonebot/adapters/__init__.py index b7abd955..1f34d01e 100644 --- a/nonebot/adapters/__init__.py +++ b/nonebot/adapters/__init__.py @@ -286,6 +286,9 @@ class BaseMessageSegment(abc.ABC): def __setitem__(self, key, value): return setattr(self, key, value) + def get(self, key, default=None): + return getattr(self, key, default) + @classmethod @abc.abstractmethod def text(cls, text: str) -> "BaseMessageSegment": From 71ee9aee2132212e21a59230f5be37d623a6a8fe Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Mon, 2 Nov 2020 19:07:53 +0800 Subject: [PATCH 49/64] :construction: update plugin store --- docs/.vuepress/components/Plugins.vue | 77 +++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/docs/.vuepress/components/Plugins.vue b/docs/.vuepress/components/Plugins.vue index 977ed165..435e7938 100644 --- a/docs/.vuepress/components/Plugins.vue +++ b/docs/.vuepress/components/Plugins.vue @@ -1,14 +1,50 @@