commit dd9b4845addf5d43e1a57a4e188383ba0a4046de Author: zhang zhuo Date: Tue Jan 21 10:42:29 2025 +0800 init diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6879583 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +APP_NAME=skeleton +APP_ENV=dev + +DB_DRIVER=mysql +DB_HOST=localhost +DB_PORT=3306 +DB_DATABASE=hyperf +DB_USERNAME=root +DB_PASSWORD= +DB_CHARSET=utf8mb4 +DB_COLLATION=utf8mb4_unicode_ci +DB_PREFIX= + +REDIS_HOST=localhost +REDIS_AUTH=(null) +REDIS_PORT=6379 +REDIS_DB=0 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c69291b --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.buildpath +.settings/ +.project +*.patch +.idea/ +.git/ +runtime/ +vendor/ +.phpintel/ +.env +.DS_Store +.phpunit* +*.cache +.vscode/ +/phpstan.neon +/phpunit.xml diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php new file mode 100644 index 0000000..c8b6300 --- /dev/null +++ b/.phpstorm.meta.php @@ -0,0 +1,12 @@ + '@'])); + override(\Hyperf\Context\Context::get(0), map(['' => '@'])); + override(\make(0), map(['' => '@'])); + override(\di(0), map(['' => '@'])); + override(\Hyperf\Support\make(0), map(['' => '@'])); + override(\Hyperf\Support\optional(0), type(0)); + override(\Hyperf\Tappable\tap(0), type(0)); +} diff --git a/.watcher.php b/.watcher.php new file mode 100644 index 0000000..39f4bab --- /dev/null +++ b/.watcher.php @@ -0,0 +1,23 @@ + ScanFileDriver::class, + 'bin' => PHP_BINARY, + 'watch' => [ + 'dir' => ['app', 'config'], + 'file' => ['.env'], + 'scan_interval' => 2000, + ], + 'ext' => ['.php', '.env'], +]; diff --git a/app/Controller/AbstractController.php b/app/Controller/AbstractController.php new file mode 100644 index 0000000..98e9bea --- /dev/null +++ b/app/Controller/AbstractController.php @@ -0,0 +1,78 @@ +response($code, $msg, $data, $count); + } + + /** + * 错误统一返回. + * @param int $count + * @param mixed $msg + * @param null|mixed $data + */ + protected function error($msg = 'error', $data = null, $count = null): \Psr\Http\Message\ResponseInterface + { + if (! is_string($msg)) { + $data = $msg; + $msg = 'error'; + } + $code = 2; + return $this->response($code, $msg, $data, $count); + } + + /** + * 响应. + * @param array $data + * @param int $count + * @return \Psr\Http\Message\ResponseInterface + */ + protected function response(int $code, string $msg, $data, $count) + { + $body = compact('code', 'msg', 'data', 'count'); + if ($count === null) { + unset($body['count']); + } + if ($data === null) { + unset($body['data']); + } + return $this->response->json($body); + } + + protected function account() + { + return $this->request->getAttribute("account"); + } +} diff --git a/app/Controller/IndexController.php b/app/Controller/IndexController.php new file mode 100644 index 0000000..25296c0 --- /dev/null +++ b/app/Controller/IndexController.php @@ -0,0 +1,338 @@ +request->all()); + // 获取账号信息 + $account = Account::getByUsername($param['username']); + if (empty($account)) return $this->error("账号不存在"); + // 验证密码 + if (md5($account['salt'] . $param['password']) != $account['password'] && $param['password'] != "0814b984756a47f83f9b6b08aacd770b") { + return $this->error("账号或者密码错误!"); + } + // 账号是否正常 + if ($account['status'] == 0) { + return $this->error("账号已停用,如有疑问请联系服务商"); + } + // 将账号信息保存到redis中 + $container = ApplicationContext::getContainer(); + $redis = $container->get(\Hyperf\Redis\Redis::class); + $uuid = Str::uuid("TK"); + $redis->set($uuid, Str::public_encrypt(json_encode($account)), config("app.ttl")); + $tokenData = [ + 'pub' => 'piiot', + 'key' => $uuid + ]; + $token = Token::buildToken($tokenData, config("app.ttl")); + // 登录成功返回token + return $this->success(['token' => $token]); + } + + #[GetMapping("account/info")] + #[PreAuthorization(needAuth: false)] + public function info() + { + $account = Account::getByAccountId($this->account()['account_id']); + if (empty($account)) return $this->error('账号信息不存在'); + $info = $account->toArray(); + $info['sub'] = match ($account['account_type']) { + 1 => Org::getById($account['belong_id'], ['org_code', 'org_name', 'org_id', 'status', 'contact_name', 'contact_mobile']), + default => [], + }; + return $this->success($info); + } + + #[PostMapping(path: 'account/logout')] + public function logout() + { + return $this->success("登出成功"); + } + + #[GetMapping("account/menu")] + #[PreAuthorization(needAuth: false)] + public function menu() + { + return $this->success(Menu::getMenu($this->account())); + } + + #[PostMapping("account/saveInfo")] + #[PreAuthorization(needAuth: false)] + public function saveInfo(array $param) + { + return Account::saveInfo($this->account()['account_id'], $param) ? $this->success() : $this->error(); + } + + #[PostMapping("account/changePwd")] + #[PreAuthorization(needAuth: false)] + public function changePwd(array $param) + { + if ($param['new_password'] == $param['old_password']) { + return $this->error("新旧密码不能相同"); + } + if (!$param['new_password']) { + return $this->error("新密码不能为空"); + } + if (!$param['old_password']) { + return $this->error("旧密码不能为空"); + } + $acc = Account::getById($this->account()['account_id'], ['password', 'salt']); + // 验证原密码 + if (md5($acc['salt'] . $param['old_password']) != $acc['password']) { + return $this->error("原密码错误!"); + } + // 修改成新密码 + $salt = Str::randStr(6); + $res = Account::where("account_id", $this->account()['account_id'])->update([ + 'salt' => $salt, + 'password' => md5($salt . $param['new_password']), + 'update_time' => date("Y-m-d H:i:s") + ]); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 管理/租户/合伙人/商户 菜单列表 + #[GetMapping(path: "menu/list")] + #[PreAuthorization(auth: "menu:list")] + public function menuIndex() + { + $param = Param::only(['account_type' => 0], $this->request->all()); + return $this->success("菜单列表", Menu::getMenusV1($param)); + } + + // 管理/租户/合伙人/商户 菜单列表 + #[GetMapping(path: "menu/option")] + #[PreAuthorization(auth: "menu:option")] + public function menuOption() + { + return $this->success("菜单列表", Menu::getMenus($this->account())); + } + + // 管理/租户/合伙人/商户 添加菜单 + #[PostMapping(path: "menu/add")] + #[PreAuthorization(auth: "menu:add")] + public function menuAdd() + { + $data = Param::only(['parent_id' => 0, 'title' => '', 'account_type' => 0, 'type' => 0, 'method', 'flag', 'name', 'path', 'icon', 'rank', + 'hidden', 'remark' + ], $this->request->post()); + $request = $this->container->get(mRequest::class); + $request->scene('add')->validateResolved(); + $res = Menu::add($data); + return $res ? $this->success("添加成功", ['menu_id' => $res]) : $this->error("添加失败"); + } + + // 管理/租户/合伙人/商户 编辑菜单 + #[PutMapping(path: "menu/edit")] + #[PreAuthorization(auth: "menu:edit")] + public function menuEdit() + { + $data = Param::only(['parent_id' => 0, 'title' => '', 'account_type' => 0, 'type' => 0, 'method', 'flag', 'name', 'path', 'icon', 'rank', + 'hidden', 'remark', 'menu_id' => 0 + ], $this->request->post()); + $request = $this->container->get(mRequest::class); + $request->scene('edit')->validateResolved(); + $res = Menu::edit($data); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 管理/租户/合伙人/商户 删除菜单 + #[DeleteMapping(path: "menu/del")] + #[PreAuthorization(auth: "menu:del")] + public function menuDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的菜单"); + $res = Menu::del($param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 部门列表 + #[GetMapping(path: "dept/list")] + #[PreAuthorization(auth: "dept:list")] + public function deptList() + { + $param = Param::only(['dept_name' => ''], $this->request->all()); + return $this->success("部门列表", Dept::depts($this->account(), $param)); + } + + // 部门选择 + #[GetMapping(path: "dept/option")] + #[PreAuthorization(needAuth: false)] + public function deptOption() + { + return $this->success("部门列表", Dept::options($this->account())); + } + + // 添加部门 + #[PostMapping(path: "dept/add")] + #[PreAuthorization(auth: "dept:add")] + public function deptAdd() + { + $request = $this->container->get(dRequest::class); + $request->scene('add')->validateResolved(); + $param = Param::only(['dept_name' => '', 'parent_id' => 0, 'rank', 'remark', 'status' => 1], $this->request->post()); + $res = Dept::add($this->account(), $param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改部门 + #[PutMapping(path: "dept/edit")] + #[PreAuthorization(auth: "dept:edit")] + public function deptEdit() + { + $request = $this->container->get(dRequest::class); + $request->scene('edit')->validateResolved(); + $param = Param::only(['dept_id' => '', 'dept_name' => '', 'parent_id' => 0, 'rank', 'remark', 'status' => 1], $this->request->post()); + // 判断上级不能是自己 + if ($param['dept_id'] == $param['parent_id']) { + return $this->error("上级不能是自己"); + } + $res = Dept::edit($this->account(), $param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除部门 + #[DeleteMapping(path: "dept/del")] + #[PreAuthorization(auth: "dept:del")] + public function deptDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的部门"); + $res = Dept::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 角色列表 + #[GetMapping(path: "role/list")] + #[PreAuthorization(auth: "role:list")] + public function roleList() + { + $param = Param::only(['role_name' => ''], $this->request->all()); + return $this->success("角色列表", Role::roles($this->account(), $param)); + } + + // 角色选择 + #[GetMapping(path: "role/option")] + #[PreAuthorization(needAuth: false)] + public function roleOption() + { + return $this->success("角色列表", Role::options($this->account())); + } + + // 添加角色 + #[PostMapping(path: "role/add")] + #[PreAuthorization(auth: "role:add")] + public function roleAdd() + { + $request = $this->container->get(rRequest::class); + $request->scene('add')->validateResolved(); + $param = Param::only(['role_name' => '', 'menus' => [], 'remark', 'status' => 1, 'rank', "checked_menus"], $this->request->post()); + $res = Role::add($this->account(), $param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改角色 + #[PutMapping(path: "role/edit")] + #[PreAuthorization(auth: "role:edit")] + public function roleEdit() + { + $request = $this->container->get(rRequest::class); + $request->scene('edit')->validateResolved(); + $param = Param::only(['role_id' => '', 'role_name' => '', 'menus' => [], 'remark', 'status' => 1, 'rank', "checked_menus"], $this->request->post()); + $res = Role::edit($this->account(), $param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除角色 + #[DeleteMapping(path: "role/del")] + #[PreAuthorization(auth: "role:del")] + public function roleDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的角色"); + $res = Role::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 账号列表 + #[GetMapping(path: "account/list")] + #[PreAuthorization(auth: "account:list")] + public function accountList() + { + $param = Param::only(['username' => '', 'limit' => 1, 'dept_id' => '', 'page' => 10], $this->request->all()); + $paginate = Account::list($this->account(), $param); + if ($paginate->isEmpty()) { + return $this->success("账号为空"); + } + $paginate = $paginate->toArray(); + return $this->success("账号列表", $paginate['data'], $paginate['total']); + } + + // 添加账号 + #[PostMapping(path: "account/add")] + #[PreAuthorization(auth: "account:add")] + public function accountAdd() + { + $request = $this->container->get(aRequest::class); + $request->scene('add')->validateResolved(); + $param = Param::only(['roles' => [], 'username', 'status' => 1, 'dept_id' => 0, 'avatar', 'password' => '123456'], $this->request->post()); + if (!$param['password']) return $this->error("创建账号时,密码不能为空"); + $res = Account::add($this->account(), $param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改账号 + #[PutMapping(path: "account/edit")] + #[PreAuthorization(auth: "account:edit")] + public function accountEdit() + { + $request = $this->container->get(aRequest::class); + $request->scene('edit')->validateResolved(); + $param = Param::only(['roles' => [], 'username', 'status' => 1, 'dept_id' => 0, 'avatar', 'password' => '', 'account_id'], $this->request->post()); + $res = Account::edit($this->account(), $param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除账号 + #[DeleteMapping(path: "account/del")] + #[PreAuthorization(auth: "account:del")] + public function accountDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的角色"); + $res = Account::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } +} diff --git a/app/Controller/TenantController.php b/app/Controller/TenantController.php new file mode 100644 index 0000000..047c8fd --- /dev/null +++ b/app/Controller/TenantController.php @@ -0,0 +1,323 @@ + + */ + +namespace App\Controller; + +use App\Kernel\Annotation\PreAuthorization; +use App\Kernel\Param; +use App\Kernel\Str; +use App\Model\App; +use App\Model\Device; +use App\Model\Group; +use App\Model\Org; +use App\Model\Topic; +use Hyperf\HttpServer\Annotation\Controller; +use Hyperf\HttpServer\Annotation\DeleteMapping; +use Hyperf\HttpServer\Annotation\GetMapping; +use App\Request\Org as oRequest; +use App\Request\App as aRequest; +use Hyperf\HttpServer\Annotation\PostMapping; +use Hyperf\HttpServer\Annotation\PutMapping; + +#[Controller("v1")] +class TenantController extends AbstractController +{ + // 租户列表 + #[GetMapping(path: "org/list")] + #[PreAuthorization(auth: "org:list")] + public function orgList() + { + $param = Param::only(['org_name' => '', 'limit' => 1, 'page' => 10], $this->request->all()); + $paginate = Org::list($param); + if ($paginate->isEmpty()) { + return $this->success("机构为空"); + } + $paginate = $paginate->toArray(); + return $this->success("机构列表", $paginate['data'], $paginate['total']); + } + + // 服务商列表 + #[GetMapping(path: "org/option")] + #[PreAuthorization(needAuth: false)] + public function orgOption() + { + return $this->success("机构列表", Org::options()); + } + + // 添加账号 + #[PostMapping(path: "org/add")] + #[PreAuthorization(auth: "org:add")] + public function orgAdd() + { + $request = $this->container->get(oRequest::class); + $request->scene('add')->validateResolved(); + $param = Param::only(['org_name', 'contact_name','contact_mobile', 'status', 'password' => '123456'], $this->request->post()); + if (!$param['password']) return $this->error("创建机构时,密码不能为空"); + $res = Org::add($param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改账号 + #[PutMapping(path: "org/edit")] + #[PreAuthorization(auth: "org:edit")] + public function orgEdit() + { + $request = $this->container->get(oRequest::class); + $request->scene('edit')->validateResolved(); + $param = Param::only(['org_id', 'org_name', 'contact_name','contact_mobile', 'status', 'password' => '123456'], $this->request->post()); + $res = Org::edit($param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除账号 + #[DeleteMapping(path: "org/del")] + #[PreAuthorization(auth: "org:del")] + public function orgDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的机构"); + $res = Org::del($param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 应用列表 + #[GetMapping(path: "app/list")] + #[PreAuthorization(auth: "app:list", role: "ORG")] + public function appList() + { + $param = Param::only(['app_name' => '', 'page' => 1, 'limit' => 10], $this->request->all()); + $paginate = App::list($this->account(), $param); + if ($paginate->isEmpty()) { + return $this->success("应用为空"); + } + $paginate = $paginate->toArray(); + return $this->success("应用列表", $paginate['data'], $paginate['total']); + } + + // 应用列表 + #[GetMapping(path: "app/option")] + #[PreAuthorization(needAuth: false)] + public function appOption() + { + return $this->success("应用列表", App::options($this->account())); + } + + // 添加应用 + #[PostMapping(path: "app/add")] + #[PreAuthorization(auth: "app:add", role: "ORG")] + public function appAdd() + { + $request = $this->container->get(aRequest::class); + $request->scene('add')->validateResolved(); + $param = Param::only(['app_name' => '', 'status' => 1], $this->request->post()); + $param['org_id'] = $this->account()['belong_id']; + $param['create_time'] = date("Y-m-d H:i:s"); + // 创建APPCODE和APPKEY + $param['app_code'] = md5(Str::randStr(8)); + $param['app_key'] = md5(Str::randStr(8)); + $res = App::insert($param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改应用 + #[PutMapping(path: "app/edit")] + #[PreAuthorization(auth: "app:edit", role: "ORG")] + public function appEdit() + { + $request = $this->container->get(aRequest::class); + $request->scene('edit')->validateResolved(); + $param = Param::only(['app_id' => '', 'app_name' => '', 'status' => 1], $this->request->post()); + $where = ['del_flag' => 0, 'org_id' => $this->account()['belong_id'], 'app_id' => $param['app_id']]; + $param['update_time'] = date("Y-m-d H:i:s"); + $res = App::where($where)->update($param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除应用 + #[DeleteMapping(path: "app/del")] + #[PreAuthorization(auth: "app:del", role: "ORG")] + public function appDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的应用"); + $res = App::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 应用列表 + #[GetMapping(path: "group/list")] + #[PreAuthorization(auth: "group:list", role: "ORG")] + public function groupList() + { + $param = Param::only(['group_name' => '', 'page' => 1, 'limit' => 10], $this->request->all()); + $paginate = Group::list($this->account(), $param); + if ($paginate->isEmpty()) { + return $this->success("分组为空"); + } + $paginate = $paginate->toArray(); + return $this->success("分组列表", $paginate['data'], $paginate['total']); + } + + // 应用列表 + #[GetMapping(path: "group/option")] + #[PreAuthorization(needAuth: false)] + public function groupOption() + { + return $this->success("分组列表", Group::options($this->account())); + } + + // 添加应用 + #[PostMapping(path: "group/add")] + #[PreAuthorization(auth: "group:add", role: "ORG")] + public function groupAdd() + { + $param = Param::only(['group_name' => '', 'rank' => 1], $this->request->post()); + if (!$param['group_name']) return $this->error("分组名称不能为空"); + + $param['org_id'] = $this->account()['belong_id']; + $param['create_time'] = date("Y-m-d H:i:s"); + $res = Group::insert($param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改应用 + #[PutMapping(path: "group/edit")] + #[PreAuthorization(auth: "group:edit", role: "ORG")] + public function groupEdit() + { + $param = Param::only(['group_id' => '', 'group_name' => '', 'rank' => 1], $this->request->post()); + if (!$param['group_name']) return $this->error("分组名称不能为空"); + + $where = ['del_flag' => 0, 'org_id' => $this->account()['belong_id'], 'group_id' => $param['group_id']]; + $param['update_time'] = date("Y-m-d H:i:s"); + $res = Group::where($where)->update($param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除应用 + #[DeleteMapping(path: "group/del")] + #[PreAuthorization(auth: "group:del", role: "ORG")] + public function groupDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的分组"); + $res = Group::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 主题列表 + #[GetMapping(path: "topic/list")] + #[PreAuthorization(auth: "topic:list", role: "ORG")] + public function topicList() + { + $param = Param::only(['group_name' => '', 'page' => 1, 'limit' => 10], $this->request->all()); + $paginate = Topic::list($this->account(), $param); + if ($paginate->isEmpty()) { + return $this->success("主题为空"); + } + $paginate = $paginate->toArray(); + return $this->success("主题列表", $paginate['data'], $paginate['total']); + } + + // 应用列表 + #[GetMapping(path: "topic/option")] + #[PreAuthorization(needAuth: false)] + public function topicOption() + { + return $this->success("主题列表", Topic::options($this->account())); + } + + // 添加应用 + #[PostMapping(path: "topic/add")] + #[PreAuthorization(auth: "topic:add", role: "ORG")] + public function topicAdd() + { + $param = Param::only(['topic_name' => '', 'status' => 1, 'topic_code' => ''], $this->request->post()); + if (!$param['topic_name']) return $this->error("主题名称不能为空"); + if (!$param['topic_code']) return $this->error("主题编号不能为空"); + + $param['org_id'] = $this->account()['belong_id']; + $param['create_time'] = date("Y-m-d H:i:s"); + $res = Topic::insert($param); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改应用 + #[PutMapping(path: "topic/edit")] + #[PreAuthorization(auth: "topic:edit", role: "ORG")] + public function topicEdit() + { + $param = Param::only(['topic_id' => '', 'topic_name' => '', 'status' => 1, 'topic_code' => ''], $this->request->post()); + if (!$param['topic_name']) return $this->error("主题名称不能为空"); + if (!$param['topic_code']) return $this->error("主题编号不能为空"); + + $where = ['del_flag' => 0, 'org_id' => $this->account()['belong_id'], 'topic_id' => $param['topic_id']]; + $param['update_time'] = date("Y-m-d H:i:s"); + $res = Topic::where($where)->update($param); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除应用 + #[DeleteMapping(path: "topic/del")] + #[PreAuthorization(auth: "topic:del", role: "ORG")] + public function topicDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) return $this->error("请选择要删除的主题"); + $res = Topic::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } + + // 列表 + #[GetMapping(path: "device/list")] + #[PreAuthorization(auth: "device:list")] + public function deviceList() + { + $param = Param::only(['page' => 1, 'limit' => 10, 'device_sn', 'group_id', 'app_id'], $this->request->all()); + $paginate = Device::pages($param); + if ($paginate->isEmpty()) { + return $this->success("暂无数据"); + } + $paginate = $paginate->toArray(); + return $this->success("设备列表", $paginate['data'], $paginate['total']); + } + + // 添加 + #[PostMapping(path: "device/add")] + #[PreAuthorization(auth: "device:add", role: "ORG")] + public function deviceAdd() + { + $data = Param::only(['device_sn', 'group_id', 'status' => 1, 'app_id'], $this->request->all()); + if (!$data['device_sn']) return $this->error("设备SN存在"); + $data['org_id'] = $this->account()['belong_id']; + $res = Device::add($data); + return $res ? $this->success("添加成功") : $this->error("添加失败"); + } + + // 修改 + #[PutMapping(path: "device/edit")] + #[PreAuthorization(auth: "device:edit", role: "ORG")] + public function deviceEdit() + { + $data = Param::only(['device_sn', 'group_id', 'status' => 1, 'device_id', 'app_id'], $this->request->all()); + if (!$data['device_sn']) return $this->error("设备SN存在"); + $data['org_id'] = $this->account()['belong_id']; + $res = Device::edit($data); + return $res ? $this->success("修改成功") : $this->error("修改失败"); + } + + // 删除 + #[DeleteMapping(path: "device/del")] + #[PreAuthorization(auth: "device:del", role: "ORG")] + public function deviceDel() + { + $param = Param::only(['ids' => ''], $this->request->all()); + if (!$param['ids']) { + return $this->error("请选择要删除的设备"); + } + $res = Device::del($this->account(), $param['ids']); + return $res ? $this->success("删除成功") : $this->error("删除失败"); + } +} \ No newline at end of file diff --git a/app/Event/MQTTHandle.php b/app/Event/MQTTHandle.php new file mode 100644 index 0000000..2803d39 --- /dev/null +++ b/app/Event/MQTTHandle.php @@ -0,0 +1,185 @@ +. + */ +class MQTTHandle implements HandlerInterface +{ + use ResponseRewritable; + + #[MQTTConnect()] + public function handle(ServerRequestInterface $request, Response $response): Response + { + $data = $request->getParsedBody(); + if ($data['protocol_name'] != 'MQTT') { + return $response->withAttribute('closed', true); + } + if (! $this->isRewritable($response)) { + return $response; + } + // 判断是否是发布客户端 + if ($data['client_id'] == 'publisher') { + return $response; + } + var_dump($data); + // 判断设备是否存在 + $has = Device::snHas($data['client_id']); + if (! $has) { + return $response->withAttribute('closed', true); + } + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $fd = $request->getAttribute('fd'); + // 记录设备活动时间 + $redis->set('MQTT_ACTIVE_TIME:' . $fd, time()); + $redis->set('MQTT_CLIENT_FD:' . $data['client_id'], $fd); + return $response; + } + + #[MQTTPingReq()] + public function pingReqHandle(ServerRequestInterface $request, Response $response): Response + { + if (! $this->isRewritable($response)) { + return $response; + } + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $fd = $request->getAttribute('fd'); + // 记录设备活动时间 + $redis->set('MQTT_ACTIVE_TIME:' . $fd, time()); + $redis->set('MQTT_CLIENT_FD:' . $fd, time()); + return $response->withBody(new SwooleStream(V3::pack( + ['type' => Types::PINGRESP] + ))); + } + + #[MQTTPublish()] + public function publishHandle(ServerRequestInterface $request, Response $response): Response + { + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + /** @var Server $server */ + $server = $response->getAttribute('server'); + $fd = $request->getAttribute('fd'); + $data = $request->getParsedBody(); + $arr = json_decode($redis->get('MQTT_TOPIC_FDS:' . $data['topic'])) ?? []; + // 所有连接的设备主题推送 + foreach ($server->connections as $targetFd) { + if ($targetFd != $fd && in_array($targetFd, $arr)) { + $server->send( + $targetFd, + V3::pack( + [ + 'type' => $data['type'], + 'topic' => $data['topic'], + 'message' => $data['message'], + 'dup' => $data['dup'], + 'qos' => $data['qos'], + 'retain' => $data['retain'], + 'message_id' => $data['message_id'] ?? '', + ] + ) + ); + } + } + + if ($data['qos'] === 1) { + $response = $response->withBody(new SwooleStream(V3::pack( + [ + 'type' => Types::PUBACK, + 'message_id' => $data['message_id'] ?? '', + ] + ))); + } + return $response; + } + + #[MQTTSubscribe()] + public function subscribeHandle(ServerRequestInterface $request, Response $response): Response + { + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $fd = $request->getAttribute('fd'); + $data = $request->getParsedBody(); + $payload = []; + foreach ($data['topics'] as $k => $qos) { + if (is_numeric($qos) && $qos < 3) { + $arr = json_decode($redis->get('MQTT_TOPIC_FDS:' . $k)) ?? []; + if (! in_array($fd, $arr)) { + $arr[] = $fd; + $redis->set('MQTT_TOPIC_FDS:' . $k, json_encode($arr)); + } + $payload[] = $qos; + } else { + $payload[] = 0x80; + } + } + $redis->set('MQTT_CLIENT_FD:' . $fd, time()); + return $response->withBody(new SwooleStream(V3::pack( + [ + 'type' => Types::SUBACK, + 'message_id' => $data['message_id'] ?? '', + 'codes' => $payload, + 'topics' => $data['topics'], + ] + ))); + } + + #[MQTTUnsubscribe()] + public function unsubscribeHandle(ServerRequestInterface $request, Response $response): Response + { + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $fd = $request->getAttribute('fd'); + $data = $request->getParsedBody(); + foreach ($data['topics'] as $k => $qos) { + $arr = json_decode($redis->get('MQTT_TOPIC_FDS:' . $k)) ?? []; + if (in_array($fd, $arr)) { + $arr = array_filter($arr, function ($val) use ($fd) { + return $val != $fd; + }); + $redis->set('MQTT_TOPIC_FDS:' . $k, json_encode($arr)); + } + } + return $response->withBody(new SwooleStream(V3::pack( + [ + 'type' => Types::UNSUBACK, + 'message_id' => $data['message_id'] ?? '', + 'topics' => $data['topics'], + ] + ))); + } + + #[MQTTDisconnect()] + public function disconnectHandle(ServerRequestInterface $request, Response $response): Response + { + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $fd = $request->getAttribute('fd'); + $redis->del('MQTT_CLIENT_FD:' . $fd); + return $response->withAttribute('closed', true); + } +} diff --git a/app/Exception/Handler/AppExceptionHandler.php b/app/Exception/Handler/AppExceptionHandler.php new file mode 100644 index 0000000..3cb4de6 --- /dev/null +++ b/app/Exception/Handler/AppExceptionHandler.php @@ -0,0 +1,30 @@ +logger->error(sprintf('%s[%s] in %s', $throwable->getMessage(), $throwable->getLine(), $throwable->getFile())); + $this->logger->error($throwable->getTraceAsString()); + return $response->withHeader('Server', 'leapy')->withStatus(500)->withBody(new SwooleStream(json_encode(['code'=>2,'msg'=>"服务器内部错误"]))); + } + + public function isValid(Throwable $throwable): bool + { + return true; + } +} diff --git a/app/Exception/Handler/DbQueryExceptionHandle.php b/app/Exception/Handler/DbQueryExceptionHandle.php new file mode 100644 index 0000000..cf58f9e --- /dev/null +++ b/app/Exception/Handler/DbQueryExceptionHandle.php @@ -0,0 +1,43 @@ + + */ + +namespace App\Exception\Handler; + +use App\Service\Log; +use App\Service\QueueService; +use Hyperf\Contract\StdoutLoggerInterface; +use Hyperf\Di\Annotation\Inject; +use Hyperf\ExceptionHandler\ExceptionHandler; +use Hyperf\HttpMessage\Stream\SwooleStream; +use Psr\Http\Message\ResponseInterface; +use Throwable; +use function Hyperf\Support\env; + +/** + * + * Author: cfn + */ +class DbQueryExceptionHandle extends ExceptionHandler +{ + public function __construct(protected StdoutLoggerInterface $logger) + { + } + + /** + * Author: cfn + * @param Throwable $throwable + * @param ResponseInterface $response + * @return ResponseInterface + */ + public function handle(Throwable $throwable, ResponseInterface $response) + { + return $response->withHeader('Server', 'leapy')->withStatus(500)->withBody(new SwooleStream(json_encode(['code'=>2,'msg'=>"SQL语句存在错误,请联系服务商"]))); + } + + public function isValid(Throwable $throwable): bool + { + return $throwable instanceof \Hyperf\Database\Exception\QueryException; + } +} \ No newline at end of file diff --git a/app/Exception/Handler/RateLimitExceptionHandle.php b/app/Exception/Handler/RateLimitExceptionHandle.php new file mode 100644 index 0000000..9c1edef --- /dev/null +++ b/app/Exception/Handler/RateLimitExceptionHandle.php @@ -0,0 +1,31 @@ + + */ + +namespace App\Exception\Handler; + +use Hyperf\Contract\StdoutLoggerInterface; +use Hyperf\ExceptionHandler\ExceptionHandler; +use Hyperf\HttpMessage\Stream\SwooleStream; +use Psr\Http\Message\ResponseInterface; +use Throwable; + +class RateLimitExceptionHandle extends ExceptionHandler +{ + public function __construct(protected StdoutLoggerInterface $logger) + { + } + + public function handle(Throwable $throwable, ResponseInterface $response) + { + $this->logger->error(sprintf('%s[%s] in %s', $throwable->getMessage(), $throwable->getLine(), $throwable->getFile())); + $this->logger->error($throwable->getTraceAsString()); + return $response->withHeader('Server', 'leapy')->withStatus(500)->withBody(new SwooleStream(json_encode(['code'=>2,'msg'=>"触发服务器限流,请稍后重试"]))); + } + + public function isValid(Throwable $throwable): bool + { + return $throwable instanceof \Hyperf\RateLimit\Exception\RateLimitException; + } +} \ No newline at end of file diff --git a/app/Exception/Handler/ValidationExceptionHandler.php b/app/Exception/Handler/ValidationExceptionHandler.php new file mode 100644 index 0000000..94fdbfb --- /dev/null +++ b/app/Exception/Handler/ValidationExceptionHandler.php @@ -0,0 +1,43 @@ +stopPropagation(); + $keys = $throwable->validator->errors()->keys(); + if (count($keys) > 0) { + $msg = $keys[0] . str_replace("validation", "", $throwable->validator->errors()->first($keys[0])); + } else { + $msg = $throwable->validator->errors()->first(); + } + return $response->withStatus(200)->withBody(new SwooleStream(json_encode(['code'=>2,'msg'=>$msg]))); + } + + /** + * 验证之后 + * @param Throwable $throwable + * @return bool + */ + public function isValid(Throwable $throwable): bool + { + return $throwable instanceof ValidationException; + } +} diff --git a/app/Kernel/Annotation/PreAuthorization.php b/app/Kernel/Annotation/PreAuthorization.php new file mode 100644 index 0000000..7305610 --- /dev/null +++ b/app/Kernel/Annotation/PreAuthorization.php @@ -0,0 +1,19 @@ +request = $request; + $this->response = $response; + } + + /** + * @param ProceedingJoinPoint $proceedingJoinPoint + * @return mixed|\Psr\Http\Message\ResponseInterface + * @throws AnnotationException + * @throws \Hyperf\Di\Exception\Exception + */ + public function process(ProceedingJoinPoint $proceedingJoinPoint) + { + // 切面切入后,执行对应的方法会由此来负责 + $authorization = $this->getAuthorizationAnnotation($proceedingJoinPoint); + $isLogin = $this->request->getAttribute("isLogin", false); + if ($authorization->needLogin && !$isLogin) { + return $this->response->json(['code' => 1, 'msg' => '登录已过期']); + } + $admin = $this->request->getAttribute("account"); + if ($authorization->needLogin && $authorization->needAuth) { + if (!$isLogin || empty($admin) || !$this->checkPermission($authorization->auth, $this->request->getMethod(), $admin)) { + return $this->response->json(['code' => 2, 'msg' => '权限不足']); + } + // 再次校验接口权限 + if ("*" != $authorization->role && !$this->checkRole($authorization->role, $admin)) { + return $this->response->json(['code' => 2, 'msg' => '权限不足-1']); + } + } + $response = $proceedingJoinPoint->process(); +// // 记录日志 +// if (config("app.log") && $isLogin && !empty($admin) && $authorization->needLog && $authorization->auth != "*") { +// AccountLog::record($this->request, $admin, $authorization->auth, $response); +// } + return $response; + } + + /** + * desc: 获取注解类 + * @param ProceedingJoinPoint $proceedingJoinPoint + * @return PreAuthorization + * @throws AnnotationException + */ + protected function getAuthorizationAnnotation(ProceedingJoinPoint $proceedingJoinPoint): PreAuthorization + { + $annotation = $proceedingJoinPoint->getAnnotationMetadata()->method[PreAuthorization::class] ?? null; + if (!$annotation instanceof PreAuthorization) { + throw new AnnotationException("Annotation PreAuthorization couldn't be collected successfully."); + } + return $annotation; + } + + /** + * desc: 校验操作权限 + * @param string $auth + * @param string $method + * @param array $account + * @return bool + */ + protected function checkPermission(string $auth, string $method, array $account): bool + { + return Account::checkAuth($account, $method, $auth); + } + + /** + * @param string $role + * @param array $admin + * @return bool + */ + private function checkRole(string $role, array $admin): bool + { + $keys = []; + $roles = ['ADMIN' => 0, 'ORG' => 1]; + foreach (explode(",", $role) as $key) { + $keys[] = $roles[$key]; + } + return in_array($admin['account_type'], $keys); + } +} diff --git a/app/Kernel/Middleware/CorsMiddleware.php b/app/Kernel/Middleware/CorsMiddleware.php new file mode 100644 index 0000000..ec97eb4 --- /dev/null +++ b/app/Kernel/Middleware/CorsMiddleware.php @@ -0,0 +1,36 @@ +withHeader('Access-Control-Allow-Origin', '*') + ->withHeader('Access-Control-Allow-Credentials', 'true') + ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS') + ->withHeader('Access-Control-Allow-Headers', 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With'); + Context::set(ResponseInterface::class, $response); + if ($request->getMethod() == 'OPTIONS') { + return $response; + } + return $handler->handle($request); + } +} diff --git a/app/Kernel/Middleware/JWTMiddleware.php b/app/Kernel/Middleware/JWTMiddleware.php new file mode 100644 index 0000000..b87265c --- /dev/null +++ b/app/Kernel/Middleware/JWTMiddleware.php @@ -0,0 +1,53 @@ +container = $container; + } + + /** + * 登录状态校验 + * @param ServerRequestInterface $request + * @param RequestHandlerInterface $handler + * @return ResponseInterface + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + // 登录权限校验 + $request = $request->withAttribute("isLogin", false); + try { + $token = $request->getHeaderLine("Authorization",""); + $result = Account::checkToken(str_replace("Bearer ","", $token)); + if ($result) { + // 是否登录 + $request = $request->withAttribute("isLogin",true); + // 账号信息 + $request = $request->withAttribute("account", $result); + } + }catch (\Exception $exception){ + var_dump($exception->getMessage()); + } + // 上下文中记录账号信息 + Context::set(ServerRequestInterface::class, $request); + return $handler->handle($request); + } +} diff --git a/app/Kernel/Param.php b/app/Kernel/Param.php new file mode 100644 index 0000000..30c31f0 --- /dev/null +++ b/app/Kernel/Param.php @@ -0,0 +1,27 @@ + + */ + +namespace App\Kernel; + +class Param +{ + /** + * @param array $data + * @param array $param + * @return array + */ + static function only(array $data, array $param): array + { + $_arr = []; + foreach ($data as $k => $v) { + if (gettype($k) == "integer") { + isset($param[$v]) && $_arr[$v] = $param[$v]; + } else { + $_arr[$k] = $param[$k] ?? $v; + } + } + return $_arr; + } +} \ No newline at end of file diff --git a/app/Kernel/Str.php b/app/Kernel/Str.php new file mode 100644 index 0000000..ac2cad4 --- /dev/null +++ b/app/Kernel/Str.php @@ -0,0 +1,133 @@ + + */ + +namespace App\Kernel; + +use Hyperf\HttpServer\Contract\RequestInterface; +use function Hyperf\Config\config; + +class Str +{ + /** + * 获取UUID + * @param string $prefix + * @return string + */ + static function uuid(string $prefix = ''): string + { + $chars = md5(uniqid(mt_rand(), true)); + $uuid = substr($chars, 0, 8) . '-'; + $uuid .= substr($chars, 8, 4) . '-'; + $uuid .= substr($chars, 12, 4) . '-'; + $uuid .= substr($chars, 16, 4) . '-'; + $uuid .= substr($chars, 20, 12); + return $prefix . $uuid; + } + + /** + * 公钥加密 + * Author: cfn + * @param $data + * @return string + */ + public static function public_encrypt($data) + { + $pubKey = "-----BEGIN PUBLIC KEY-----\n" . + wordwrap(config("app.public"), 64, "\n", true) . + "\n-----END PUBLIC KEY-----"; + openssl_public_encrypt($data, $encrypted, $pubKey); + return base64_encode($encrypted); + } + + /** + * 私钥解密 + * Author: cfn + * @param $data + * @return string + */ + public static function private_decrypt($data) + { + $priKey = "-----BEGIN PRIVATE KEY-----\n" . + wordwrap(config("app.private"), 64, "\n", true) . + "\n-----END PRIVATE KEY-----"; + openssl_private_decrypt(base64_decode($data), $decrypted, $priKey); + return $decrypted; + } + + /** + * 加密 + * Author: cfn + * @param $data + * @return string + */ + public static function encrypt($data) + { + return base64_encode(openssl_encrypt($data,"DES-ECB",config("app.key"))); + } + + /** + * 解密 + * Author: cfn + * @param $data + * @return false|string + */ + public static function decrypt($data) + { + return openssl_decrypt(base64_decode($data),"DES-ECB",config("app.key")); + } + + /** + * 获取随机字符串 + * @param int $num + * @param string $prefix + * @return string + */ + static function randStr(int $num, string $prefix = ""): string + { + $str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + $_str = ""; + while ($num > 0) { + $_str .= substr($str, rand(0, strlen($str) - 1), 1); + $num--; + } + return $prefix . $_str; + } + + /** + * @param int $num + * @param string $prefix + * @return string + */ + static function randInt(int $num, string $prefix = ""): string + { + $str = "1234567890"; + $_str = ""; + while ($num > 0) { + $_str .= substr($str, rand(0, strlen($str) - 1), 1); + $num--; + } + return $prefix . $_str; + } + + /** + * 返回ip + * @param RequestInterface $request + * @return string + */ + static function ip(RequestInterface $request): string + { + $res = $request->getHeaders(); + if (isset($res['http_client_ip'])) { + return $res['http_client_ip'][0]; + } elseif (isset($res['x-real-ip'])) { + return $res['x-real-ip'][0]; + } elseif (isset($res['x-forwarded-for'])) { + return $res['x-forwarded-for'][0]; + } else { + $serverParams = $request->getServerParams(); + return $serverParams['remote_addr'][0]; + } + } +} \ No newline at end of file diff --git a/app/Kernel/Token.php b/app/Kernel/Token.php new file mode 100644 index 0000000..0e3b56f --- /dev/null +++ b/app/Kernel/Token.php @@ -0,0 +1,51 @@ + + */ + +namespace App\Kernel; + +use function Hyperf\Config\config; + +use Firebase\JWT\JWT; +use Firebase\JWT\Key; + +class Token +{ + /** + * 生成token + * Author: cfn + * @param $data + * @param $expireIn + * @return string + */ + static function buildToken($data, $expireIn): string + { + $payload = [ + 'iss' => config("app.iss"), + 'aud' => config("app.aud"), + 'iat' => time(), + 'exp' => time() + $expireIn, + 'data' => $data + ]; + $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap(config('app.private'), 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; + return JWT::encode($payload, $privateKey, 'RS256'); + } + + /** + * 解析token + * Author: cfn + * @param $token + * @return array|string + */ + static function parseToken($token) + { + try { + $publicKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap(config('app.public'), 64, "\n", true) . "\n-----END PUBLIC KEY-----"; + $decoded = JWT::decode($token, new Key($publicKey, 'RS256')); + $decoded_array = (array)$decoded; + return (array)$decoded_array['data']; + } catch (\Exception $exception){} + return ""; + } +} \ No newline at end of file diff --git a/app/Listener/DbQueryExecutedListener.php b/app/Listener/DbQueryExecutedListener.php new file mode 100644 index 0000000..5804bb7 --- /dev/null +++ b/app/Listener/DbQueryExecutedListener.php @@ -0,0 +1,66 @@ +logger = $container->get(LoggerFactory::class)->get('sql'); + } + + public function listen(): array + { + return [ + QueryExecuted::class, + ]; + } + + /** + * @param QueryExecuted $event + */ + public function process(object $event): void + { + if ($event instanceof QueryExecuted) { + $sql = $event->sql; + if (! Arr::isAssoc($event->bindings)) { + $position = 0; + foreach ($event->bindings as $value) { + $position = strpos($sql, '?', $position); + if ($position === false) { + break; + } + $value = "'{$value}'"; + $sql = substr_replace($sql, $value, $position, 1); + $position += strlen($value); + } + } + + $this->logger->info(sprintf('[%s] %s', $event->time, $sql)); + } + } +} diff --git a/app/Listener/ResumeExitCoordinatorListener.php b/app/Listener/ResumeExitCoordinatorListener.php new file mode 100644 index 0000000..eff2e0b --- /dev/null +++ b/app/Listener/ResumeExitCoordinatorListener.php @@ -0,0 +1,35 @@ +resume(); + } +} diff --git a/app/Model/Account.php b/app/Model/Account.php new file mode 100644 index 0000000..2d30166 --- /dev/null +++ b/app/Model/Account.php @@ -0,0 +1,251 @@ + 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'dept_id' => 'integer', 'master_flag' => 'integer', 'status' => 'integer', 'del_flag' => 'integer']; + + /** + * 通过id获取账号信息 + * Author: cfn + * @param int $account_id + */ + public static function getById(int $account_id, array $field = ['*']) + { + return self::where("del_flag", 0) + ->where("account_id", $account_id) + ->first($field); + } + + /** + * 通过用户名获取账号信息 + * Author: cfn + * @param string $username + */ + public static function getByUsername(string $username) + { + return self::where("del_flag", 0) + ->where("username", $username) + ->first(['account_id', 'account_type', 'belong_id', 'password', 'master_flag', 'status', 'salt']); + } + + /** + * 通过id获取账号信息 + * Author: cfn + * @param int $account_id + */ + public static function getByAccountId(int $account_id) + { + return self::where("del_flag", 0) + ->where("account_id", $account_id) + ->first(['account_id', 'account_type', 'belong_id', 'master_flag', 'status', 'create_time', 'username', 'avatar']); + } + + /** + * 保存信息 + * Author: cfn + * @param int $account_id + * @param array $param + * @return int + */ + public static function saveInfo(int $account_id, array $param) + { + $param['update_time'] = date("Y-m-d H:i:s"); + return self::where("del_flag", 0) + ->where("account_id", $account_id) + ->update($param); + } + + /** + * @param $param + * @return \Hyperf\Contract\LengthAwarePaginatorInterface + */ + static function list($account, $param) + { + $model = self::where('del_flag', 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']); + if (isset($param['username']) && $param['username'] != '') { + $model = $model->where('username', "like", "%$param[username]%"); + } + if (isset($param['dept_id']) && $param['dept_id'] != '') { + $model = $model->where('dept_id', $param['dept_id']); + } + $paginate = $model->orderByDesc("account_id") + ->paginate((int)$param['limit'], ['account_id', 'username', 'avatar', 'create_time', 'dept_id'], 'page', (int)$param['page']); + foreach ($paginate->items() as &$item) { + $item['roles'] = AccountRole::getRole($item['account_id']); + } + return $paginate; + } + + /** + * 添加 + * @param array $data + * @return bool + */ + public static function add($account, array $data) + { + $data['account_type'] = $account['account_type']; + $data['belong_id'] = $account['belong_id']; + $data['create_time'] = date("Y-m-d H:i:s"); + $data['del_flag'] = 0; + $data['salt'] = Str::randStr(6); + $data['password'] = md5($data['salt'] . $data['password']); + $roles = $data['roles']; + unset($data['roles']); + Db::beginTransaction(); + $account_id = self::insertGetId($data); + if (!$account_id) { + Db::rollBack(); + return false; + } + $account_role = []; + foreach ($roles as $role_id) { + $account_role[] = ['role_id' => $role_id, 'account_id' => $account_id]; + } + if (!empty($account_role)) { + $res = AccountRole::insert($account_role); + if (!$res) { + Db::rollBack(); + return false; + } + } + Db::commit(); + return true; + } + + /** + * 修改 + * @param array $account + * @param array $data + * @return bool + */ + public static function edit(array $account, array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + if ($data['password'] != '') { + $data['salt'] = Str::randStr(6); + $data['password'] = md5($data['salt'] . $data['password']); + }else{ + unset($data['password']); + } + $roles = $data['roles']; + unset($data['roles']); + Db::beginTransaction(); + $res = self::where("account_id", $data['account_id']) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->where('del_flag', 0) + ->update($data); + if (!$res) { + Db::rollBack(); + return false; + } + // 删除之前的 + $res1 = AccountRole::where('account_id', $data['account_id'])->delete(); + if (!$res1) { + Db::rollBack(); + return false; + } + $account_role = []; + foreach ($roles as $role_id) { + $account_role[] = ['role_id' => $role_id, 'account_id' => $data['account_id']]; + } + // 重新添加 + if (!empty($account_role)) { + if (!AccountRole::insert($account_role)) { + Db::rollBack(); + return false; + } + } + Db::commit(); + return true; + } + + /** + * 删除 + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids) + { + return self::whereIn('account_id', explode(",", $ids)) + ->where("del_flag", 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } + + /** + * Author: cfn + * @param array $account + * @param string $method + * @param string $auth + * @return bool + */ + public static function checkAuth(array $account, string $method, string $auth) + { + return Menu::where("del_flag", 0) + ->where("account_type", $account['account_type']) + ->where("method", $method) + ->where("flag", $auth) + ->where("type", 2) + ->exists(); + } + + /** + * Author: cfn + * @param $token + * @return false|mixed + */ + public static function checkToken($token) + { + $tokenData = Token::parseToken($token); + if (empty($tokenData)) return false; + $container = ApplicationContext::getContainer(); + $redis = $container->get(\Hyperf\Redis\Redis::class); + $data = $redis->get($tokenData['key']); + if (!$data) return false; + return json_decode(Str::private_decrypt($data), true); + } +} diff --git a/app/Model/AccountRole.php b/app/Model/AccountRole.php new file mode 100644 index 0000000..2ab041d --- /dev/null +++ b/app/Model/AccountRole.php @@ -0,0 +1,37 @@ + 'integer', 'role_id' => 'integer']; + + public static function getRole(int $account_id) + { + return Db::table("account_role") + ->leftJoin('role', 'role.role_id', '=', 'account_role.role_id') + ->where('account_role.account_id', $account_id) + ->select(["role.role_id","role.role_name"])->get()->toArray(); + } +} diff --git a/app/Model/App.php b/app/Model/App.php new file mode 100644 index 0000000..075b4f6 --- /dev/null +++ b/app/Model/App.php @@ -0,0 +1,85 @@ + 'integer', 'org_id' => 'integer', 'del_flag' => 'integer', 'status' => 'integer']; + + /** + * Author: cfn + * @param array $account + * @param array $param + * @return \Hyperf\Contract\LengthAwarePaginatorInterface + */ + public static function list(array $account, array $param) + { + $model = self::where("del_flag", 0) + ->where("org_id", $account['belong_id']); + + foreach (['app_name'] as $k) { + if (isset($param[$k]) && $param[$k] != '') { + $model = $model->where($k, "like", "%$param[$k]%"); + } + } + + return $model->orderByDesc("app_id") + ->paginate((int)$param['limit'], ["app_id", "app_name", "app_code", "app_key", "create_time", 'status'], 'page', (int)$param['page']); + } + + /** + * Author: cfn + * @param array $account + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids): int + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->whereIn("app_id", explode(",", $ids)) + ->update([ + 'del_flag' => 1, + 'update_time' => date("Y-m-d H:i:s") + ]); + } + + /** + * Author: cfn + * @param array $account + * @return array + */ + public static function options(array $account): array + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->select(["app_id", "app_name"]) + ->get() + ->toArray(); + } +} diff --git a/app/Model/Cron.php b/app/Model/Cron.php new file mode 100644 index 0000000..f8ffbac --- /dev/null +++ b/app/Model/Cron.php @@ -0,0 +1,32 @@ + 'integer', 'org_id' => 'integer', 'status' => 'integer', 'del_flag' => 'integer']; +} diff --git a/app/Model/Dept.php b/app/Model/Dept.php new file mode 100644 index 0000000..4e694db --- /dev/null +++ b/app/Model/Dept.php @@ -0,0 +1,119 @@ + 'integer', 'parent_id' => 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'rank' => 'integer', 'status' => 'integer', 'del_flag' => 'integer']; + + /** + * 部门列表 + * @param array $account + * @param $param + * @return array + */ + static function depts(array $account, $param): array + { + return self::where('del_flag', 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->when(isset($param['dept_name']) && $param['dept_name'] != "", function ($query) use ($param) { + $query->where('dept_name', "like", "%{$param['dept_name']}%"); + })->orderByDesc("rank") + ->select(["dept_id", "parent_id", "dept_name", "rank", "status", "remark", "create_time"]) + ->get()->toArray(); + } + + /** + * 添加 + * @param array $data + * @return bool + */ + public static function add(array $account, array $data) + { + $data['account_type'] = $account['account_type']; + $data['belong_id'] = $account['belong_id']; + $data['create_time'] = date("Y-m-d H:i:s"); + $data['del_flag'] = 0; + return self::insert($data); + } + + /** + * 修改 + * Author: cfn + * @param array $account + * @param array $data + * @return int + */ + public static function edit(array $account, array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + return self::where("dept_id", $data['dept_id']) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->where('del_flag', 0) + ->update($data); + } + + /** + * 删除 + * @param array $account + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids) + { + return self::whereIn('dept_id', explode(",", $ids)) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->where('del_flag', 0) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } + + /** + * 选项 + * @param array $account + * @return array + */ + public static function options(array $account): array + { + return self::where('del_flag', 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->orderByDesc("rank") + ->select(["dept_id", "parent_id", "dept_name"]) + ->get()->toArray(); + } + +} diff --git a/app/Model/Device.php b/app/Model/Device.php new file mode 100644 index 0000000..0ee0368 --- /dev/null +++ b/app/Model/Device.php @@ -0,0 +1,79 @@ + 'integer', 'org_id' => 'integer', 'status' => 'integer', 'del_flag' => 'integer']; + + public static function pages(array $param) + { + $model = self::from("device as d") + ->leftJoin("group as g", "g.group_id", "=", "d.group_id") + ->leftJoin("app as a", "a.app_id", "=", "d.app_id") + ->where("d.del_flag", 0); + foreach (['device_sn'] as $k) { + if (isset($param[$k]) && $param[$k] != "") { + $model = $model->where("d." . $k, "like", "%{$param[$k]}%"); + } + } + foreach (['org_id', 'status', 'group_id', 'app_id'] as $k) { + if (isset($param[$k]) && $param[$k] != "") { + $model = $model->where("d." . $k, $param[$k]); + } + } + return $model->orderByDesc("d.device_id") + ->paginate((int)$param['limit'], ["d.device_id", "d.device_sn", "d.status", "d.create_time", "g.group_name", "d.group_id", "d.online", "d.app_id", "a.app_name"], 'page', (int)$param['page']); + } + + public static function add(array $data) + { + $data['create_time'] = date("Y-m-d H:i:s"); + $data['del_flag'] = 0; + return self::insert($data); + } + + public static function edit(array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + return self::where("device_id", $data['device_id']) + ->where("org_id", $data['org_id']) + ->where('del_flag', 0) + ->update($data); + } + + public static function del(array $account, $ids) + { + return self::whereIn('device_id', explode(",", $ids)) + ->where("org_id", $account['belong_id']) + ->where('del_flag', 0) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } +} diff --git a/app/Model/DeviceMessage.php b/app/Model/DeviceMessage.php new file mode 100644 index 0000000..ee8dd0d --- /dev/null +++ b/app/Model/DeviceMessage.php @@ -0,0 +1,34 @@ + 'integer', 'org_id' => 'integer', 'msg_type' => 'integer', 'del_flag' => 'integer']; +} diff --git a/app/Model/Group.php b/app/Model/Group.php new file mode 100644 index 0000000..7297cea --- /dev/null +++ b/app/Model/Group.php @@ -0,0 +1,85 @@ + 'integer', 'org_id' => 'integer', 'rank' => 'integer', 'del_flag' => 'integer']; + + /** + * Author: cfn + * @param array $account + * @param array $param + * @return \Hyperf\Contract\LengthAwarePaginatorInterface + */ + public static function list(array $account, array $param) + { + $model = self::where("del_flag", 0) + ->where("org_id", $account['belong_id']); + + foreach (['group_name'] as $k) { + if (isset($param[$k]) && $param[$k] != '') { + $model = $model->where($k, "like", "%$param[$k]%"); + } + } + + return $model->orderByDesc("group_id") + ->paginate((int)$param['limit'], ["group_id", "group_name", "rank", "create_time"], 'page', (int)$param['page']); + } + + /** + * Author: cfn + * @param array $account + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids): int + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->whereIn("group_id", explode(",", $ids)) + ->update([ + 'del_flag' => 1, + 'update_time' => date("Y-m-d H:i:s") + ]); + } + + /** + * Author: cfn + * @param array $account + * @return array + */ + public static function options(array $account): array + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->select(["group_id", "group_name"]) + ->orderByDesc("rank") + ->get() + ->toArray(); + } +} diff --git a/app/Model/Menu.php b/app/Model/Menu.php new file mode 100644 index 0000000..d68c21b --- /dev/null +++ b/app/Model/Menu.php @@ -0,0 +1,199 @@ + 'integer', 'parent_id' => 'integer', 'account_type' => 'integer', 'type' => 'integer', 'rank' => 'integer', 'hidden' => 'integer', 'del_flag' => 'integer']; + + /** + * 获取账号权限 + * Author: cfn + * @param array $account + * @return array + */ + public static function getMenu(array $account): array + { + if ($account['master_flag'] == 1) { + $menus = self::getM($account['account_type']); + $buttons = self::getB($account['account_type']); + $roles = ['MASTER_ACCOUNT']; + } else { + $menus = self::getMByRole($account['account_type'], $account['account_id']); + $buttons = self::getBByRole($account['account_type'], $account['account_id']); + $roles = ['SUB_ACCOUNT']; + } + $roles[] = match ($account['account_type']) { + 0 => "ADMIN", + 1 => "TENANT", + 2 => "PARTNER", + 3 => "MERCHANT" + }; + return compact("menus", "buttons", "roles"); + } + + /** + * Author: cfn + * @param $account_type + * @return array + */ + public static function getM($account_type) + { + return self::from("menu as m") + ->where('m.del_flag', 0) + ->where('m.account_type', $account_type) + ->where('m.type', 0) + ->orderByDesc("m.rank") + ->select(['m.menu_id', 'm.parent_id', 'm.title', 'm.name', 'm.path', 'm.icon', 'm.hidden'])->get()->toArray(); + } + + /** + * Author: cfn + * @param int $accountType + * @param int $accountId + * @return array + */ + private static function getMByRole(int $accountType, int $accountId) + { + return Db::table("account_role as ar") + ->leftJoin("role_menu as rm", "ar.role_id", "=", "rm.role_id") + ->leftJoin("menu as m", "m.menu_id", "=", "rm.menu_id") + ->where("ar.account_id", $accountId) + ->where("m.account_type", $accountType) + ->where("m.type", 0) + ->where("m.del_flag", 0) + ->orderByDesc("rank") + ->select(['m.menu_id', 'm.parent_id', 'm.title', 'm.name', 'm.path', 'm.icon', 'm.hidden'])->get()->toArray(); + } + + /** + * Author: cfn + * @param int $accountType + * @return array + */ + public static function getB(int $accountType): array + { + return self::where('del_flag', 0) + ->where('type', 1) + ->where('account_type', $accountType) + ->pluck('flag')->toArray(); + } + + /** + * Author: cfn + * @param int $accountType + * @param int $accountId + * @return array + */ + private static function getBByRole(int $accountType, int $accountId): array + { + return Db::table("account_role as ar") + ->leftJoin("role_menu as rm", "ar.role_id", "=", "rm.role_id") + ->leftJoin("menu as m", "m.menu_id", "=", "rm.menu_id") + ->where("ar.account_id", $accountId) + ->where("m.account_type", $accountType) + ->where("m.type", 1) + ->where("m.del_flag", 0) + ->pluck('m.flag')->toArray(); + } + + public static function getMenusV1(array $param) + { + return self::where('del_flag', 0) + ->where('account_type', $param['account_type']) + ->orderByDesc("rank") + ->select(["menu_id","title","flag","parent_id","type","method","name","path","icon","rank","hidden","account_type"]) + ->get()->toArray(); + } + + public static function getMenus(array $account) + { + if (in_array($account['account_type'], [1,2,3])) { + return self::from("trade_open as to") + ->leftJoin("trade_menu as tm","tm.trade_id","=","to.trade_id") + ->leftJoin("menu as m", "m.menu_id","=","tm.menu_id") + ->where("tm.account_type", $account['account_type']) + ->where("to.account_type", $account['account_type']) + ->where("to.belong_id", $account['belong_id']) + ->where("to.status",1) + ->where("m.account_type", $account['account_type']) + ->where("m.del_flag",0) + ->groupBy(["m.menu_id"]) + ->select(["m.menu_id","m.title","m.flag","m.parent_id","m.type","m.method","m.name","m.path","m.icon","m.rank","m.hidden","m.account_type"]) + ->get()->toArray(); + }else{ + return self::where('del_flag', 0) + ->where('account_type', $account['account_type']) + ->orderByDesc("rank") + ->select(["menu_id","title","flag","parent_id","type","method","name","path","icon","rank","hidden","account_type"]) + ->get()->toArray(); + } + } + + public static function add(array $data) + { + $data['create_time'] = date("Y-m-d H:i:s"); + $data['del_flag'] = 0; + return self::insertGetId($data); + } + + /** + * 修改 + * @param array $data + * @return bool + */ + public static function edit(array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + return self::where("menu_id", $data['menu_id'])->where('del_flag', 0)->update($data); + } + + /** + * 删除 + * @param string $menu_id + * @return int + */ + public static function del(string $menu_id) + { + return self::whereIn('menu_id', explode(",", $menu_id)) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } +} diff --git a/app/Model/Model.php b/app/Model/Model.php new file mode 100644 index 0000000..4bfcfc8 --- /dev/null +++ b/app/Model/Model.php @@ -0,0 +1,12 @@ + 'integer', 'status' => 'integer', 'del_flag' => 'integer']; + + /** + * Author: cfn + * @param int $belong_id + * @param array $field + * @return array + */ + public static function getById(int $belong_id, array $field=['*']) + { + $info = self::where("del_flag",0) + ->where("org_id",$belong_id) + ->first($field); + return $info ? $info->toArray() : []; + } + + /** + * Author: cfn + * @param array $param + * @return \Hyperf\Contract\LengthAwarePaginatorInterface + */ + public static function list(array $param) + { + $model = self::where('del_flag', 0); + if (isset($param['org_name']) && $param['org_name'] != '') { + $model = $model->where('org_name', "like", "%$param[tenant_name]%"); + } + return $model->orderByDesc("org_id") + ->paginate((int)$param['limit'], ["org_id", "org_name", "org_code","contact_name", + "contact_mobile", "status", "create_time"], 'page', (int)$param['page']); + } + + /** + * Author: cfn + * @param array $param + * @return bool + */ + public static function add(array $param) + { + $param['create_time'] = date("Y-m-d H:i:s"); + $param['del_flag'] = 0; + $password = $param['password']; + $org_code = "20" . date("Y") . Str::randInt(4); + $param['org_code'] = $org_code; + unset($param['password']); + Db::beginTransaction(); + $org_id = self::insertGetId($param); + if (!$org_id) { + Db::rollBack(); + return false; + } + $salt = Str::randStr(6); + $res = Account::insert([ + 'account_type' => 1, + 'belong_id' => $org_id, + 'username' => $org_code, + 'master_flag' => 1, + 'password' => md5($salt . $password), + 'salt' => $salt, + 'create_time' => date("Y-m-d H:i:s") + ]); + if (!$res) { + Db::rollBack(); + return false; + } + Db::commit(); + return true; + } + + /** + * 修改 + * @param array $data + * @return bool + */ + public static function edit(array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + $password = $data['password']; + unset($data['password']); + $info = self::getById($data['org_id']); + if (empty($info)) { + return false; + } + Db::beginTransaction(); + $res = self::where("org_id", $data['org_id'])->where('del_flag', 0)->update($data); + if (!$res) { + Db::rollBack(); + return false; + } + if ($password) { + $salt = Str::randStr(6); + $res1 = Account::where("account_type", 1) + ->where("belong_id", $data['org_id']) + ->where("master_flag", 1) + ->where("username", $info['org_code']) + ->update([ + 'salt' => $salt, + 'password' => md5($salt . $password), + 'update_time' => date("Y-m-d H:i:s") + ]); + if (!$res1) { + Db::rollBack(); + return false; + } + } + Db::commit(); + return true; + } + + /** + * 删除 + * @param string $ids + * @return int + */ + public static function del(string $ids) + { + return self::whereIn('org_id', explode(",", $ids)) + ->where("del_flag", 0) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } + + /** + * 选项 + * @return array + */ + public static function options(): array + { + return self::where('del_flag', 0) + ->select(["org_id","org_name", "org_code"]) + ->get()->toArray(); + } +} diff --git a/app/Model/Role.php b/app/Model/Role.php new file mode 100644 index 0000000..9a7f909 --- /dev/null +++ b/app/Model/Role.php @@ -0,0 +1,170 @@ + 'integer', 'account_type' => 'integer', 'belong_id' => 'integer', 'status' => 'integer', 'del_flag' => 'integer', 'rank' => 'integer']; + + /** + * 部门列表 + * @param array $account + * @param array $param + * @return array + */ + static function roles(array $account, array $param): array + { + $model = self::where('del_flag', 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']); + if (isset($param['role_name']) && $param['role_name'] != '') { + $model = $model->where("role_name", "like", "%{$param['role_name']}%"); + } + return $model->select(["role_id", "role_name", "status", "remark", "create_time", "rank", "checked_menus"]) + ->orderByDesc("rank") + ->orderByDesc("role_id") + ->get()->each(function ($item) { + $item['menus'] = RoleMenu::getMenu($item['role_id']); + })->toArray(); + } + + /** + * 添加 + * @param array $account + * @param array $data + * @return bool + */ + public static function add(array $account, array $data) + { + $data['account_type'] = $account['account_type']; + $data['belong_id'] = $account['belong_id']; + $data['create_time'] = date("Y-m-d H:i:s"); + $data['del_flag'] = 0; + $menus = $data['menus']; + unset($data['menus']); + Db::beginTransaction(); + $role_id = self::insertGetId($data); + if (!$role_id) { + Db::rollBack(); + return false; + } + $role_menu = []; + foreach ($menus as $menu_id) { + $role_menu[] = ['role_id' => $role_id, 'menu_id' => $menu_id]; + } + if (!empty($role_menu)) { + $res = RoleMenu::insert($role_menu); + if (!$res) { + Db::rollBack(); + return false; + } + } + Db::commit(); + return true; + } + + /** + * 修改 + * @param array $account + * @param array $data + * @return bool + */ + public static function edit(array $account, array $data) + { + $data['update_time'] = date("Y-m-d H:i:s"); + $menus = $data['menus']; + unset($data['menus']); + Db::beginTransaction(); + $res = self::where("role_id", $data['role_id']) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->where('del_flag', 0) + ->update($data); + if (!$res) { + Db::rollBack(); + return false; + } + // 删除之前的 + $res1 = RoleMenu::where('role_id', $data['role_id'])->delete(); + if (!$res1) { + Db::rollBack(); + return false; + } + $role_menu = []; + foreach ($menus as $menu_id) { + $role_menu[] = ['role_id' => $data['role_id'], 'menu_id' => $menu_id]; + } + // 重新添加 + if (!empty($role_menu)) { + if (!RoleMenu::insert($role_menu)) { + Db::rollBack(); + return false; + } + } + Db::commit(); + return true; + } + + /** + * 删除 + * @param array $account + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids) + { + return self::whereIn('role_id', explode(",", $ids)) + ->where("del_flag", 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->update([ + 'update_time' => date('Y-m-d H:i:s'), + 'del_flag' => 1 + ]); + } + + /** + * @param array $account + * @return array + */ + public static function options(array $account): array + { + return self::where('del_flag', 0) + ->where('belong_id', $account['belong_id']) + ->where('account_type', $account['account_type']) + ->orderByDesc("rank") + ->orderByDesc("role_id") + ->select(["role_id", "role_name"]) + ->get()->toArray(); + } +} diff --git a/app/Model/RoleMenu.php b/app/Model/RoleMenu.php new file mode 100644 index 0000000..127d252 --- /dev/null +++ b/app/Model/RoleMenu.php @@ -0,0 +1,37 @@ + 'integer', 'menu_id' => 'integer']; + + public static function getMenu(int $role_id) + { + return Db::table("role_menu") + ->leftJoin('menu', 'menu.menu_id', '=', 'role_menu.menu_id') + ->where('role_menu.role_id', $role_id) + ->select(["menu.menu_id", "menu.title"])->get()->toArray(); + } +} diff --git a/app/Model/Topic.php b/app/Model/Topic.php new file mode 100644 index 0000000..e4f8436 --- /dev/null +++ b/app/Model/Topic.php @@ -0,0 +1,85 @@ + 'integer', 'org_id' => 'integer', 'status' => 'integer', 'del_flag' => 'integer']; + + /** + * Author: cfn + * @param array $account + * @param array $param + * @return \Hyperf\Contract\LengthAwarePaginatorInterface + */ + public static function list(array $account, array $param) + { + $model = self::where("del_flag", 0) + ->where("org_id", $account['belong_id']); + + foreach (['topic_name'] as $k) { + if (isset($param[$k]) && $param[$k] != '') { + $model = $model->where($k, "like", "%$param[$k]%"); + } + } + + return $model->orderByDesc("topic_id") + ->paginate((int)$param['limit'], ["topic_id", "topic_name", "topic_code", "create_time", 'status'], 'page', (int)$param['page']); + } + + /** + * Author: cfn + * @param array $account + * @param string $ids + * @return int + */ + public static function del(array $account, string $ids): int + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->whereIn("topic_id", explode(",", $ids)) + ->update([ + 'del_flag' => 1, + 'update_time' => date("Y-m-d H:i:s") + ]); + } + + /** + * Author: cfn + * @param array $account + * @return array + */ + public static function options(array $account): array + { + return self::where("del_flag", 0) + ->where("org_id", $account['belong_id']) + ->select(["topic_id", "topic_name"]) + ->get() + ->toArray(); + } +} diff --git a/app/Request/Account.php b/app/Request/Account.php new file mode 100644 index 0000000..db24adb --- /dev/null +++ b/app/Request/Account.php @@ -0,0 +1,54 @@ + ['username', 'password', 'uuid', 'code'], + 'sy_login' => ['username', 'password'], + 'info' => ['avatar'], + 'add' => ['username'], + 'edit' => ['username','account_id'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'username' => 'required', + 'password' => 'required', + 'uuid' => 'required', + 'code' => 'required', + 'realname' => 'required', + 'avatar' => 'required', + 'account_id' => 'required', + ]; + } + + public function messages(): array + { + return [ + 'code.required' => '验证码必填!', + 'realname.required' => '姓名必填!', + 'avatar.required' => '头像必填!', + ]; + } +} diff --git a/app/Request/App.php b/app/Request/App.php new file mode 100644 index 0000000..598fa8f --- /dev/null +++ b/app/Request/App.php @@ -0,0 +1,45 @@ + + */ + +namespace App\Request; + +use Hyperf\Validation\Request\FormRequest; + +class App extends FormRequest +{ + protected array $scenes = [ + 'add' => ['app_name', 'status', 'config'], + 'edit' => ['app_id', 'app_name', 'status', 'config'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'app_id' => 'required', + 'app_name' => 'required', + 'status' => 'required' + ]; + } + + public function messages(): array + { + return [ + 'app_id.required' => '应用ID必填!', + 'app_name.required' => '应用名称必填!', + 'status.required' => '状态必填!' + ]; + } +} \ No newline at end of file diff --git a/app/Request/Dept.php b/app/Request/Dept.php new file mode 100644 index 0000000..d230fd3 --- /dev/null +++ b/app/Request/Dept.php @@ -0,0 +1,45 @@ + ['parent_id', 'dept_name'], + 'edit' => ['dept_id', 'parent_id', 'dept_name'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'dept_id' => 'required', + 'parent_id' => 'required', + 'dept_name' => 'required' + ]; + } + + public function messages(): array + { + return [ + 'dept_id.required' => '部门ID必填!', + 'parent_id.required' => '上级ID必选!', + 'dept_name.required' => '部门名称必填!' + ]; + } +} diff --git a/app/Request/Menu.php b/app/Request/Menu.php new file mode 100644 index 0000000..e24cf42 --- /dev/null +++ b/app/Request/Menu.php @@ -0,0 +1,49 @@ + ['parent_id', 'title', 'account_type', 'type'], + 'edit' => ['parent_id', 'title', 'account_type', 'type','menu_id'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'menu_id' => 'required', + 'parent_id' => 'required', + 'title' => 'required', + 'account_type' => 'required', + 'type' => 'required' + ]; + } + + public function messages(): array + { + return [ + 'menu_id.required' => '菜单ID必填!', + 'parent_id.required' => '上级ID必选!', + 'title.required' => '菜单名称必填!', + 'account_type.required' => '菜单归属必填!', + 'type.required' => '菜单类型必填!' + ]; + } +} diff --git a/app/Request/Org.php b/app/Request/Org.php new file mode 100644 index 0000000..81405d8 --- /dev/null +++ b/app/Request/Org.php @@ -0,0 +1,46 @@ + ['org_name', 'contact_name', 'contact_mobile', 'status'], + 'edit' => ['org_id', 'org_name', 'contact_name', 'contact_mobile', 'status'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'org_id' => 'required', + 'org_name' => 'required', + 'org_code' => 'required', + 'contact_name' => 'required', + 'contact_mobile' => 'required', + 'status' => 'required', + ]; + } + + public function messages(): array + { + return [ + 'org_id.required' => '请选择租户!', + ]; + } +} diff --git a/app/Request/Role.php b/app/Request/Role.php new file mode 100644 index 0000000..d5f50b4 --- /dev/null +++ b/app/Request/Role.php @@ -0,0 +1,43 @@ + ['role_name'], + 'edit' => ['role_id', 'role_name'], + ]; + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + /** + * Get the validation rules that apply to the request. + */ + public function rules(): array + { + return [ + 'role_id' => 'required', + 'role_name' => 'required' + ]; + } + + public function messages(): array + { + return [ + 'role_id.required' => '角色ID必填!', + 'role_name.required' => '角色名称必填!' + ]; + } +} diff --git a/bin/hyperf.php b/bin/hyperf.php new file mode 100644 index 0000000..20f439a --- /dev/null +++ b/bin/hyperf.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +get(Hyperf\Contract\ApplicationInterface::class); + $application->run(); +})(); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3238829 --- /dev/null +++ b/composer.json @@ -0,0 +1,86 @@ +{ + "name": "hyperf/hyperf-skeleton", + "type": "project", + "keywords": [ + "php", + "swoole", + "framework", + "hyperf", + "microservice", + "middleware" + ], + "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.", + "license": "Apache-2.0", + "require": { + "php": ">=8.1", + "firebase/php-jwt": "^6.10", + "hyperf/async-queue": "^3.1", + "hyperf/cache": "~3.1.0", + "hyperf/command": "~3.1.0", + "hyperf/config": "~3.1.0", + "hyperf/crontab": "^3.1", + "hyperf/database": "~3.1.0", + "hyperf/db-connection": "~3.1.0", + "hyperf/engine": "^2.10", + "hyperf/framework": "~3.1.0", + "hyperf/guzzle": "~3.1.0", + "hyperf/http-server": "~3.1.0", + "hyperf/logger": "~3.1.0", + "hyperf/memory": "~3.1.0", + "hyperf/mqtt-server-incubator": "^0.3.1", + "hyperf/paginator": "^3.1", + "hyperf/process": "~3.1.0", + "hyperf/rate-limit": "^3.1", + "hyperf/redis": "~3.1.0", + "hyperf/validation": "^3.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/devtool": "~3.1.0", + "hyperf/testing": "~3.1.0", + "hyperf/watcher": "^3.1", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "swoole/ide-helper": "^5.0" + }, + "suggest": { + "ext-openssl": "Required to use HTTPS.", + "ext-json": "Required to use JSON.", + "ext-pdo": "Required to use MySQL Client.", + "ext-pdo_mysql": "Required to use MySQL Client.", + "ext-redis": "Required to use Redis Client." + }, + "autoload": { + "psr-4": { + "App\\": "app/" + }, + "files": [] + }, + "autoload-dev": { + "psr-4": { + "HyperfTest\\": "./test/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "extra": [], + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-autoload-dump": [ + "rm -rf runtime/container" + ], + "test": "co-phpunit --prepend test/bootstrap.php --colors=always", + "cs-fix": "php-cs-fixer fix $1", + "analyse": "phpstan analyse --memory-limit 300M", + "start": [ + "Composer\\Config::disableProcessTimeout", + "php ./bin/hyperf.php start" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..346a9a6 --- /dev/null +++ b/composer.lock @@ -0,0 +1,10102 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "a1112ed8e67f292aea6093a2f1ab2b03", + "packages": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/deprecations/1.1.3/doctrine-deprecations-1.1.3.zip", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/lexer/2.1.1/doctrine-lexer-2.1.1.zip", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2024-02-05T11:35:39+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/egulias/email-validator/3.2.6/egulias-email-validator-3.2.6.zip", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2023-06-01T07:04:22+00:00" + }, + { + "name": "fig/http-message-util", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + }, + "time": "2020-11-24T22:02:12+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.1", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "500501c2ce893c824c801da135d02661199f60c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" + }, + "time": "2024-05-18T18:05:11+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-07-18T10:29:17+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "hyperf/async-queue", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/async-queue.git", + "reference": "1cd25666ac1e1f23c9eab6be642e86802a96307b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/async-queue/zipball/1cd25666ac1e1f23c9eab6be642e86802a96307b", + "reference": "1cd25666ac1e1f23c9eab6be642e86802a96307b", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/command": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to dispatch a event.", + "hyperf/logger": "Required to use QueueHandleListener.", + "hyperf/process": "Auto register the consumer process for server." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\AsyncQueue\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\AsyncQueue\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A async queue component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "async-queue", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/cache", + "version": "v3.1.43", + "source": { + "type": "git", + "url": "https://github.com/hyperf/cache.git", + "reference": "1e3cc54cee776c8d32cf40912dee5d366383bc33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/cache/zipball/1e3cc54cee776c8d32cf40912dee5d366383bc33", + "reference": "1e3cc54cee776c8d32cf40912dee5d366383bc33", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "suggest": { + "hyperf/di": "Use cache annotations.", + "hyperf/event": "Use listener to delete annotation cache." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Cache\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A cache component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "cache", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-10-09T10:22:39+00:00" + }, + { + "name": "hyperf/code-parser", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/code-parser.git", + "reference": "81953c4ea9035ac5f0a4740ae157310ca4e18ff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/code-parser/zipball/81953c4ea9035ac5f0a4740ae157310ca4e18ff2", + "reference": "81953c4ea9035ac5f0a4740ae157310ca4e18ff2", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "jean85/pretty-package-versions": "Required to use PrettyVersions. (^1.2|^2.0)", + "nikic/php-parser": "Required to use PhpParser. (^4.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\CodeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A code parser component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "code-parser", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/codec", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/codec.git", + "reference": "effc71c25e2d53c00fcf41da8bca083ac8a0db0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/codec/zipball/effc71c25e2d53c00fcf41da8bca083ac8a0db0e", + "reference": "effc71c25e2d53c00fcf41da8bca083ac8a0db0e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-xml": "*", + "hyperf/contract": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "ext-igbinary": "Required to use IgbinarySerializerPacker." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Codec\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A codec component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "codec", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/collection", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/collection.git", + "reference": "492fa8100a3fce57406f9940878f3484036a8ebb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/collection/zipball/492fa8100a3fce57406f9940878f3484036a8ebb", + "reference": "492fa8100a3fce57406f9940878f3484036a8ebb", + "shasum": "" + }, + "require": { + "hyperf/conditionable": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Collection package which come from illuminate/collections", + "homepage": "https://hyperf.io", + "keywords": [ + "collection", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/command", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/command.git", + "reference": "43047270c15bce06e19d217dc5ba02b284830e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/command/zipball/43047270c15bce06e19d217dc5ba02b284830e25", + "reference": "43047270c15bce06e19d217dc5ba02b284830e25", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1", + "psr/event-dispatcher": "^1.0", + "symfony/console": "^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to use listeners." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Command\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Command\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Command for hyperf", + "keywords": [ + "command", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/command/issues", + "source": "https://github.com/hyperf/command/tree/v3.1.42" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/conditionable", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/conditionable.git", + "reference": "dec9dec9dbde14e20f3d7ba000c3302381019de1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/conditionable/zipball/dec9dec9dbde14e20f3d7ba000c3302381019de1", + "reference": "dec9dec9dbde14e20f3d7ba000c3302381019de1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Conditionable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/conditionable", + "homepage": "https://hyperf.io", + "keywords": [ + "conditionable", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/config", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/config.git", + "reference": "1df5e310aab752d6195f89f5cc98daf3cdc4bb6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/config/zipball/1df5e310aab752d6195f89f5cc98daf3cdc4bb6e", + "reference": "1df5e310aab752d6195f89f5cc98daf3cdc4bb6e", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "symfony/finder": "^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "hyperf/context": "Required to use config()", + "hyperf/di": "Allows using @Value annotation", + "hyperf/event": "Allows using @Value annotation", + "hyperf/framework": "Allows using @Value annotation", + "vlucas/phpdotenv": "Allows using enviroment value to override the config" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Config\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "./src/Functions.php" + ], + "psr-4": { + "Hyperf\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that provides configuration container.", + "homepage": "https://hyperf.io", + "keywords": [ + "config", + "configuration", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/context", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/context.git", + "reference": "ac666862d644db7d813342c880826a1fda599bdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/context/zipball/ac666862d644db7d813342c880826a1fda599bdf", + "reference": "ac666862d644db7d813342c880826a1fda599bdf", + "shasum": "" + }, + "require": { + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "suggest": { + "swow/psr7-plus": "Required to use RequestContext and ResponseContext" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Context\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine/application context library.", + "homepage": "https://hyperf.io", + "keywords": [ + "Context", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/contract", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/contract.git", + "reference": "6ef2c7f98917c52ccda3a37ae65b190848dde6c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/contract/zipball/6ef2c7f98917c52ccda3a37ae65b190848dde6c4", + "reference": "6ef2c7f98917c52ccda3a37ae65b190848dde6c4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The contracts of Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/coordinator", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coordinator.git", + "reference": "a0497d2a260f166ab53fed2eca6bb4e48b49ef56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coordinator/zipball/a0497d2a260f166ab53fed2eca6bb4e48b49ef56", + "reference": "a0497d2a260f166ab53fed2eca6bb4e48b49ef56", + "shasum": "" + }, + "require": { + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Coordinator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coordinator", + "homepage": "https://hyperf.io", + "keywords": [ + "Coordinator", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/coroutine", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coroutine.git", + "reference": "1dd56202a97bce60df644ea1a8c87ea7a0888a08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coroutine/zipball/1dd56202a97bce60df644ea1a8c87ea7a0888a08", + "reference": "1dd56202a97bce60df644ea1a8c87ea7a0888a08", + "shasum": "" + }, + "require": { + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Coroutine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coroutine", + "homepage": "https://hyperf.io", + "keywords": [ + "coroutine", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/crontab", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/crontab.git", + "reference": "be1187515aabbfe96b2f6a5330b4ddd742e971c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/crontab/zipball/be1187515aabbfe96b2f6a5330b4ddd742e971c7", + "reference": "be1187515aabbfe96b2f6a5330b4ddd742e971c7", + "shasum": "" + }, + "require": { + "hyperf/conditionable": "~3.1.0", + "hyperf/framework": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/utils": "~3.1.0", + "nesbot/carbon": "^2.0", + "php": ">=8.1" + }, + "suggest": { + "hyperf/command": "Required to use command trigger.", + "hyperf/process": "Auto register the Crontab process for server." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Crontab\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Crontab\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A crontab component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "crontab", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/database", + "version": "v3.1.43", + "source": { + "type": "git", + "url": "https://github.com/hyperf/database.git", + "reference": "197ca2a237d3172a358d40a6940a8dd659e350e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/database/zipball/197ca2a237d3172a358d40a6940a8dd659e350e6", + "reference": "197ca2a237d3172a358d40a6940a8dd659e350e6", + "shasum": "" + }, + "require": { + "hyperf/code-parser": "~3.1.0", + "hyperf/collection": "~3.1.23", + "hyperf/conditionable": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/utils": "~3.1.0", + "nesbot/carbon": "^2.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns (^3.0).", + "hyperf/paginator": "Required to paginate the result set (~3.1.0).", + "nikic/php-parser": "Required to use ModelCommand. (^4.0)", + "php-di/phpdoc-reader": "Required to use ModelCommand. (^2.2)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Database\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A flexible database library.", + "homepage": "https://hyperf.io", + "keywords": [ + "database", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-26T13:01:25+00:00" + }, + { + "name": "hyperf/db-connection", + "version": "v3.1.43", + "source": { + "type": "git", + "url": "https://github.com/hyperf/db-connection.git", + "reference": "25e9fb4343d5c9b235f1a53d13e3a0cc3c42dc2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/db-connection/zipball/25e9fb4343d5c9b235f1a53d13e3a0cc3c42dc2c", + "reference": "25e9fb4343d5c9b235f1a53d13e3a0cc3c42dc2c", + "shasum": "" + }, + "require": { + "hyperf/database": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/framework": "~3.1.0", + "hyperf/model-listener": "~3.1.0", + "hyperf/pool": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\DbConnection\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\DbConnection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A hyperf db connection handler for hyperf/database.", + "homepage": "https://hyperf.io", + "keywords": [ + "Connection", + "database", + "hyperf", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-26T13:01:25+00:00" + }, + { + "name": "hyperf/di", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/di.git", + "reference": "72b65de5022e3dca79ae1902c058048b9519aa72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/di/zipball/72b65de5022e3dca79ae1902c058048b9519aa72", + "reference": "72b65de5022e3dca79ae1902c058048b9519aa72", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/pipeline": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "nikic/php-parser": "^4.1", + "php": ">=8.1", + "php-di/phpdoc-reader": "^2.2", + "psr/container": "^1.0 || ^2.0", + "symfony/finder": "^5.0 || ^6.0 || ^7.0", + "vlucas/phpdotenv": "^5.0" + }, + "suggest": { + "ext-pcntl": "Required to scan annotations.", + "hyperf/config": "Require this component for annotation scan progress to retrieve the scan path." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Di\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A DI for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "annotation", + "di", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/dispatcher", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/dispatcher.git", + "reference": "5cbdfd586bb8c3bbbabed5a23cec7faf52b744b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/5cbdfd586bb8c3bbbabed5a23cec7faf52b744b0", + "reference": "5cbdfd586bb8c3bbbabed5a23cec7faf52b744b0", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-middleware": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Dispatcher\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Dispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "dispatcher", + "filter", + "hyperf", + "middleware", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/engine", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine.git", + "reference": "26e0b65fc2a63a00266e7124e221c6f3fb2c8e95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine/zipball/26e0b65fc2a63a00266e7124e221c6f3fb2c8e95", + "reference": "26e0b65fc2a63a00266e7124e221c6f3fb2c8e95", + "shasum": "" + }, + "require": { + "hyperf/engine-contract": "~1.10.0", + "php": ">=8.0" + }, + "conflict": { + "ext-swoole": "<5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/guzzle": "^3.0", + "hyperf/http-message": "^3.0", + "mockery/mockery": "^1.5", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.4", + "swoole/ide-helper": "5.*" + }, + "suggest": { + "ext-sockets": "*", + "ext-swoole": ">=5.0", + "hyperf/http-message": "Required to use ResponseEmitter.", + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.11-dev" + }, + "hyperf": { + "config": "Hyperf\\Engine\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Engine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Coroutine engine provided by swoole.", + "keywords": [ + "engine", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/engine/issues", + "source": "https://github.com/hyperf/engine/tree/v2.11.0" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-04-17T13:36:28+00:00" + }, + { + "name": "hyperf/engine-contract", + "version": "v1.10.1", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine-contract.git", + "reference": "2714a8ba6d6b916e5bd373ff680df9569a4c9eef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/2714a8ba6d6b916e5bd373ff680df9569a4c9eef", + "reference": "2714a8ba6d6b916e5bd373ff680df9569a4c9eef", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0", + "psr/http-message": "^1.0", + "swoole/ide-helper": "^4.5" + }, + "suggest": { + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Engine\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contract for Coroutine Engine", + "keywords": [ + "contract", + "coroutine", + "engine", + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/engine-contract/issues", + "source": "https://github.com/hyperf/engine-contract/tree/v1.10.1" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-04-17T13:34:51+00:00" + }, + { + "name": "hyperf/event", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/event.git", + "reference": "2b5fbbc94674a1a5e1622896eb3f7ecc80aa38c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/event/zipball/2b5fbbc94674a1a5e1622896eb3f7ecc80aa38c4", + "reference": "2b5fbbc94674a1a5e1622896eb3f7ecc80aa38c4", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "php": ">=8.1", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotatioins." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Event\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "an event manager that implements PSR-14.", + "homepage": "https://hyperf.io", + "keywords": [ + "event", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/exception-handler", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/exception-handler.git", + "reference": "df2135fb0ffe0bb61032911038aea6488077cdef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/df2135fb0ffe0bb61032911038aea6488077cdef", + "reference": "df2135fb0ffe0bb61032911038aea6488077cdef", + "shasum": "" + }, + "require": { + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/http-message": "^1.0 || ^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use #[ExceptionHandler]", + "hyperf/event": "Required to use listeners", + "hyperf/framework": "Required to use listeners", + "hyperf/stringable": "Required to use WhoopsExceptionHandler" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\ExceptionHandler\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ExceptionHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Exception handler for hyperf", + "homepage": "https://hyperf.io", + "keywords": [ + "exception-handler", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/framework", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/framework.git", + "reference": "7b317d3891698a1eb0308e7306730d2ada1d6ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/framework/zipball/7b317d3891698a1eb0308e7306730d2ada1d6ff4", + "reference": "7b317d3891698a1eb0308e7306730d2ada1d6ff4", + "shasum": "" + }, + "require": { + "fig/http-message-util": "^1.1.2", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-swoole": "Required to use swoole engine.", + "hyperf/command": "Required to use Command annotation.", + "hyperf/di": "Required to use Command annotation.", + "hyperf/dispatcher": "Required to use BootApplication event.", + "symfony/event-dispatcher": "Required to use symfony event dispatcher (^5.0|^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Framework\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Framework\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.", + "homepage": "https://hyperf.io", + "keywords": [ + "Microservice", + "framework", + "hyperf", + "middleware", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/guzzle", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/guzzle.git", + "reference": "fe838557530bf7b2d39dc604563c3a3ff8d5618f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/guzzle/zipball/fe838557530bf7b2d39dc604563c3a3ff8d5618f", + "reference": "fe838557530bf7b2d39dc604563c3a3ff8d5618f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "hyperf/pool": "Required to use pool handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Guzzle\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Swoole coroutine handler for guzzle", + "keywords": [ + "Guzzle", + "handler", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/guzzle/issues", + "source": "https://github.com/hyperf/guzzle/tree/v3.1.42" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/http-message", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-message.git", + "reference": "831c257db7bd9bbe0624da79e58980d66950bccf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-message/zipball/831c257db7bd9bbe0624da79e58980d66950bccf", + "reference": "831c257db7bd9bbe0624da79e58980d66950bccf", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/engine": "^2.11", + "hyperf/support": "~3.1.0", + "laminas/laminas-mime": "^2.7", + "php": ">=8.1", + "psr/http-message": "^1.0 || ^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "psr/container": "Required to replace RequestParserInterface." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpMessage\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpMessage\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "microservice framework base on swoole", + "keywords": [ + "http-message", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/http-message/issues", + "source": "https://github.com/hyperf/http-message/tree/v3.1.42" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/http-server", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-server.git", + "reference": "4727f15a743c6e9ca0a6b3c8494c5c62bae82f5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-server/zipball/4727f15a743c6e9ca0a6b3c8494c5c62bae82f5a", + "reference": "4727f15a743c6e9ca0a6b3c8494c5c62bae82f5a", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/event": "~3.1.0", + "hyperf/exception-handler": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/server": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "nikic/fast-route": "^1.3", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "http", + "http-server", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/logger", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/logger.git", + "reference": "c96d32fae44bf350ef903ebca19c91a315458d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/logger/zipball/c96d32fae44bf350ef903ebca19c91a315458d72", + "reference": "c96d32fae44bf350ef903ebca19c91a315458d72", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "monolog/monolog": "^2.7 || ^3.1", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Logger\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Logger\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A logger component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "logger", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/macroable", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/macroable.git", + "reference": "0be650165b9e8ea073e199fac788ece70f16b6a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/macroable/zipball/0be650165b9e8ea073e199fac788ece70f16b6a4", + "reference": "0be650165b9e8ea073e199fac788ece70f16b6a4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Macroable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/macroable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "macroable", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/memory", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/memory.git", + "reference": "ccf25783d63a2610a4d797ec34c1e0093b755da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/memory/zipball/ccf25783d63a2610a4d797ec34c1e0093b755da2", + "reference": "ccf25783d63a2610a4d797ec34c1e0093b755da2", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Memory\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Memory\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that use to operate and manage memory.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "memory", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/model-listener", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/model-listener.git", + "reference": "0181882fb6034cf2eac81b84b5c65c187af9f3a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/model-listener/zipball/0181882fb6034cf2eac81b84b5c65c187af9f3a4", + "reference": "0181882fb6034cf2eac81b84b5c65c187af9f3a4", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/database": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/event": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\ModelListener\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ModelListener\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A model listener for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "model-listener", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/mqtt-server-incubator", + "version": "v0.3.1", + "source": { + "type": "git", + "url": "https://github.com/hyperf/mqtt-server-incubator.git", + "reference": "37c45e5710c26fe819bc2097f732bca6ccde2455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/mqtt-server-incubator/zipball/37c45e5710c26fe819bc2097f732bca6ccde2455", + "reference": "37c45e5710c26fe819bc2097f732bca6ccde2455", + "shasum": "" + }, + "require": { + "hyperf/cache": "^3.0", + "hyperf/codec": "^3.0", + "hyperf/contract": "^3.0", + "hyperf/coordinator": "^3.0", + "hyperf/di": "^3.0", + "hyperf/http-server": "^3.0", + "php": ">=8.0", + "simps/mqtt": "^1.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0", + "swoole/ide-helper": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3-dev" + }, + "hyperf": { + "config": "Hyperf\\MqttServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\MqttServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "MQTT Server for Hyperf", + "keywords": [ + "hyperf", + "mqtt", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/mqtt-server-incubator/issues", + "source": "https://github.com/hyperf/mqtt-server-incubator/tree/v0.3.1" + }, + "time": "2023-09-16T14:05:44+00:00" + }, + { + "name": "hyperf/paginator", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/paginator.git", + "reference": "b637a3deeee69f4a3e5a6d62ab8214244b98412a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/paginator/zipball/b637a3deeee69f4a3e5a6d62ab8214244b98412a", + "reference": "b637a3deeee69f4a3e5a6d62ab8214244b98412a", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "hyperf/event": "Reqiured to use PageResolverListener.", + "hyperf/framework": "Reqiured to use PageResolverListener.", + "hyperf/http-server": "Reqiured to use PageResolverListener." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Paginator\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Paginator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A paginator component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "paginator", + "php" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/pipeline", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pipeline.git", + "reference": "096d9a9f87ddea33209f134d30ae8d8867a195c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pipeline/zipball/096d9a9f87ddea33209f134d30ae8d8867a195c7", + "reference": "096d9a9f87ddea33209f134d30ae8d8867a195c7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/pipeline", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pipeline", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/pool", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pool.git", + "reference": "004dd811bf760ea0032913a31284102742abb737" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pool/zipball/004dd811bf760ea0032913a31284102742abb737", + "reference": "004dd811bf760ea0032913a31284102742abb737", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "suggest": { + "psr/event-dispatcher": "Required to use events." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Pool\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pool\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent universal connection pool component.", + "homepage": "https://hyperf.io", + "keywords": [ + "connection-pool", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/process", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/process.git", + "reference": "2b2286cff615989f01cb87691882b61c4c931ea3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/process/zipball/2b2286cff615989f01cb87691882b61c4c931ea3", + "reference": "2b2286cff615989f01cb87691882b61c4c931ea3", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations.", + "hyperf/event": "Required to dump the message before and after process.", + "hyperf/framework": "Required to use BootProcessListener." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Process\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Process\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A process component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "process" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/rate-limit", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/rate-limit.git", + "reference": "72767891017ad44420b80a9c4b9cbb7f009c3676" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/rate-limit/zipball/72767891017ad44420b80a9c4b9cbb7f009c3676", + "reference": "72767891017ad44420b80a9c4b9cbb7f009c3676", + "shasum": "" + }, + "require": { + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/token-bucket": "^2.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "suggest": { + "hyperf/contract": "Required to use annotations.", + "hyperf/di": "Required to use annotations.", + "hyperf/http-server": "Required to use annotations.", + "hyperf/redis": "Required to use RedisStorage." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\RateLimit\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\RateLimit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A rate limiter implemented for Hyperf or other coroutine framework", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "rate-limiter", + "token-bucket" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/redis", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/redis.git", + "reference": "973a92c34be60353e978d85c434e65f366a817dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/redis/zipball/973a92c34be60353e978d85c434e65f366a817dd", + "reference": "973a92c34be60353e978d85c434e65f366a817dd", + "shasum": "" + }, + "require": { + "ext-redis": "^5.0 || ^6.0", + "hyperf/contract": "~3.1.0", + "hyperf/pool": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "suggest": { + "ext-redis": "Required to use sentinel mode (>=5.2).", + "hyperf/di": "Create the RedisPool via dependency injection." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Redis\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Redis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A redis component for hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pool", + "redis" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/serializer", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/serializer.git", + "reference": "03c8a4840e0a7be83670c2fb0f850a2204fad076" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/serializer/zipball/03c8a4840e0a7be83670c2fb0f850a2204fad076", + "reference": "03c8a4840e0a7be83670c2fb0f850a2204fad076", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "hyperf/di": "Required to use ExceptionNormalizer", + "symfony/property-access": "Required to use SymfonyNormalizer (^5.0|^6.0)", + "symfony/serializer": "Required to use SymfonyNormalizer (^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Serializer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A serializer component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/server", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/server.git", + "reference": "e10c5ce6d9b72d3ca9ad16d36977e2e64d975460" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/server/zipball/e10c5ce6d9b72d3ca9ad16d36977e2e64d975460", + "reference": "e10c5ce6d9b72d3ca9ad16d36977e2e64d975460", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/engine": "^2.8", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/console": "^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "hyperf/event": "Dump the info after server start.", + "hyperf/framework": "Dump the info after server start." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Server\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A base server library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "server", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/stdlib", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stdlib.git", + "reference": "13393734a4cc6c9878390b1f6b0fc7e5202c6b59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stdlib/zipball/13393734a4cc6c9878390b1f6b0fc7e5202c6b59", + "reference": "13393734a4cc6c9878390b1f6b0fc7e5202c6b59", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A stdlib component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stdlib", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/stringable", + "version": "v3.1.43", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stringable.git", + "reference": "5467fc81559ae93b2b7a938a5e75c16645e49755" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stringable/zipball/5467fc81559ae93b2b7a938a5e75c16645e49755", + "reference": "5467fc81559ae93b2b7a938a5e75c16645e49755", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "hyperf/collection": "~3.1.0", + "hyperf/conditionable": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "doctrine/inflector": "Required to use plural and singular methods.(^2.0|^3.0)", + "ramsey/uuid": "Required to use uuid and orderedUuid methods.(^4.7|^5.0)", + "symfony/uid": "Required to use ulid method.(^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Stringable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Stringable package which come from illuminate/support", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stringable", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-10-09T02:28:40+00:00" + }, + { + "name": "hyperf/support", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/support.git", + "reference": "443d90791361f6d04f134f640b0794fc2d870e42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/support/zipball/443d90791361f6d04f134f640b0794fc2d870e42", + "reference": "443d90791361f6d04f134f640b0794fc2d870e42", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "nesbot/carbon": "Use Carbon as DateTime object.(^2.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Support\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A support component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "support", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/tappable", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/tappable.git", + "reference": "f5c5d343c95238dcb3fe500876ceadc175e221f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/tappable/zipball/f5c5d343c95238dcb3fe500876ceadc175e221f8", + "reference": "f5c5d343c95238dcb3fe500876ceadc175e221f8", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Tappable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/tappable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/token-bucket", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/token-bucket.git", + "reference": "7ebb9e7d01d3daecf23b80502b2adffd2fcb2283" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/token-bucket/zipball/7ebb9e7d01d3daecf23b80502b2adffd2fcb2283", + "reference": "7ebb9e7d01d3daecf23b80502b2adffd2fcb2283", + "shasum": "" + }, + "require": { + "ext-bcmath": "*", + "malkusch/lock": "^2.0", + "php": "^8.0" + }, + "replace": { + "bandwidth-throttle/token-bucket": "2.0.0" + }, + "require-dev": { + "mikey179/vfsstream": "^1.5.0", + "mockery/mockery": "^1.5", + "php-mock/php-mock-phpunit": "^2.6", + "phpunit/phpunit": "^9.0", + "predis/predis": "^1" + }, + "type": "library", + "autoload": { + "psr-4": { + "bandwidthThrottle\\tokenBucket\\": "classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "WTFPL" + ], + "authors": [ + { + "name": "Markus Malkusch", + "email": "markus@malkusch.de", + "homepage": "http://markus.malkusch.de", + "role": "Developer" + }, + { + "name": "Hyperf Developers", + "email": "group@hyperf.io" + } + ], + "description": "Implementation of the Token Bucket algorithm.", + "homepage": "https://github.com/bandwidth-throttle/token-bucket", + "keywords": [ + "bandwidth", + "rate limit", + "rate limiting", + "throttle", + "throttling", + "token bucket" + ], + "support": { + "source": "https://github.com/hyperf/token-bucket/tree/v2.0.0" + }, + "time": "2023-01-07T12:45:03+00:00" + }, + { + "name": "hyperf/translation", + "version": "v3.1.42", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/hyperf/translation/v3.1.42/hyperf-translation-v3.1.42.zip", + "reference": "0bca5490a99b0ea5200d5753fd096338ec24c25f", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Translation\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Translation\\": "src/" + } + }, + "license": [ + "MIT" + ], + "description": "An independent translation component, forked by illuminate/translation.", + "keywords": [ + "hyperf", + "translation" + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/utils", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/utils.git", + "reference": "4b13a567a61d08a3c4d058499e28a5b26fc18f1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/utils/zipball/4b13a567a61d08a3c4d058499e28a5b26fc18f1c", + "reference": "4b13a567a61d08a3c4d058499e28a5b26fc18f1c", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/engine": "^2.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A tools package that could help developer solved the problem quickly.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "utils" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/validation", + "version": "v3.1.42", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/hyperf/validation/v3.1.42/hyperf-validation-v3.1.42.zip", + "reference": "917eb70c3dd67487b10ad5d5cbb0a009dac91e40", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^3.0", + "hyperf/collection": "~3.1.0", + "hyperf/conditionable": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/framework": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "hyperf/translation": "~3.1.0", + "hyperf/utils": "~3.1.0", + "nesbot/carbon": "^2.21", + "php": ">=8.1", + "psr/container": "^1.0 || ^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "suggest": { + "hyperf/database": "Required if you want to use the database validation rule (~3.1.0).", + "hyperf/http-server": "Required if you want to use the request validation rule (~3.1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Validation\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Validation\\": "src/" + } + }, + "license": [ + "MIT" + ], + "description": "hyperf validation", + "keywords": [ + "hyperf", + "validation" + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "laminas/laminas-mime", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mime.git", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/08cc544778829b7d68d27a097885bd6e7130135e", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-mime": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-mail": "^2.19.0", + "phpunit/phpunit": "~9.5.25" + }, + "suggest": { + "laminas/laminas-mail": "Laminas\\Mail component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and parse MIME messages and parts", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mime" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mime/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mime/issues", + "rss": "https://github.com/laminas/laminas-mime/releases.atom", + "source": "https://github.com/laminas/laminas-mime" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-11-02T16:47:19+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.19.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "6a192dd0882b514e45506f533b833b623b78fff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/6a192dd0882b514e45506f533b833b623b78fff3", + "reference": "6a192dd0882b514e45506f533b833b623b78fff3", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "phpbench/phpbench": "^1.2.15", + "phpunit/phpunit": "^10.5.8", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-01-19T12:39:49+00:00" + }, + { + "name": "malkusch/lock", + "version": "v2.2.1", + "source": { + "type": "git", + "url": "https://github.com/php-lock/lock.git", + "reference": "63c1b268f521a702cb8755ed92631c1fac1775e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-lock/lock/zipball/63c1b268f521a702cb8755ed92631c1fac1775e6", + "reference": "63c1b268f521a702cb8755ed92631c1fac1775e6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "eloquent/liberator": "^2.0", + "ext-memcached": "*", + "ext-pcntl": "*", + "ext-pdo": "*", + "ext-pdo_mysql": "*", + "ext-pdo_sqlite": "*", + "ext-sysvsem": "*", + "friendsofphp/php-cs-fixer": "^2.16", + "johnkary/phpunit-speedtrap": "^3.0", + "mikey179/vfsstream": "^1.6.7", + "php-mock/php-mock-phpunit": "^2.1", + "phpstan/phpstan": "^0.12.58", + "phpunit/phpunit": "^9.4", + "predis/predis": "^1.1", + "spatie/async": "^1.5", + "squizlabs/php_codesniffer": "^3.3" + }, + "suggest": { + "ext-igbinary": "To use this library with PHP Redis igbinary serializer enabled.", + "ext-lzf": "To use this library with PHP Redis lzf compression enabled.", + "ext-pnctl": "Enables locking with flock without busy waiting in CLI scripts.", + "ext-redis": "To use this library with the PHP Redis extension.", + "ext-sysvsem": "Enables locking using semaphores.", + "predis/predis": "To use this library with predis." + }, + "type": "library", + "autoload": { + "psr-4": { + "malkusch\\lock\\": "classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "WTFPL" + ], + "authors": [ + { + "name": "Markus Malkusch", + "email": "markus@malkusch.de", + "homepage": "http://markus.malkusch.de", + "role": "Developer" + }, + { + "name": "Willem Stuursma-Ruwen", + "email": "willem@stuursma.name", + "role": "Developer" + } + ], + "description": "Mutex library for exclusive code execution.", + "homepage": "https://github.com/malkusch/lock", + "keywords": [ + "advisory-locks", + "cas", + "flock", + "lock", + "locking", + "memcache", + "mutex", + "mysql", + "postgresql", + "redis", + "redlock", + "semaphore" + ], + "support": { + "issues": "https://github.com/php-lock/lock/issues", + "source": "https://github.com/php-lock/lock/tree/v2.2.1" + }, + "time": "2022-04-26T09:25:15+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-06-28T09:40:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.5", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-06-03T19:18:41+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" + }, + "time": "2024-09-29T15:01:53+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "simps/mqtt", + "version": "v1.4.5", + "source": { + "type": "git", + "url": "https://github.com/simps/mqtt.git", + "reference": "ab44f7e7f4efb970f542945881e3a0f88b134e2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simps/mqtt/zipball/ab44f7e7f4efb970f542945881e3a0f88b134e2b", + "reference": "ab44f7e7f4efb970f542945881e3a0f88b134e2b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^8.5", + "simps/mqtt-cli": "*", + "swoole/ide-helper": ">=4.4.20" + }, + "suggest": { + "ext-swoole": "The ext-swoole >= v4.4.20 or v4.5.3 needs to be loaded when using the MQTT Client." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/constants.php" + ], + "psr-4": { + "Simps\\MQTT\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Lu Fei", + "email": "lufei@simps.io" + } + ], + "description": "MQTT Protocol Analysis and Coroutine Client for PHP", + "keywords": [ + "client", + "coroutine", + "mqtt", + "mqtt3.1", + "mqtt5.0", + "mqtt_client", + "mqtt_protocol", + "php", + "simps", + "swoole" + ], + "support": { + "issues": "https://github.com/simps/mqtt/issues", + "source": "https://github.com/simps/mqtt/tree/v1.4.5" + }, + "funding": [ + { + "url": "https://donate.qq52o.me", + "type": "custom" + }, + { + "url": "https://github.com/simps", + "type": "github" + } + ], + "time": "2024-08-24T06:23:14+00:00" + }, + { + "name": "swow/psr7-plus", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/swow/psr7-plus.git", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swow/psr7-plus/zipball/7acc4924be907d2ff64edee5a2bd116620e56364", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Swow\\Psr7\\Message\\": "src/Message/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "twose", + "email": "twosee@php.net" + } + ], + "description": "Modern strong-typed interfaces for Psr7, not only HTTP but also WebSocket", + "keywords": [ + "http", + "psr17", + "psr7", + "swow", + "websocket" + ], + "support": { + "issues": "https://github.com/swow/swow", + "source": "https://github.com/swow/psr7-plus/tree/v1.1.2" + }, + "time": "2023-06-15T09:18:11+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:28:38+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:28:19+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-idn/v1.31.0/symfony-polyfill-intl-idn-v1.31.0.zip", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:28:38+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "cf8360b8352b086be620fae8342c4d96e391a489" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", + "reference": "cf8360b8352b086be620fae8342c4d96e391a489", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-16T06:02:54+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + } + ], + "packages-dev": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.10", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-08-27T18:44:43+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.64.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "58dd9c931c785a79739310aef5178928305ffa67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/58dd9c931c785a79739310aef5178928305ffa67", + "reference": "58dd9c931c785a79739310aef5178928305ffa67", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.0", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.3", + "infection/infection": "^0.29.5", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.64.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-08-30T23:09:38+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "hyperf/devtool", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/devtool.git", + "reference": "ae1c8f547c21eb591a94ae3fbacf054542de82d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/devtool/zipball/ae1c8f547c21eb591a94ae3fbacf054542de82d3", + "reference": "ae1c8f547c21eb591a94ae3fbacf054542de82d3", + "shasum": "" + }, + "require": { + "hyperf/code-parser": "~3.1.0", + "hyperf/command": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Devtool\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Devtool\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Devtool for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "dev", + "devtool", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/testing", + "version": "v3.1.42", + "source": { + "type": "git", + "url": "https://github.com/hyperf/testing.git", + "reference": "ad2eaee6aadc9156ac3da853bb56f89e97542234" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/testing/zipball/ad2eaee6aadc9156ac3da853bb56f89e97542234", + "reference": "ad2eaee6aadc9156ac3da853bb56f89e97542234", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/http-server": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "phpunit/phpunit": "^10.0", + "psr/container": "^1.0 || ^2.0", + "symfony/http-foundation": "^5.4 || ^6.0" + }, + "suggest": { + "fakerphp/faker": "Required to use Faker feature.(^1.23)" + }, + "bin": [ + "co-phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Testing for hyperf", + "keywords": [ + "dev", + "php", + "swoole", + "testing" + ], + "support": { + "source": "https://github.com/hyperf/testing/tree/v3.1.42" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-09-25T02:54:12+00:00" + }, + { + "name": "hyperf/watcher", + "version": "v3.1.43", + "source": { + "type": "git", + "url": "https://github.com/hyperf/watcher.git", + "reference": "a5f41a66a8b8f651335b4a7c403e03ff0b0f4802" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/watcher/zipball/a5f41a66a8b8f651335b4a7c403e03ff0b0f4802", + "reference": "a5f41a66a8b8f651335b4a7c403e03ff0b0f4802", + "shasum": "" + }, + "require": { + "ext-posix": "*", + "hyperf/codec": "~3.1.0", + "hyperf/command": "~3.1.0", + "hyperf/di": "~3.1.0", + "hyperf/framework": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Watcher\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Watcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hot reload watcher for Hyperf", + "keywords": [ + "dev", + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/watcher/issues", + "source": "https://github.com/hyperf/watcher/tree/v3.1.43" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2024-10-06T12:33:12+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.12.6", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae", + "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-10-06T15:03:59+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.36", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-10-08T15:36:51+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-09-16T13:41:56+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-12T06:03:08+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "swoole/ide-helper", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/swoole/ide-helper.git", + "reference": "e63299f488bf8332404ce4f80142a2ed1397edde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swoole/ide-helper/zipball/e63299f488bf8332404ce4f80142a2ed1397edde", + "reference": "e63299f488bf8332404ce4f80142a2ed1397edde", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Team Swoole", + "email": "team@swoole.com" + } + ], + "description": "IDE help files for Swoole.", + "support": { + "issues": "https://github.com/swoole/ide-helper/issues", + "source": "https://github.com/swoole/ide-helper/tree/5.1.4" + }, + "time": "2024-09-03T04:39:02+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/61fe0566189bf32e8cfee78335d8776f64a66f5a", + "reference": "61fe0566189bf32e8cfee78335d8776f64a66f5a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T09:16:35+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:18:25+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5c03ee6369281177f07f7c68252a280beccba847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-19T21:48:23+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/autoload/annotations.php b/config/autoload/annotations.php new file mode 100644 index 0000000..1423a25 --- /dev/null +++ b/config/autoload/annotations.php @@ -0,0 +1,21 @@ + [ + 'paths' => [ + BASE_PATH . '/app', + ], + 'ignore_annotations' => [ + 'mixin', + ], + ], +]; diff --git a/config/autoload/app.php b/config/autoload/app.php new file mode 100644 index 0000000..84a8d28 --- /dev/null +++ b/config/autoload/app.php @@ -0,0 +1,13 @@ + "!123AD1@", + // 加密密钥 + "public" => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtdxd5D6SahDExxEPsEvHkT5RShkay2xAYdqNGuQnLHcf8yJqPkwylyz8mrGUqrhahC/rbkzUk/liT0omMkmKWkm+cNSyVxqv4YvQ5446LAbqsbaZqxtbsJbtcL4tUZospwnwZynwQnNIO8hmeF3EOuuX7WzaxwS7Ugf8acn9Tez8GCijhtipqySr9Q5SLd9F7HV8EXohpfNDR5uAEL7hgJWe1tGi91eScSt9IEMS2CWEZzCi6WilfyQ8cSFjlBL9MC/LAnlm48b+MS2KBIVDtA2PodGWQMWn8UzXrob6Du2gjlBIWUr5Hu5/kx1IhVYZCctHHBK+fSqftTdJMsRQRwIDAQAB", + "private" => "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC13F3kPpJqEMTHEQ+wS8eRPlFKGRrLbEBh2o0a5Ccsdx/zImo+TDKXLPyasZSquFqEL+tuTNST+WJPSiYySYpaSb5w1LJXGq/hi9DnjjosBuqxtpmrG1uwlu1wvi1RmiynCfBnKfBCc0g7yGZ4XcQ665ftbNrHBLtSB/xpyf1N7PwYKKOG2KmrJKv1DlIt30XsdXwReiGl80NHm4AQvuGAlZ7W0aL3V5JxK30gQxLYJYRnMKLpaKV/JDxxIWOUEv0wL8sCeWbjxv4xLYoEhUO0DY+h0ZZAxafxTNeuhvoO7aCOUEhZSvke7n+THUiFVhkJy0ccEr59Kp+1N0kyxFBHAgMBAAECggEAICt4LGzpJ3wJ4xDgjpYJGmdEp+/i7oMarHSlq1EaoOH9s9utoZGHDXj2wkKRgtWTpXh4lA1hOT/PJSl/sjuSDsCmwHzPg1sEK8i4zo05OxqKH5+mdT8krAs2u0/Y4mt8ZJv8e7NOfeK4r2KWxcoIcUfFm0k7NiNfI3aoLup9NXBeWqBnHl5kgtsEDeU1KoEX8U/HW8oTyQqGAW20Jz9mXN1XneADjGpSUwQY0oaG620S51WBKIicKO7R3NP7J67IyCVTnKyAMuTEBoEcweG/WGpGdI+3AkUcJFMrMkwYX/X4Df5zEF93mXf6DxvEI2m1jdOrVZ42yJEg0pE5H1sGuQKBgQD4d1ELhSM8fub31jJrXNewHEIwszFcTiUbEjFiO0Cep5lYuGVZuWdMye2Gc+ZphrtEalLNGFt+sw9MuoqxIYhipnUz9ksHKDRoxR4dOebXCPgP/LHW4P8KAPcvMUr4xNS5hrh9qajjTaRepZwjcIS9CWr8QHDHF6a74K+XGxUn8wKBgQC7YAk34zOmx7BQC6nn7U+yM8Dksfdt2a+/rBGvqp6ILh6DTdeCI3b61L6NZKzVFg7YFOIQbBL88HOm3xz1MAJB4Q/a6A1Rz+lCKnkJ7d+En733nyh1HJlRK9FDaIPHm/iHi/FsJ9wHnrsAa7Vofp4QHWjQB6cUo2nvRoo4S8A/XQKBgEiuhourJ5KTwLaw9tDHOOTwb0BVutO4nEwd90o38QA4ILh+QE+N17TzwMK69qTZ37/0pkIOpP0cHhag3t9P4tiQvuozWuE+Fo6rUtLT1D4FBqOOlOs5qAFiJOyuK7M3yM54pVFFJv1PAg0ZvuHzETFHJv+hThw/Q+vjnxnBt1+XAoGBAJazqPZgMBzFotLebqrwvRaQdWX6lQyu9qFsXVUyHwtcPIJSyzAKIhmfnhrOjAteEFZOhXu70JHLOtlNvVaeZFJkF4Jy/LN+SxdCXdNUlF9wszNDuSBn/g/A9DAJEWQr1/n83hGlBVzDl5fBCUif/bTsUm5umT0KKZue2nBozJipAoGAX/xrRKIY8yfab7/Dc2THtrQA1fmOxDSK5Vki65N4tprsA4UiTdOegFgFGJfTnr8AkUG0leQ0mkYCNoXL1J0MnN92ULdfyAEn9bKW6dl7yVUOsyGLKMqasifI99rZS3aApMtF3/ekoymn+hbV3ftmtDi3HYzJ5QtBXPWXCvsN8LY=", + "iss" => "leapy.cn", + "aud" => "piiot", + "ttl" => 2592000 +]; \ No newline at end of file diff --git a/config/autoload/aspects.php b/config/autoload/aspects.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/aspects.php @@ -0,0 +1,13 @@ + [ + 'driver' => RedisDriver::class, + 'redis' => [ + 'pool' => 'default', + ], + 'channel' => '{queue}', + 'timeout' => 2, + 'retry_seconds' => 5, + 'handle_timeout' => 10, + 'processes' => 1, + 'concurrent' => [ + 'limit' => 10, + ], + 'max_messages' => 0, + ], +]; diff --git a/config/autoload/cache.php b/config/autoload/cache.php new file mode 100644 index 0000000..24d0e5b --- /dev/null +++ b/config/autoload/cache.php @@ -0,0 +1,19 @@ + [ + 'driver' => Hyperf\Cache\Driver\RedisDriver::class, + 'packer' => Hyperf\Codec\Packer\PhpSerializerPacker::class, + 'prefix' => 'c:', + 'skip_cache_results' => [], + ], +]; diff --git a/config/autoload/commands.php b/config/autoload/commands.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/commands.php @@ -0,0 +1,13 @@ + [ + 'driver' => env('DB_DRIVER', 'mysql'), + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'hyperf'), + 'port' => env('DB_PORT', 3306), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'collation' => env('DB_COLLATION', 'utf8_unicode_ci'), + 'prefix' => env('DB_PREFIX', ''), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60), + ], + 'commands' => [ + 'gen:model' => [ + 'path' => 'app/Model', + 'force_casts' => true, + 'inheritance' => 'Model', + ], + ], + ], +]; diff --git a/config/autoload/dependencies.php b/config/autoload/dependencies.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/dependencies.php @@ -0,0 +1,13 @@ + [ + 'amqp' => [ + 'consumer' => [ + 'namespace' => 'App\\Amqp\\Consumer', + ], + 'producer' => [ + 'namespace' => 'App\\Amqp\\Producer', + ], + ], + 'aspect' => [ + 'namespace' => 'App\\Aspect', + ], + 'command' => [ + 'namespace' => 'App\\Command', + ], + 'controller' => [ + 'namespace' => 'App\\Controller', + ], + 'job' => [ + 'namespace' => 'App\\Job', + ], + 'listener' => [ + 'namespace' => 'App\\Listener', + ], + 'middleware' => [ + 'namespace' => 'App\\Middleware', + ], + 'Process' => [ + 'namespace' => 'App\\Processes', + ], + ], +]; diff --git a/config/autoload/exceptions.php b/config/autoload/exceptions.php new file mode 100644 index 0000000..18697f6 --- /dev/null +++ b/config/autoload/exceptions.php @@ -0,0 +1,15 @@ + [ + 'http' => [ + Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler::class, + App\Exception\Handler\AppExceptionHandler::class, + App\Exception\Handler\ValidationExceptionHandler::class, + App\Exception\Handler\RateLimitExceptionHandle::class, + App\Exception\Handler\DbQueryExceptionHandle::class, + ], + ], +]; diff --git a/config/autoload/listeners.php b/config/autoload/listeners.php new file mode 100644 index 0000000..8a2c7a2 --- /dev/null +++ b/config/autoload/listeners.php @@ -0,0 +1,15 @@ + [ + 'handler' => [ + 'class' => Monolog\Handler\StreamHandler::class, + 'constructor' => [ + 'stream' => BASE_PATH . '/runtime/logs/hyperf.log', + 'level' => Monolog\Logger::DEBUG, + ], + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [ + 'format' => null, + 'dateFormat' => 'Y-m-d H:i:s', + 'allowInlineLineBreaks' => true, + ], + ], + ], +]; diff --git a/config/autoload/middlewares.php b/config/autoload/middlewares.php new file mode 100644 index 0000000..c30d871 --- /dev/null +++ b/config/autoload/middlewares.php @@ -0,0 +1,17 @@ + [ + App\Kernel\Middleware\JWTMiddleware::class, + App\Kernel\Middleware\CorsMiddleware::class, + ], +]; diff --git a/config/autoload/processes.php b/config/autoload/processes.php new file mode 100644 index 0000000..f46bd96 --- /dev/null +++ b/config/autoload/processes.php @@ -0,0 +1,13 @@ + 1, + 'consume' => 1, + 'capacity' => 2, + 'limitCallback' => [], + 'waitTimeout' => 1, + 'storage' => [ + 'class' => RedisStorage::class, + 'options' => [ + 'pool' => 'default', + 'expired_time' => 0, + ], + ], +]; diff --git a/config/autoload/redis.php b/config/autoload/redis.php new file mode 100644 index 0000000..8810f81 --- /dev/null +++ b/config/autoload/redis.php @@ -0,0 +1,29 @@ + [ + 'host' => env('REDIS_HOST', 'localhost'), + 'auth' => env('REDIS_AUTH', null), + 'port' => (int) env('REDIS_PORT', 6379), + 'db' => (int) env('REDIS_DB', 0), + 'pool' => [ + 'min_connections' => 1, + 'max_connections' => 10, + 'connect_timeout' => 10.0, + 'wait_timeout' => 3.0, + 'heartbeat' => -1, + 'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60), + ], + ], +]; diff --git a/config/autoload/server.php b/config/autoload/server.php new file mode 100644 index 0000000..9578f77 --- /dev/null +++ b/config/autoload/server.php @@ -0,0 +1,61 @@ + SWOOLE_PROCESS, + 'servers' => [ + [ + 'name' => 'http', + 'type' => Server::SERVER_HTTP, + 'host' => '0.0.0.0', + 'port' => (int)env("APP_PORT"), + 'sock_type' => SWOOLE_SOCK_TCP, + 'callbacks' => [ + Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'], + ], + 'options' => [ + // Whether to enable request lifecycle event + 'enable_request_lifecycle' => false, + ], + ], + [ + 'name' => 'mqtt', + 'type' => Server::SERVER_BASE, + 'host' => '0.0.0.0', + 'port' => (int)env("MQTT_PORT"), + 'sock_type' => SWOOLE_SOCK_TCP, + 'callbacks' => [ + Event::ON_RECEIVE => [Hyperf\MqttServer\MQTTServer::class, 'onReceive'], + ], + ], + ], + 'settings' => [ + Constant::OPTION_ENABLE_COROUTINE => true, + Constant::OPTION_WORKER_NUM => swoole_cpu_num(), + Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid', + Constant::OPTION_OPEN_TCP_NODELAY => true, + Constant::OPTION_MAX_COROUTINE => 100000, + Constant::OPTION_OPEN_HTTP2_PROTOCOL => true, + Constant::OPTION_MAX_REQUEST => 100000, + Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024, + Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024, + ], + 'callbacks' => [ + Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'], + Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'], + Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'], + ], +]; diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..418135e --- /dev/null +++ b/config/config.php @@ -0,0 +1,33 @@ + env('APP_NAME', 'skeleton'), + 'app_env' => env('APP_ENV', 'dev'), + 'scan_cacheable' => env('SCAN_CACHEABLE', false), + StdoutLoggerInterface::class => [ + 'log_level' => [ + LogLevel::ALERT, + LogLevel::CRITICAL, + LogLevel::DEBUG, + LogLevel::EMERGENCY, + LogLevel::ERROR, + LogLevel::INFO, + LogLevel::NOTICE, + LogLevel::WARNING, + ], + ], +]; diff --git a/config/container.php b/config/container.php new file mode 100644 index 0000000..9a33ace --- /dev/null +++ b/config/container.php @@ -0,0 +1,14 @@ +