├── .gitignore ├── src ├── Exceptions │ ├── Exception.php │ └── InvalidArgumentException.php ├── Interfaces │ └── EventInterface.php └── Event.php ├── composer.json ├── LICENSE ├── demo └── index.php ├── README.md ├── tests └── EventTest.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /.idea/ -------------------------------------------------------------------------------- /src/Exceptions/Exception.php: -------------------------------------------------------------------------------- 1 | '; 24 | }); 25 | 26 | $user = new User(); 27 | 28 | if($user->login()) { 29 | Event::trigger('login'); 30 | } 31 | 32 | // Usage with param 33 | // ================================== 34 | Event::listen('logout', function ($param) { 35 | echo 'Event '. $param .' logout fired!
'; 36 | }); 37 | 38 | if($user->logout()) { 39 | Event::trigger('logout', 'user'); 40 | } 41 | 42 | 43 | // Usage with param as array 44 | // ================================== 45 | Event::listen('updated', function($param1, $param2) { 46 | echo 'Event ('. $param1 .', '. $param2 .') updated fired!
'; 47 | }); 48 | 49 | // Event::unregister('updated'); 50 | 51 | if($user->updated()) { 52 | Event::trigger('updated', ['param1', 'param2']); 53 | } 54 | 55 | 56 | 57 | Event::listen('event.login', function () { 58 | echo 'Login Wild card fired!
'; 59 | }); 60 | 61 | Event::listen('event.logout', function () { 62 | echo 'Logout Wild card fired!
'; 63 | }); 64 | 65 | Event::listen('event.*', function ($param) { 66 | echo 'Wild card fired! - '.$param.'
'; 67 | }); 68 | 69 | 70 | Event::trigger('event.login', 'login'); 71 | Event::trigger('event.logout', 'logout'); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # roolith-event 2 | PHP event listener 3 | 4 | ### Install 5 | ``` 6 | composer require roolith/event 7 | ``` 8 | 9 | ### Usage 10 | ```php 11 | Event::listen('login', function () { 12 | echo 'Event user login fired!
'; 13 | }); 14 | 15 | Event::trigger('login'); 16 | ``` 17 | 18 | ### Working example 19 | ```php 20 | '; 41 | }); 42 | 43 | $user = new User(); 44 | 45 | if($user->login()) { 46 | Event::trigger('login'); 47 | } 48 | ``` 49 | 50 | #### Usage with param 51 | ```php 52 | Event::listen('logout', function ($param) { 53 | echo 'Event '. $param .' logout fired!
'; 54 | }); 55 | 56 | if($user->logout()) { 57 | Event::trigger('logout', 'user'); 58 | } 59 | ``` 60 | 61 | #### Usage with param array 62 | ```php 63 | Event::listen('updated', function($param1, $param2) { 64 | echo 'Event ('. $param1 .', '. $param2 .') updated fired!
'; 65 | }); 66 | 67 | if($user->updated()) { 68 | Event::trigger('updated', ['param1', 'param2']); 69 | } 70 | ``` 71 | 72 | #### Unregister an event 73 | ```php 74 | Event::unregister('updated'); 75 | ``` 76 | 77 | #### Wildcard event 78 | ```php 79 | Event::listen('event.login', function () { 80 | echo 'Login Wild card fired!
'; 81 | }); 82 | 83 | Event::listen('event.logout', function () { 84 | echo 'Logout Wild card fired!
'; 85 | }); 86 | 87 | Event::listen('event.*', function ($param) { 88 | echo 'Wild card fired! - '.$param.'
'; 89 | }); 90 | 91 | 92 | Event::trigger('event.login', 'login'); 93 | Event::trigger('event.logout', 'logout'); 94 | ``` -------------------------------------------------------------------------------- /tests/EventTest.php: -------------------------------------------------------------------------------- 1 | assertTrue($listener); 23 | } 24 | 25 | /** 26 | * @dataProvider listenerInvalidProvider 27 | * @param $name 28 | * @param $callback 29 | * @throws \Roolith\Event\Exceptions\InvalidArgumentException 30 | */ 31 | public function testShouldThrowExceptionForListener($name, $callback) 32 | { 33 | $this->expectException(\Roolith\Event\Exceptions\InvalidArgumentException::class); 34 | Event::listen($name, $callback); 35 | } 36 | 37 | public function testShouldAddMultipleListener() 38 | { 39 | $listener = Event::listeners(['a', 'n'], function (){}); 40 | $this->assertTrue($listener); 41 | 42 | $this->expectException(\Roolith\Event\Exceptions\InvalidArgumentException::class); 43 | Event::listeners('a', function (){}); 44 | } 45 | 46 | public function testShouldTriggerEvent() 47 | { 48 | Event::listen('event', function () {}); 49 | $result = Event::trigger('event'); 50 | 51 | $this->assertTrue($result); 52 | } 53 | 54 | public function testShouldTriggerEventWithParam() 55 | { 56 | $fnCalled = false; 57 | $param = ''; 58 | 59 | $fn = function ($p) use (&$fnCalled, &$param) { 60 | $fnCalled = true; 61 | $param = $p; 62 | 63 | return $p; 64 | }; 65 | 66 | Event::listen('event', $fn); 67 | Event::trigger('event', 'a'); 68 | 69 | $this->assertTrue($fnCalled); 70 | $this->assertEquals('a', $param); 71 | } 72 | 73 | public function testShouldTriggerEventWithMultipleParam() 74 | { 75 | $fnCalled = false; 76 | $param1 = ''; 77 | $param2 = ''; 78 | 79 | $fn = function ($p1, $p2) use (&$fnCalled, &$param1, &$param2) { 80 | $fnCalled = true; 81 | $param1 = $p1; 82 | $param2 = $p2; 83 | 84 | return true; 85 | }; 86 | 87 | Event::listen('event', $fn); 88 | Event::trigger('event', ['a', 'b']); 89 | 90 | $this->assertTrue($fnCalled); 91 | $this->assertEquals('a', $param1); 92 | $this->assertEquals('b', $param2); 93 | } 94 | 95 | public function testShouldListenWildcardEvent() 96 | { 97 | $loginEventListenCounter = 0; 98 | $logoutEventListenCounter = 0; 99 | $wildcardEventListenCounter = 0; 100 | 101 | Event::listen('event.login', function () use (&$loginEventListenCounter) { 102 | $loginEventListenCounter++; 103 | }); 104 | 105 | Event::listen('event.logout', function () use (&$logoutEventListenCounter) { 106 | $logoutEventListenCounter++; 107 | }); 108 | 109 | Event::listen('event.*', function () use (&$wildcardEventListenCounter) { 110 | $wildcardEventListenCounter++; 111 | }); 112 | 113 | Event::trigger('event.login'); 114 | Event::trigger('event.logout'); 115 | 116 | $this->assertEquals(1, $loginEventListenCounter); 117 | $this->assertEquals(1, $logoutEventListenCounter); 118 | $this->assertEquals(2, $wildcardEventListenCounter); 119 | } 120 | 121 | public function listenerInvalidProvider() 122 | { 123 | return [ 124 | ['!name', function () {}], 125 | ['name', ''], 126 | ]; 127 | } 128 | 129 | public function listenerValidProvider() 130 | { 131 | $fn = function () {}; 132 | 133 | return [ 134 | ['test', $fn], 135 | ['test.name', $fn], 136 | ['test.*', $fn], 137 | ]; 138 | } 139 | } -------------------------------------------------------------------------------- /src/Event.php: -------------------------------------------------------------------------------- 1 | 'Name characters should contain alphanumeric with ., * and _', 13 | 'callback' => 'Invalid callback', 14 | 'array' => 'Array required', 15 | 'listener' => 'Listener not defined', 16 | ]; 17 | 18 | /** 19 | * @inheritDoc 20 | */ 21 | public static function listen($name, $callback) 22 | { 23 | if (!self::isValidName($name)) { 24 | throw new InvalidArgumentException(self::$errorMessage['name']); 25 | } 26 | 27 | if (!is_callable($callback)) { 28 | throw new InvalidArgumentException(self::$errorMessage['callback']); 29 | } 30 | 31 | if (self::isWildcardName($name)) { 32 | $name = str_replace('*', 'wildcard', $name); 33 | } 34 | 35 | self::$events[$name][] = $callback; 36 | 37 | return true; 38 | } 39 | 40 | /** 41 | * @inheritDoc 42 | */ 43 | public static function listeners($names, $callback) 44 | { 45 | $result = true; 46 | 47 | if (!is_array($names)) { 48 | throw new InvalidArgumentException(self::$errorMessage['array']); 49 | } 50 | 51 | foreach ($names as $name) { 52 | $result = self::listen($name, $callback); 53 | } 54 | 55 | return $result; 56 | } 57 | 58 | /** 59 | * @inheritDoc 60 | */ 61 | public static function trigger($name, $argument = null) 62 | { 63 | if (!self::isValidName($name)) { 64 | throw new InvalidArgumentException(self::$errorMessage['name']); 65 | } 66 | 67 | if (!isset(self::$events[$name])) { 68 | throw new Exception(self::$errorMessage['listener']); 69 | } 70 | 71 | foreach (self::$events[$name] as $event => $callback) { 72 | if($argument && is_array($argument)) { 73 | call_user_func_array($callback, $argument); 74 | } 75 | elseif ($argument && !is_array($argument)) { 76 | call_user_func($callback, $argument); 77 | } 78 | else { 79 | call_user_func($callback); 80 | } 81 | } 82 | 83 | try { 84 | self::triggerWildCard($name, $argument); 85 | } catch (InvalidArgumentException $e) { 86 | throw new InvalidArgumentException(self::$errorMessage['name']); 87 | } catch (Exception $e) { 88 | throw new Exception(self::$errorMessage['listener']); 89 | } 90 | 91 | return true; 92 | } 93 | 94 | /** 95 | * Trigger wild card event 96 | * 97 | * @param $name 98 | * @param $argument 99 | * @return bool 100 | * @throws Exception 101 | * @throws InvalidArgumentException 102 | */ 103 | private static function triggerWildCard($name, $argument) 104 | { 105 | if (strstr($name, '.')) { 106 | $nameArray = explode('.', $name); 107 | $wildcardListenerName = $nameArray[0].'.wildcard'; 108 | 109 | if (isset(self::$events[$wildcardListenerName]) && $nameArray[1] !== 'wildcard') { 110 | try { 111 | return self::trigger($wildcardListenerName, $argument); 112 | } catch (InvalidArgumentException $e) { 113 | throw new InvalidArgumentException($e->getMessage()); 114 | } catch (Exception $e) { 115 | throw new Exception($e->getMessage()); 116 | } 117 | } 118 | } 119 | 120 | return false; 121 | } 122 | 123 | /** 124 | * Is valid name 125 | * 126 | * @param $name 127 | * @return bool 128 | */ 129 | protected static function isValidName($name) 130 | { 131 | return (bool) preg_match('/^[a-zA-Z0-9.*_]+$/', $name); 132 | } 133 | 134 | /** 135 | * @inheritDoc 136 | */ 137 | public static function unregister($name) 138 | { 139 | if (is_array($name)) { 140 | foreach ($name as $n) { 141 | $result = self::unregister($n); 142 | 143 | if (!$result) { 144 | return $result; 145 | } 146 | } 147 | 148 | return true; 149 | } else { 150 | if (isset(self::$events[$name])) { 151 | unset(self::$events[$name]); 152 | 153 | return true; 154 | } 155 | } 156 | 157 | return false; 158 | } 159 | 160 | /** 161 | * Set error messages 162 | * 163 | * @param $errorMessageArray array 164 | * @return bool 165 | */ 166 | public static function setErrorMessage($errorMessageArray) 167 | { 168 | self::$errorMessage = $errorMessageArray; 169 | 170 | return true; 171 | } 172 | 173 | /** 174 | * Is wildcard name 175 | * 176 | * @param $name 177 | * @return bool 178 | */ 179 | protected static function isWildcardName($name) 180 | { 181 | return (bool) strstr($name, '.*'); 182 | } 183 | 184 | /** 185 | * Reset all events 186 | * 187 | * @return bool 188 | */ 189 | public static function reset() 190 | { 191 | self::$events = []; 192 | 193 | return true; 194 | } 195 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "7b6a999f95d7894e3a3559acdc14be70", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "1.3.1", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", 21 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1 || ^8.0" 26 | }, 27 | "require-dev": { 28 | "doctrine/coding-standard": "^6.0", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpbench/phpbench": "^0.13", 32 | "phpstan/phpstan-phpunit": "^0.11", 33 | "phpstan/phpstan-shim": "^0.11", 34 | "phpunit/phpunit": "^7.0" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "1.2.x-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-4": { 44 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Marco Pivetta", 54 | "email": "ocramius@gmail.com", 55 | "homepage": "http://ocramius.github.com/" 56 | } 57 | ], 58 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 59 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 60 | "keywords": [ 61 | "constructor", 62 | "instantiate" 63 | ], 64 | "time": "2020-05-29T17:27:14+00:00" 65 | }, 66 | { 67 | "name": "myclabs/deep-copy", 68 | "version": "1.10.1", 69 | "source": { 70 | "type": "git", 71 | "url": "https://github.com/myclabs/DeepCopy.git", 72 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" 73 | }, 74 | "dist": { 75 | "type": "zip", 76 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 77 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 78 | "shasum": "" 79 | }, 80 | "require": { 81 | "php": "^7.1 || ^8.0" 82 | }, 83 | "replace": { 84 | "myclabs/deep-copy": "self.version" 85 | }, 86 | "require-dev": { 87 | "doctrine/collections": "^1.0", 88 | "doctrine/common": "^2.6", 89 | "phpunit/phpunit": "^7.1" 90 | }, 91 | "type": "library", 92 | "autoload": { 93 | "psr-4": { 94 | "DeepCopy\\": "src/DeepCopy/" 95 | }, 96 | "files": [ 97 | "src/DeepCopy/deep_copy.php" 98 | ] 99 | }, 100 | "notification-url": "https://packagist.org/downloads/", 101 | "license": [ 102 | "MIT" 103 | ], 104 | "description": "Create deep copies (clones) of your objects", 105 | "keywords": [ 106 | "clone", 107 | "copy", 108 | "duplicate", 109 | "object", 110 | "object graph" 111 | ], 112 | "time": "2020-06-29T13:22:24+00:00" 113 | }, 114 | { 115 | "name": "nikic/php-parser", 116 | "version": "v4.9.0", 117 | "source": { 118 | "type": "git", 119 | "url": "https://github.com/nikic/PHP-Parser.git", 120 | "reference": "aaee038b912e567780949787d5fe1977be11a778" 121 | }, 122 | "dist": { 123 | "type": "zip", 124 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/aaee038b912e567780949787d5fe1977be11a778", 125 | "reference": "aaee038b912e567780949787d5fe1977be11a778", 126 | "shasum": "" 127 | }, 128 | "require": { 129 | "ext-tokenizer": "*", 130 | "php": ">=7.0" 131 | }, 132 | "require-dev": { 133 | "ircmaxell/php-yacc": "^0.0.7", 134 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 135 | }, 136 | "bin": [ 137 | "bin/php-parse" 138 | ], 139 | "type": "library", 140 | "extra": { 141 | "branch-alias": { 142 | "dev-master": "4.9-dev" 143 | } 144 | }, 145 | "autoload": { 146 | "psr-4": { 147 | "PhpParser\\": "lib/PhpParser" 148 | } 149 | }, 150 | "notification-url": "https://packagist.org/downloads/", 151 | "license": [ 152 | "BSD-3-Clause" 153 | ], 154 | "authors": [ 155 | { 156 | "name": "Nikita Popov" 157 | } 158 | ], 159 | "description": "A PHP parser written in PHP", 160 | "keywords": [ 161 | "parser", 162 | "php" 163 | ], 164 | "time": "2020-08-18T19:48:01+00:00" 165 | }, 166 | { 167 | "name": "phar-io/manifest", 168 | "version": "2.0.1", 169 | "source": { 170 | "type": "git", 171 | "url": "https://github.com/phar-io/manifest.git", 172 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" 173 | }, 174 | "dist": { 175 | "type": "zip", 176 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", 177 | "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", 178 | "shasum": "" 179 | }, 180 | "require": { 181 | "ext-dom": "*", 182 | "ext-phar": "*", 183 | "ext-xmlwriter": "*", 184 | "phar-io/version": "^3.0.1", 185 | "php": "^7.2 || ^8.0" 186 | }, 187 | "type": "library", 188 | "extra": { 189 | "branch-alias": { 190 | "dev-master": "2.0.x-dev" 191 | } 192 | }, 193 | "autoload": { 194 | "classmap": [ 195 | "src/" 196 | ] 197 | }, 198 | "notification-url": "https://packagist.org/downloads/", 199 | "license": [ 200 | "BSD-3-Clause" 201 | ], 202 | "authors": [ 203 | { 204 | "name": "Arne Blankerts", 205 | "email": "arne@blankerts.de", 206 | "role": "Developer" 207 | }, 208 | { 209 | "name": "Sebastian Heuer", 210 | "email": "sebastian@phpeople.de", 211 | "role": "Developer" 212 | }, 213 | { 214 | "name": "Sebastian Bergmann", 215 | "email": "sebastian@phpunit.de", 216 | "role": "Developer" 217 | } 218 | ], 219 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 220 | "time": "2020-06-27T14:33:11+00:00" 221 | }, 222 | { 223 | "name": "phar-io/version", 224 | "version": "3.0.2", 225 | "source": { 226 | "type": "git", 227 | "url": "https://github.com/phar-io/version.git", 228 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0" 229 | }, 230 | "dist": { 231 | "type": "zip", 232 | "url": "https://api.github.com/repos/phar-io/version/zipball/c6bb6825def89e0a32220f88337f8ceaf1975fa0", 233 | "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0", 234 | "shasum": "" 235 | }, 236 | "require": { 237 | "php": "^7.2 || ^8.0" 238 | }, 239 | "type": "library", 240 | "autoload": { 241 | "classmap": [ 242 | "src/" 243 | ] 244 | }, 245 | "notification-url": "https://packagist.org/downloads/", 246 | "license": [ 247 | "BSD-3-Clause" 248 | ], 249 | "authors": [ 250 | { 251 | "name": "Arne Blankerts", 252 | "email": "arne@blankerts.de", 253 | "role": "Developer" 254 | }, 255 | { 256 | "name": "Sebastian Heuer", 257 | "email": "sebastian@phpeople.de", 258 | "role": "Developer" 259 | }, 260 | { 261 | "name": "Sebastian Bergmann", 262 | "email": "sebastian@phpunit.de", 263 | "role": "Developer" 264 | } 265 | ], 266 | "description": "Library for handling version information and constraints", 267 | "time": "2020-06-27T14:39:04+00:00" 268 | }, 269 | { 270 | "name": "phpdocumentor/reflection-common", 271 | "version": "2.2.0", 272 | "source": { 273 | "type": "git", 274 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 275 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 276 | }, 277 | "dist": { 278 | "type": "zip", 279 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 280 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 281 | "shasum": "" 282 | }, 283 | "require": { 284 | "php": "^7.2 || ^8.0" 285 | }, 286 | "type": "library", 287 | "extra": { 288 | "branch-alias": { 289 | "dev-2.x": "2.x-dev" 290 | } 291 | }, 292 | "autoload": { 293 | "psr-4": { 294 | "phpDocumentor\\Reflection\\": "src/" 295 | } 296 | }, 297 | "notification-url": "https://packagist.org/downloads/", 298 | "license": [ 299 | "MIT" 300 | ], 301 | "authors": [ 302 | { 303 | "name": "Jaap van Otterdijk", 304 | "email": "opensource@ijaap.nl" 305 | } 306 | ], 307 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 308 | "homepage": "http://www.phpdoc.org", 309 | "keywords": [ 310 | "FQSEN", 311 | "phpDocumentor", 312 | "phpdoc", 313 | "reflection", 314 | "static analysis" 315 | ], 316 | "time": "2020-06-27T09:03:43+00:00" 317 | }, 318 | { 319 | "name": "phpdocumentor/reflection-docblock", 320 | "version": "5.2.1", 321 | "source": { 322 | "type": "git", 323 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 324 | "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44" 325 | }, 326 | "dist": { 327 | "type": "zip", 328 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d870572532cd70bc3fab58f2e23ad423c8404c44", 329 | "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44", 330 | "shasum": "" 331 | }, 332 | "require": { 333 | "ext-filter": "*", 334 | "php": "^7.2 || ^8.0", 335 | "phpdocumentor/reflection-common": "^2.2", 336 | "phpdocumentor/type-resolver": "^1.3", 337 | "webmozart/assert": "^1.9.1" 338 | }, 339 | "require-dev": { 340 | "mockery/mockery": "~1.3.2" 341 | }, 342 | "type": "library", 343 | "extra": { 344 | "branch-alias": { 345 | "dev-master": "5.x-dev" 346 | } 347 | }, 348 | "autoload": { 349 | "psr-4": { 350 | "phpDocumentor\\Reflection\\": "src" 351 | } 352 | }, 353 | "notification-url": "https://packagist.org/downloads/", 354 | "license": [ 355 | "MIT" 356 | ], 357 | "authors": [ 358 | { 359 | "name": "Mike van Riel", 360 | "email": "me@mikevanriel.com" 361 | }, 362 | { 363 | "name": "Jaap van Otterdijk", 364 | "email": "account@ijaap.nl" 365 | } 366 | ], 367 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 368 | "time": "2020-08-15T11:14:08+00:00" 369 | }, 370 | { 371 | "name": "phpdocumentor/type-resolver", 372 | "version": "1.3.0", 373 | "source": { 374 | "type": "git", 375 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 376 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" 377 | }, 378 | "dist": { 379 | "type": "zip", 380 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", 381 | "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", 382 | "shasum": "" 383 | }, 384 | "require": { 385 | "php": "^7.2 || ^8.0", 386 | "phpdocumentor/reflection-common": "^2.0" 387 | }, 388 | "require-dev": { 389 | "ext-tokenizer": "*" 390 | }, 391 | "type": "library", 392 | "extra": { 393 | "branch-alias": { 394 | "dev-1.x": "1.x-dev" 395 | } 396 | }, 397 | "autoload": { 398 | "psr-4": { 399 | "phpDocumentor\\Reflection\\": "src" 400 | } 401 | }, 402 | "notification-url": "https://packagist.org/downloads/", 403 | "license": [ 404 | "MIT" 405 | ], 406 | "authors": [ 407 | { 408 | "name": "Mike van Riel", 409 | "email": "me@mikevanriel.com" 410 | } 411 | ], 412 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 413 | "time": "2020-06-27T10:12:23+00:00" 414 | }, 415 | { 416 | "name": "phpspec/prophecy", 417 | "version": "1.11.1", 418 | "source": { 419 | "type": "git", 420 | "url": "https://github.com/phpspec/prophecy.git", 421 | "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" 422 | }, 423 | "dist": { 424 | "type": "zip", 425 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", 426 | "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", 427 | "shasum": "" 428 | }, 429 | "require": { 430 | "doctrine/instantiator": "^1.2", 431 | "php": "^7.2", 432 | "phpdocumentor/reflection-docblock": "^5.0", 433 | "sebastian/comparator": "^3.0 || ^4.0", 434 | "sebastian/recursion-context": "^3.0 || ^4.0" 435 | }, 436 | "require-dev": { 437 | "phpspec/phpspec": "^6.0", 438 | "phpunit/phpunit": "^8.0" 439 | }, 440 | "type": "library", 441 | "extra": { 442 | "branch-alias": { 443 | "dev-master": "1.11.x-dev" 444 | } 445 | }, 446 | "autoload": { 447 | "psr-4": { 448 | "Prophecy\\": "src/Prophecy" 449 | } 450 | }, 451 | "notification-url": "https://packagist.org/downloads/", 452 | "license": [ 453 | "MIT" 454 | ], 455 | "authors": [ 456 | { 457 | "name": "Konstantin Kudryashov", 458 | "email": "ever.zet@gmail.com", 459 | "homepage": "http://everzet.com" 460 | }, 461 | { 462 | "name": "Marcello Duarte", 463 | "email": "marcello.duarte@gmail.com" 464 | } 465 | ], 466 | "description": "Highly opinionated mocking framework for PHP 5.3+", 467 | "homepage": "https://github.com/phpspec/prophecy", 468 | "keywords": [ 469 | "Double", 470 | "Dummy", 471 | "fake", 472 | "mock", 473 | "spy", 474 | "stub" 475 | ], 476 | "time": "2020-07-08T12:44:21+00:00" 477 | }, 478 | { 479 | "name": "phpunit/php-code-coverage", 480 | "version": "9.1.4", 481 | "source": { 482 | "type": "git", 483 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 484 | "reference": "4422fca28c3634e2de8c7c373af97a104dd1a45f" 485 | }, 486 | "dist": { 487 | "type": "zip", 488 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4422fca28c3634e2de8c7c373af97a104dd1a45f", 489 | "reference": "4422fca28c3634e2de8c7c373af97a104dd1a45f", 490 | "shasum": "" 491 | }, 492 | "require": { 493 | "ext-dom": "*", 494 | "ext-libxml": "*", 495 | "ext-xmlwriter": "*", 496 | "nikic/php-parser": "^4.8", 497 | "php": "^7.3 || ^8.0", 498 | "phpunit/php-file-iterator": "^3.0.3", 499 | "phpunit/php-text-template": "^2.0.2", 500 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 501 | "sebastian/complexity": "^2.0", 502 | "sebastian/environment": "^5.1.2", 503 | "sebastian/lines-of-code": "^1.0", 504 | "sebastian/version": "^3.0.1", 505 | "theseer/tokenizer": "^1.2.0" 506 | }, 507 | "require-dev": { 508 | "phpunit/phpunit": "^9.3" 509 | }, 510 | "suggest": { 511 | "ext-pcov": "*", 512 | "ext-xdebug": "*" 513 | }, 514 | "type": "library", 515 | "extra": { 516 | "branch-alias": { 517 | "dev-master": "9.1-dev" 518 | } 519 | }, 520 | "autoload": { 521 | "classmap": [ 522 | "src/" 523 | ] 524 | }, 525 | "notification-url": "https://packagist.org/downloads/", 526 | "license": [ 527 | "BSD-3-Clause" 528 | ], 529 | "authors": [ 530 | { 531 | "name": "Sebastian Bergmann", 532 | "email": "sebastian@phpunit.de", 533 | "role": "lead" 534 | } 535 | ], 536 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 537 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 538 | "keywords": [ 539 | "coverage", 540 | "testing", 541 | "xunit" 542 | ], 543 | "time": "2020-08-13T15:04:53+00:00" 544 | }, 545 | { 546 | "name": "phpunit/php-file-iterator", 547 | "version": "3.0.4", 548 | "source": { 549 | "type": "git", 550 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 551 | "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e" 552 | }, 553 | "dist": { 554 | "type": "zip", 555 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/25fefc5b19835ca653877fe081644a3f8c1d915e", 556 | "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e", 557 | "shasum": "" 558 | }, 559 | "require": { 560 | "php": "^7.3 || ^8.0" 561 | }, 562 | "require-dev": { 563 | "phpunit/phpunit": "^9.0" 564 | }, 565 | "type": "library", 566 | "extra": { 567 | "branch-alias": { 568 | "dev-master": "3.0-dev" 569 | } 570 | }, 571 | "autoload": { 572 | "classmap": [ 573 | "src/" 574 | ] 575 | }, 576 | "notification-url": "https://packagist.org/downloads/", 577 | "license": [ 578 | "BSD-3-Clause" 579 | ], 580 | "authors": [ 581 | { 582 | "name": "Sebastian Bergmann", 583 | "email": "sebastian@phpunit.de", 584 | "role": "lead" 585 | } 586 | ], 587 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 588 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 589 | "keywords": [ 590 | "filesystem", 591 | "iterator" 592 | ], 593 | "time": "2020-07-11T05:18:21+00:00" 594 | }, 595 | { 596 | "name": "phpunit/php-invoker", 597 | "version": "3.1.0", 598 | "source": { 599 | "type": "git", 600 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 601 | "reference": "7a85b66acc48cacffdf87dadd3694e7123674298" 602 | }, 603 | "dist": { 604 | "type": "zip", 605 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/7a85b66acc48cacffdf87dadd3694e7123674298", 606 | "reference": "7a85b66acc48cacffdf87dadd3694e7123674298", 607 | "shasum": "" 608 | }, 609 | "require": { 610 | "php": "^7.3 || ^8.0" 611 | }, 612 | "require-dev": { 613 | "ext-pcntl": "*", 614 | "phpunit/phpunit": "^9.0" 615 | }, 616 | "suggest": { 617 | "ext-pcntl": "*" 618 | }, 619 | "type": "library", 620 | "extra": { 621 | "branch-alias": { 622 | "dev-master": "3.1-dev" 623 | } 624 | }, 625 | "autoload": { 626 | "classmap": [ 627 | "src/" 628 | ] 629 | }, 630 | "notification-url": "https://packagist.org/downloads/", 631 | "license": [ 632 | "BSD-3-Clause" 633 | ], 634 | "authors": [ 635 | { 636 | "name": "Sebastian Bergmann", 637 | "email": "sebastian@phpunit.de", 638 | "role": "lead" 639 | } 640 | ], 641 | "description": "Invoke callables with a timeout", 642 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 643 | "keywords": [ 644 | "process" 645 | ], 646 | "time": "2020-08-06T07:04:15+00:00" 647 | }, 648 | { 649 | "name": "phpunit/php-text-template", 650 | "version": "2.0.2", 651 | "source": { 652 | "type": "git", 653 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 654 | "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324" 655 | }, 656 | "dist": { 657 | "type": "zip", 658 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", 659 | "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", 660 | "shasum": "" 661 | }, 662 | "require": { 663 | "php": "^7.3 || ^8.0" 664 | }, 665 | "require-dev": { 666 | "phpunit/phpunit": "^9.0" 667 | }, 668 | "type": "library", 669 | "extra": { 670 | "branch-alias": { 671 | "dev-master": "2.0-dev" 672 | } 673 | }, 674 | "autoload": { 675 | "classmap": [ 676 | "src/" 677 | ] 678 | }, 679 | "notification-url": "https://packagist.org/downloads/", 680 | "license": [ 681 | "BSD-3-Clause" 682 | ], 683 | "authors": [ 684 | { 685 | "name": "Sebastian Bergmann", 686 | "email": "sebastian@phpunit.de", 687 | "role": "lead" 688 | } 689 | ], 690 | "description": "Simple template engine.", 691 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 692 | "keywords": [ 693 | "template" 694 | ], 695 | "time": "2020-06-26T11:55:37+00:00" 696 | }, 697 | { 698 | "name": "phpunit/php-timer", 699 | "version": "5.0.1", 700 | "source": { 701 | "type": "git", 702 | "url": "https://github.com/sebastianbergmann/php-timer.git", 703 | "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7" 704 | }, 705 | "dist": { 706 | "type": "zip", 707 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/cc49734779cbb302bf51a44297dab8c4bbf941e7", 708 | "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7", 709 | "shasum": "" 710 | }, 711 | "require": { 712 | "php": "^7.3 || ^8.0" 713 | }, 714 | "require-dev": { 715 | "phpunit/phpunit": "^9.2" 716 | }, 717 | "type": "library", 718 | "extra": { 719 | "branch-alias": { 720 | "dev-master": "5.0-dev" 721 | } 722 | }, 723 | "autoload": { 724 | "classmap": [ 725 | "src/" 726 | ] 727 | }, 728 | "notification-url": "https://packagist.org/downloads/", 729 | "license": [ 730 | "BSD-3-Clause" 731 | ], 732 | "authors": [ 733 | { 734 | "name": "Sebastian Bergmann", 735 | "email": "sebastian@phpunit.de", 736 | "role": "lead" 737 | } 738 | ], 739 | "description": "Utility class for timing", 740 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 741 | "keywords": [ 742 | "timer" 743 | ], 744 | "time": "2020-06-26T11:58:13+00:00" 745 | }, 746 | { 747 | "name": "phpunit/phpunit", 748 | "version": "9.3.7", 749 | "source": { 750 | "type": "git", 751 | "url": "https://github.com/sebastianbergmann/phpunit.git", 752 | "reference": "c638a0cac77347980352485912de48c99b42ad00" 753 | }, 754 | "dist": { 755 | "type": "zip", 756 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c638a0cac77347980352485912de48c99b42ad00", 757 | "reference": "c638a0cac77347980352485912de48c99b42ad00", 758 | "shasum": "" 759 | }, 760 | "require": { 761 | "doctrine/instantiator": "^1.3.1", 762 | "ext-dom": "*", 763 | "ext-json": "*", 764 | "ext-libxml": "*", 765 | "ext-mbstring": "*", 766 | "ext-xml": "*", 767 | "ext-xmlwriter": "*", 768 | "myclabs/deep-copy": "^1.10.1", 769 | "phar-io/manifest": "^2.0.1", 770 | "phar-io/version": "^3.0.2", 771 | "php": "^7.3 || ^8.0", 772 | "phpspec/prophecy": "^1.11.1", 773 | "phpunit/php-code-coverage": "^9.1.1", 774 | "phpunit/php-file-iterator": "^3.0.4", 775 | "phpunit/php-invoker": "^3.1", 776 | "phpunit/php-text-template": "^2.0.2", 777 | "phpunit/php-timer": "^5.0.1", 778 | "sebastian/code-unit": "^1.0.5", 779 | "sebastian/comparator": "^4.0.3", 780 | "sebastian/diff": "^4.0.2", 781 | "sebastian/environment": "^5.1.2", 782 | "sebastian/exporter": "^4.0.2", 783 | "sebastian/global-state": "^5.0", 784 | "sebastian/object-enumerator": "^4.0.2", 785 | "sebastian/resource-operations": "^3.0.2", 786 | "sebastian/type": "^2.2.1", 787 | "sebastian/version": "^3.0.1" 788 | }, 789 | "require-dev": { 790 | "ext-pdo": "*", 791 | "phpspec/prophecy-phpunit": "^2.0.1" 792 | }, 793 | "suggest": { 794 | "ext-soap": "*", 795 | "ext-xdebug": "*" 796 | }, 797 | "bin": [ 798 | "phpunit" 799 | ], 800 | "type": "library", 801 | "extra": { 802 | "branch-alias": { 803 | "dev-master": "9.3-dev" 804 | } 805 | }, 806 | "autoload": { 807 | "classmap": [ 808 | "src/" 809 | ], 810 | "files": [ 811 | "src/Framework/Assert/Functions.php" 812 | ] 813 | }, 814 | "notification-url": "https://packagist.org/downloads/", 815 | "license": [ 816 | "BSD-3-Clause" 817 | ], 818 | "authors": [ 819 | { 820 | "name": "Sebastian Bergmann", 821 | "email": "sebastian@phpunit.de", 822 | "role": "lead" 823 | } 824 | ], 825 | "description": "The PHP Unit Testing framework.", 826 | "homepage": "https://phpunit.de/", 827 | "keywords": [ 828 | "phpunit", 829 | "testing", 830 | "xunit" 831 | ], 832 | "time": "2020-08-11T15:36:12+00:00" 833 | }, 834 | { 835 | "name": "sebastian/code-unit", 836 | "version": "1.0.5", 837 | "source": { 838 | "type": "git", 839 | "url": "https://github.com/sebastianbergmann/code-unit.git", 840 | "reference": "c1e2df332c905079980b119c4db103117e5e5c90" 841 | }, 842 | "dist": { 843 | "type": "zip", 844 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/c1e2df332c905079980b119c4db103117e5e5c90", 845 | "reference": "c1e2df332c905079980b119c4db103117e5e5c90", 846 | "shasum": "" 847 | }, 848 | "require": { 849 | "php": "^7.3 || ^8.0" 850 | }, 851 | "require-dev": { 852 | "phpunit/phpunit": "^9.0" 853 | }, 854 | "type": "library", 855 | "extra": { 856 | "branch-alias": { 857 | "dev-master": "1.0-dev" 858 | } 859 | }, 860 | "autoload": { 861 | "classmap": [ 862 | "src/" 863 | ] 864 | }, 865 | "notification-url": "https://packagist.org/downloads/", 866 | "license": [ 867 | "BSD-3-Clause" 868 | ], 869 | "authors": [ 870 | { 871 | "name": "Sebastian Bergmann", 872 | "email": "sebastian@phpunit.de", 873 | "role": "lead" 874 | } 875 | ], 876 | "description": "Collection of value objects that represent the PHP code units", 877 | "homepage": "https://github.com/sebastianbergmann/code-unit", 878 | "time": "2020-06-26T12:50:45+00:00" 879 | }, 880 | { 881 | "name": "sebastian/code-unit-reverse-lookup", 882 | "version": "2.0.2", 883 | "source": { 884 | "type": "git", 885 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 886 | "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819" 887 | }, 888 | "dist": { 889 | "type": "zip", 890 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ee51f9bb0c6d8a43337055db3120829fa14da819", 891 | "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819", 892 | "shasum": "" 893 | }, 894 | "require": { 895 | "php": "^7.3 || ^8.0" 896 | }, 897 | "require-dev": { 898 | "phpunit/phpunit": "^9.0" 899 | }, 900 | "type": "library", 901 | "extra": { 902 | "branch-alias": { 903 | "dev-master": "2.0-dev" 904 | } 905 | }, 906 | "autoload": { 907 | "classmap": [ 908 | "src/" 909 | ] 910 | }, 911 | "notification-url": "https://packagist.org/downloads/", 912 | "license": [ 913 | "BSD-3-Clause" 914 | ], 915 | "authors": [ 916 | { 917 | "name": "Sebastian Bergmann", 918 | "email": "sebastian@phpunit.de" 919 | } 920 | ], 921 | "description": "Looks up which function or method a line of code belongs to", 922 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 923 | "time": "2020-06-26T12:04:00+00:00" 924 | }, 925 | { 926 | "name": "sebastian/comparator", 927 | "version": "4.0.3", 928 | "source": { 929 | "type": "git", 930 | "url": "https://github.com/sebastianbergmann/comparator.git", 931 | "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f" 932 | }, 933 | "dist": { 934 | "type": "zip", 935 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", 936 | "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", 937 | "shasum": "" 938 | }, 939 | "require": { 940 | "php": "^7.3 || ^8.0", 941 | "sebastian/diff": "^4.0", 942 | "sebastian/exporter": "^4.0" 943 | }, 944 | "require-dev": { 945 | "phpunit/phpunit": "^9.0" 946 | }, 947 | "type": "library", 948 | "extra": { 949 | "branch-alias": { 950 | "dev-master": "4.0-dev" 951 | } 952 | }, 953 | "autoload": { 954 | "classmap": [ 955 | "src/" 956 | ] 957 | }, 958 | "notification-url": "https://packagist.org/downloads/", 959 | "license": [ 960 | "BSD-3-Clause" 961 | ], 962 | "authors": [ 963 | { 964 | "name": "Sebastian Bergmann", 965 | "email": "sebastian@phpunit.de" 966 | }, 967 | { 968 | "name": "Jeff Welch", 969 | "email": "whatthejeff@gmail.com" 970 | }, 971 | { 972 | "name": "Volker Dusch", 973 | "email": "github@wallbash.com" 974 | }, 975 | { 976 | "name": "Bernhard Schussek", 977 | "email": "bschussek@2bepublished.at" 978 | } 979 | ], 980 | "description": "Provides the functionality to compare PHP values for equality", 981 | "homepage": "https://github.com/sebastianbergmann/comparator", 982 | "keywords": [ 983 | "comparator", 984 | "compare", 985 | "equality" 986 | ], 987 | "time": "2020-06-26T12:05:46+00:00" 988 | }, 989 | { 990 | "name": "sebastian/complexity", 991 | "version": "2.0.0", 992 | "source": { 993 | "type": "git", 994 | "url": "https://github.com/sebastianbergmann/complexity.git", 995 | "reference": "33fcd6a26656c6546f70871244ecba4b4dced097" 996 | }, 997 | "dist": { 998 | "type": "zip", 999 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/33fcd6a26656c6546f70871244ecba4b4dced097", 1000 | "reference": "33fcd6a26656c6546f70871244ecba4b4dced097", 1001 | "shasum": "" 1002 | }, 1003 | "require": { 1004 | "nikic/php-parser": "^4.7", 1005 | "php": "^7.3 || ^8.0" 1006 | }, 1007 | "require-dev": { 1008 | "phpunit/phpunit": "^9.2" 1009 | }, 1010 | "type": "library", 1011 | "extra": { 1012 | "branch-alias": { 1013 | "dev-master": "2.0-dev" 1014 | } 1015 | }, 1016 | "autoload": { 1017 | "classmap": [ 1018 | "src/" 1019 | ] 1020 | }, 1021 | "notification-url": "https://packagist.org/downloads/", 1022 | "license": [ 1023 | "BSD-3-Clause" 1024 | ], 1025 | "authors": [ 1026 | { 1027 | "name": "Sebastian Bergmann", 1028 | "email": "sebastian@phpunit.de", 1029 | "role": "lead" 1030 | } 1031 | ], 1032 | "description": "Library for calculating the complexity of PHP code units", 1033 | "homepage": "https://github.com/sebastianbergmann/complexity", 1034 | "time": "2020-07-25T14:01:34+00:00" 1035 | }, 1036 | { 1037 | "name": "sebastian/diff", 1038 | "version": "4.0.2", 1039 | "source": { 1040 | "type": "git", 1041 | "url": "https://github.com/sebastianbergmann/diff.git", 1042 | "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113" 1043 | }, 1044 | "dist": { 1045 | "type": "zip", 1046 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", 1047 | "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", 1048 | "shasum": "" 1049 | }, 1050 | "require": { 1051 | "php": "^7.3 || ^8.0" 1052 | }, 1053 | "require-dev": { 1054 | "phpunit/phpunit": "^9.0", 1055 | "symfony/process": "^4.2 || ^5" 1056 | }, 1057 | "type": "library", 1058 | "extra": { 1059 | "branch-alias": { 1060 | "dev-master": "4.0-dev" 1061 | } 1062 | }, 1063 | "autoload": { 1064 | "classmap": [ 1065 | "src/" 1066 | ] 1067 | }, 1068 | "notification-url": "https://packagist.org/downloads/", 1069 | "license": [ 1070 | "BSD-3-Clause" 1071 | ], 1072 | "authors": [ 1073 | { 1074 | "name": "Sebastian Bergmann", 1075 | "email": "sebastian@phpunit.de" 1076 | }, 1077 | { 1078 | "name": "Kore Nordmann", 1079 | "email": "mail@kore-nordmann.de" 1080 | } 1081 | ], 1082 | "description": "Diff implementation", 1083 | "homepage": "https://github.com/sebastianbergmann/diff", 1084 | "keywords": [ 1085 | "diff", 1086 | "udiff", 1087 | "unidiff", 1088 | "unified diff" 1089 | ], 1090 | "time": "2020-06-30T04:46:02+00:00" 1091 | }, 1092 | { 1093 | "name": "sebastian/environment", 1094 | "version": "5.1.2", 1095 | "source": { 1096 | "type": "git", 1097 | "url": "https://github.com/sebastianbergmann/environment.git", 1098 | "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2" 1099 | }, 1100 | "dist": { 1101 | "type": "zip", 1102 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", 1103 | "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", 1104 | "shasum": "" 1105 | }, 1106 | "require": { 1107 | "php": "^7.3 || ^8.0" 1108 | }, 1109 | "require-dev": { 1110 | "phpunit/phpunit": "^9.0" 1111 | }, 1112 | "suggest": { 1113 | "ext-posix": "*" 1114 | }, 1115 | "type": "library", 1116 | "extra": { 1117 | "branch-alias": { 1118 | "dev-master": "5.0-dev" 1119 | } 1120 | }, 1121 | "autoload": { 1122 | "classmap": [ 1123 | "src/" 1124 | ] 1125 | }, 1126 | "notification-url": "https://packagist.org/downloads/", 1127 | "license": [ 1128 | "BSD-3-Clause" 1129 | ], 1130 | "authors": [ 1131 | { 1132 | "name": "Sebastian Bergmann", 1133 | "email": "sebastian@phpunit.de" 1134 | } 1135 | ], 1136 | "description": "Provides functionality to handle HHVM/PHP environments", 1137 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1138 | "keywords": [ 1139 | "Xdebug", 1140 | "environment", 1141 | "hhvm" 1142 | ], 1143 | "time": "2020-06-26T12:07:24+00:00" 1144 | }, 1145 | { 1146 | "name": "sebastian/exporter", 1147 | "version": "4.0.2", 1148 | "source": { 1149 | "type": "git", 1150 | "url": "https://github.com/sebastianbergmann/exporter.git", 1151 | "reference": "571d721db4aec847a0e59690b954af33ebf9f023" 1152 | }, 1153 | "dist": { 1154 | "type": "zip", 1155 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/571d721db4aec847a0e59690b954af33ebf9f023", 1156 | "reference": "571d721db4aec847a0e59690b954af33ebf9f023", 1157 | "shasum": "" 1158 | }, 1159 | "require": { 1160 | "php": "^7.3 || ^8.0", 1161 | "sebastian/recursion-context": "^4.0" 1162 | }, 1163 | "require-dev": { 1164 | "ext-mbstring": "*", 1165 | "phpunit/phpunit": "^9.2" 1166 | }, 1167 | "type": "library", 1168 | "extra": { 1169 | "branch-alias": { 1170 | "dev-master": "4.0-dev" 1171 | } 1172 | }, 1173 | "autoload": { 1174 | "classmap": [ 1175 | "src/" 1176 | ] 1177 | }, 1178 | "notification-url": "https://packagist.org/downloads/", 1179 | "license": [ 1180 | "BSD-3-Clause" 1181 | ], 1182 | "authors": [ 1183 | { 1184 | "name": "Sebastian Bergmann", 1185 | "email": "sebastian@phpunit.de" 1186 | }, 1187 | { 1188 | "name": "Jeff Welch", 1189 | "email": "whatthejeff@gmail.com" 1190 | }, 1191 | { 1192 | "name": "Volker Dusch", 1193 | "email": "github@wallbash.com" 1194 | }, 1195 | { 1196 | "name": "Adam Harvey", 1197 | "email": "aharvey@php.net" 1198 | }, 1199 | { 1200 | "name": "Bernhard Schussek", 1201 | "email": "bschussek@gmail.com" 1202 | } 1203 | ], 1204 | "description": "Provides the functionality to export PHP variables for visualization", 1205 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1206 | "keywords": [ 1207 | "export", 1208 | "exporter" 1209 | ], 1210 | "time": "2020-06-26T12:08:55+00:00" 1211 | }, 1212 | { 1213 | "name": "sebastian/global-state", 1214 | "version": "5.0.0", 1215 | "source": { 1216 | "type": "git", 1217 | "url": "https://github.com/sebastianbergmann/global-state.git", 1218 | "reference": "22ae663c951bdc39da96603edc3239ed3a299097" 1219 | }, 1220 | "dist": { 1221 | "type": "zip", 1222 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/22ae663c951bdc39da96603edc3239ed3a299097", 1223 | "reference": "22ae663c951bdc39da96603edc3239ed3a299097", 1224 | "shasum": "" 1225 | }, 1226 | "require": { 1227 | "php": "^7.3 || ^8.0", 1228 | "sebastian/object-reflector": "^2.0", 1229 | "sebastian/recursion-context": "^4.0" 1230 | }, 1231 | "require-dev": { 1232 | "ext-dom": "*", 1233 | "phpunit/phpunit": "^9.3" 1234 | }, 1235 | "suggest": { 1236 | "ext-uopz": "*" 1237 | }, 1238 | "type": "library", 1239 | "extra": { 1240 | "branch-alias": { 1241 | "dev-master": "5.0-dev" 1242 | } 1243 | }, 1244 | "autoload": { 1245 | "classmap": [ 1246 | "src/" 1247 | ] 1248 | }, 1249 | "notification-url": "https://packagist.org/downloads/", 1250 | "license": [ 1251 | "BSD-3-Clause" 1252 | ], 1253 | "authors": [ 1254 | { 1255 | "name": "Sebastian Bergmann", 1256 | "email": "sebastian@phpunit.de" 1257 | } 1258 | ], 1259 | "description": "Snapshotting of global state", 1260 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1261 | "keywords": [ 1262 | "global state" 1263 | ], 1264 | "time": "2020-08-07T04:09:03+00:00" 1265 | }, 1266 | { 1267 | "name": "sebastian/lines-of-code", 1268 | "version": "1.0.0", 1269 | "source": { 1270 | "type": "git", 1271 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1272 | "reference": "e02bf626f404b5daec382a7b8a6a4456e49017e5" 1273 | }, 1274 | "dist": { 1275 | "type": "zip", 1276 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e02bf626f404b5daec382a7b8a6a4456e49017e5", 1277 | "reference": "e02bf626f404b5daec382a7b8a6a4456e49017e5", 1278 | "shasum": "" 1279 | }, 1280 | "require": { 1281 | "nikic/php-parser": "^4.6", 1282 | "php": "^7.3 || ^8.0" 1283 | }, 1284 | "require-dev": { 1285 | "phpunit/phpunit": "^9.2" 1286 | }, 1287 | "type": "library", 1288 | "extra": { 1289 | "branch-alias": { 1290 | "dev-master": "1.0-dev" 1291 | } 1292 | }, 1293 | "autoload": { 1294 | "classmap": [ 1295 | "src/" 1296 | ] 1297 | }, 1298 | "notification-url": "https://packagist.org/downloads/", 1299 | "license": [ 1300 | "BSD-3-Clause" 1301 | ], 1302 | "authors": [ 1303 | { 1304 | "name": "Sebastian Bergmann", 1305 | "email": "sebastian@phpunit.de", 1306 | "role": "lead" 1307 | } 1308 | ], 1309 | "description": "Library for counting the lines of code in PHP source code", 1310 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1311 | "time": "2020-07-22T18:33:42+00:00" 1312 | }, 1313 | { 1314 | "name": "sebastian/object-enumerator", 1315 | "version": "4.0.2", 1316 | "source": { 1317 | "type": "git", 1318 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1319 | "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8" 1320 | }, 1321 | "dist": { 1322 | "type": "zip", 1323 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/074fed2d0a6d08e1677dd8ce9d32aecb384917b8", 1324 | "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8", 1325 | "shasum": "" 1326 | }, 1327 | "require": { 1328 | "php": "^7.3 || ^8.0", 1329 | "sebastian/object-reflector": "^2.0", 1330 | "sebastian/recursion-context": "^4.0" 1331 | }, 1332 | "require-dev": { 1333 | "phpunit/phpunit": "^9.0" 1334 | }, 1335 | "type": "library", 1336 | "extra": { 1337 | "branch-alias": { 1338 | "dev-master": "4.0-dev" 1339 | } 1340 | }, 1341 | "autoload": { 1342 | "classmap": [ 1343 | "src/" 1344 | ] 1345 | }, 1346 | "notification-url": "https://packagist.org/downloads/", 1347 | "license": [ 1348 | "BSD-3-Clause" 1349 | ], 1350 | "authors": [ 1351 | { 1352 | "name": "Sebastian Bergmann", 1353 | "email": "sebastian@phpunit.de" 1354 | } 1355 | ], 1356 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1357 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1358 | "time": "2020-06-26T12:11:32+00:00" 1359 | }, 1360 | { 1361 | "name": "sebastian/object-reflector", 1362 | "version": "2.0.2", 1363 | "source": { 1364 | "type": "git", 1365 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1366 | "reference": "127a46f6b057441b201253526f81d5406d6c7840" 1367 | }, 1368 | "dist": { 1369 | "type": "zip", 1370 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/127a46f6b057441b201253526f81d5406d6c7840", 1371 | "reference": "127a46f6b057441b201253526f81d5406d6c7840", 1372 | "shasum": "" 1373 | }, 1374 | "require": { 1375 | "php": "^7.3 || ^8.0" 1376 | }, 1377 | "require-dev": { 1378 | "phpunit/phpunit": "^9.0" 1379 | }, 1380 | "type": "library", 1381 | "extra": { 1382 | "branch-alias": { 1383 | "dev-master": "2.0-dev" 1384 | } 1385 | }, 1386 | "autoload": { 1387 | "classmap": [ 1388 | "src/" 1389 | ] 1390 | }, 1391 | "notification-url": "https://packagist.org/downloads/", 1392 | "license": [ 1393 | "BSD-3-Clause" 1394 | ], 1395 | "authors": [ 1396 | { 1397 | "name": "Sebastian Bergmann", 1398 | "email": "sebastian@phpunit.de" 1399 | } 1400 | ], 1401 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1402 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1403 | "time": "2020-06-26T12:12:55+00:00" 1404 | }, 1405 | { 1406 | "name": "sebastian/recursion-context", 1407 | "version": "4.0.2", 1408 | "source": { 1409 | "type": "git", 1410 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1411 | "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63" 1412 | }, 1413 | "dist": { 1414 | "type": "zip", 1415 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/062231bf61d2b9448c4fa5a7643b5e1829c11d63", 1416 | "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63", 1417 | "shasum": "" 1418 | }, 1419 | "require": { 1420 | "php": "^7.3 || ^8.0" 1421 | }, 1422 | "require-dev": { 1423 | "phpunit/phpunit": "^9.0" 1424 | }, 1425 | "type": "library", 1426 | "extra": { 1427 | "branch-alias": { 1428 | "dev-master": "4.0-dev" 1429 | } 1430 | }, 1431 | "autoload": { 1432 | "classmap": [ 1433 | "src/" 1434 | ] 1435 | }, 1436 | "notification-url": "https://packagist.org/downloads/", 1437 | "license": [ 1438 | "BSD-3-Clause" 1439 | ], 1440 | "authors": [ 1441 | { 1442 | "name": "Sebastian Bergmann", 1443 | "email": "sebastian@phpunit.de" 1444 | }, 1445 | { 1446 | "name": "Jeff Welch", 1447 | "email": "whatthejeff@gmail.com" 1448 | }, 1449 | { 1450 | "name": "Adam Harvey", 1451 | "email": "aharvey@php.net" 1452 | } 1453 | ], 1454 | "description": "Provides functionality to recursively process PHP variables", 1455 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1456 | "time": "2020-06-26T12:14:17+00:00" 1457 | }, 1458 | { 1459 | "name": "sebastian/resource-operations", 1460 | "version": "3.0.2", 1461 | "source": { 1462 | "type": "git", 1463 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1464 | "reference": "0653718a5a629b065e91f774595267f8dc32e213" 1465 | }, 1466 | "dist": { 1467 | "type": "zip", 1468 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0653718a5a629b065e91f774595267f8dc32e213", 1469 | "reference": "0653718a5a629b065e91f774595267f8dc32e213", 1470 | "shasum": "" 1471 | }, 1472 | "require": { 1473 | "php": "^7.3 || ^8.0" 1474 | }, 1475 | "require-dev": { 1476 | "phpunit/phpunit": "^9.0" 1477 | }, 1478 | "type": "library", 1479 | "extra": { 1480 | "branch-alias": { 1481 | "dev-master": "3.0-dev" 1482 | } 1483 | }, 1484 | "autoload": { 1485 | "classmap": [ 1486 | "src/" 1487 | ] 1488 | }, 1489 | "notification-url": "https://packagist.org/downloads/", 1490 | "license": [ 1491 | "BSD-3-Clause" 1492 | ], 1493 | "authors": [ 1494 | { 1495 | "name": "Sebastian Bergmann", 1496 | "email": "sebastian@phpunit.de" 1497 | } 1498 | ], 1499 | "description": "Provides a list of PHP built-in functions that operate on resources", 1500 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1501 | "time": "2020-06-26T12:16:22+00:00" 1502 | }, 1503 | { 1504 | "name": "sebastian/type", 1505 | "version": "2.2.1", 1506 | "source": { 1507 | "type": "git", 1508 | "url": "https://github.com/sebastianbergmann/type.git", 1509 | "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a" 1510 | }, 1511 | "dist": { 1512 | "type": "zip", 1513 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/86991e2b33446cd96e648c18bcdb1e95afb2c05a", 1514 | "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a", 1515 | "shasum": "" 1516 | }, 1517 | "require": { 1518 | "php": "^7.3 || ^8.0" 1519 | }, 1520 | "require-dev": { 1521 | "phpunit/phpunit": "^9.2" 1522 | }, 1523 | "type": "library", 1524 | "extra": { 1525 | "branch-alias": { 1526 | "dev-master": "2.2-dev" 1527 | } 1528 | }, 1529 | "autoload": { 1530 | "classmap": [ 1531 | "src/" 1532 | ] 1533 | }, 1534 | "notification-url": "https://packagist.org/downloads/", 1535 | "license": [ 1536 | "BSD-3-Clause" 1537 | ], 1538 | "authors": [ 1539 | { 1540 | "name": "Sebastian Bergmann", 1541 | "email": "sebastian@phpunit.de", 1542 | "role": "lead" 1543 | } 1544 | ], 1545 | "description": "Collection of value objects that represent the types of the PHP type system", 1546 | "homepage": "https://github.com/sebastianbergmann/type", 1547 | "time": "2020-07-05T08:31:53+00:00" 1548 | }, 1549 | { 1550 | "name": "sebastian/version", 1551 | "version": "3.0.1", 1552 | "source": { 1553 | "type": "git", 1554 | "url": "https://github.com/sebastianbergmann/version.git", 1555 | "reference": "626586115d0ed31cb71483be55beb759b5af5a3c" 1556 | }, 1557 | "dist": { 1558 | "type": "zip", 1559 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/626586115d0ed31cb71483be55beb759b5af5a3c", 1560 | "reference": "626586115d0ed31cb71483be55beb759b5af5a3c", 1561 | "shasum": "" 1562 | }, 1563 | "require": { 1564 | "php": "^7.3 || ^8.0" 1565 | }, 1566 | "type": "library", 1567 | "extra": { 1568 | "branch-alias": { 1569 | "dev-master": "3.0-dev" 1570 | } 1571 | }, 1572 | "autoload": { 1573 | "classmap": [ 1574 | "src/" 1575 | ] 1576 | }, 1577 | "notification-url": "https://packagist.org/downloads/", 1578 | "license": [ 1579 | "BSD-3-Clause" 1580 | ], 1581 | "authors": [ 1582 | { 1583 | "name": "Sebastian Bergmann", 1584 | "email": "sebastian@phpunit.de", 1585 | "role": "lead" 1586 | } 1587 | ], 1588 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1589 | "homepage": "https://github.com/sebastianbergmann/version", 1590 | "time": "2020-06-26T12:18:43+00:00" 1591 | }, 1592 | { 1593 | "name": "symfony/polyfill-ctype", 1594 | "version": "v1.18.1", 1595 | "source": { 1596 | "type": "git", 1597 | "url": "https://github.com/symfony/polyfill-ctype.git", 1598 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" 1599 | }, 1600 | "dist": { 1601 | "type": "zip", 1602 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", 1603 | "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", 1604 | "shasum": "" 1605 | }, 1606 | "require": { 1607 | "php": ">=5.3.3" 1608 | }, 1609 | "suggest": { 1610 | "ext-ctype": "For best performance" 1611 | }, 1612 | "type": "library", 1613 | "extra": { 1614 | "branch-alias": { 1615 | "dev-master": "1.18-dev" 1616 | }, 1617 | "thanks": { 1618 | "name": "symfony/polyfill", 1619 | "url": "https://github.com/symfony/polyfill" 1620 | } 1621 | }, 1622 | "autoload": { 1623 | "psr-4": { 1624 | "Symfony\\Polyfill\\Ctype\\": "" 1625 | }, 1626 | "files": [ 1627 | "bootstrap.php" 1628 | ] 1629 | }, 1630 | "notification-url": "https://packagist.org/downloads/", 1631 | "license": [ 1632 | "MIT" 1633 | ], 1634 | "authors": [ 1635 | { 1636 | "name": "Gert de Pagter", 1637 | "email": "BackEndTea@gmail.com" 1638 | }, 1639 | { 1640 | "name": "Symfony Community", 1641 | "homepage": "https://symfony.com/contributors" 1642 | } 1643 | ], 1644 | "description": "Symfony polyfill for ctype functions", 1645 | "homepage": "https://symfony.com", 1646 | "keywords": [ 1647 | "compatibility", 1648 | "ctype", 1649 | "polyfill", 1650 | "portable" 1651 | ], 1652 | "time": "2020-07-14T12:35:20+00:00" 1653 | }, 1654 | { 1655 | "name": "theseer/tokenizer", 1656 | "version": "1.2.0", 1657 | "source": { 1658 | "type": "git", 1659 | "url": "https://github.com/theseer/tokenizer.git", 1660 | "reference": "75a63c33a8577608444246075ea0af0d052e452a" 1661 | }, 1662 | "dist": { 1663 | "type": "zip", 1664 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", 1665 | "reference": "75a63c33a8577608444246075ea0af0d052e452a", 1666 | "shasum": "" 1667 | }, 1668 | "require": { 1669 | "ext-dom": "*", 1670 | "ext-tokenizer": "*", 1671 | "ext-xmlwriter": "*", 1672 | "php": "^7.2 || ^8.0" 1673 | }, 1674 | "type": "library", 1675 | "autoload": { 1676 | "classmap": [ 1677 | "src/" 1678 | ] 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "BSD-3-Clause" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Arne Blankerts", 1687 | "email": "arne@blankerts.de", 1688 | "role": "Developer" 1689 | } 1690 | ], 1691 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1692 | "time": "2020-07-12T23:59:07+00:00" 1693 | }, 1694 | { 1695 | "name": "webmozart/assert", 1696 | "version": "1.9.1", 1697 | "source": { 1698 | "type": "git", 1699 | "url": "https://github.com/webmozart/assert.git", 1700 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" 1701 | }, 1702 | "dist": { 1703 | "type": "zip", 1704 | "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", 1705 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", 1706 | "shasum": "" 1707 | }, 1708 | "require": { 1709 | "php": "^5.3.3 || ^7.0 || ^8.0", 1710 | "symfony/polyfill-ctype": "^1.8" 1711 | }, 1712 | "conflict": { 1713 | "phpstan/phpstan": "<0.12.20", 1714 | "vimeo/psalm": "<3.9.1" 1715 | }, 1716 | "require-dev": { 1717 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1718 | }, 1719 | "type": "library", 1720 | "autoload": { 1721 | "psr-4": { 1722 | "Webmozart\\Assert\\": "src/" 1723 | } 1724 | }, 1725 | "notification-url": "https://packagist.org/downloads/", 1726 | "license": [ 1727 | "MIT" 1728 | ], 1729 | "authors": [ 1730 | { 1731 | "name": "Bernhard Schussek", 1732 | "email": "bschussek@gmail.com" 1733 | } 1734 | ], 1735 | "description": "Assertions to validate method input/output with nice error messages.", 1736 | "keywords": [ 1737 | "assert", 1738 | "check", 1739 | "validate" 1740 | ], 1741 | "time": "2020-07-08T17:02:28+00:00" 1742 | } 1743 | ], 1744 | "aliases": [], 1745 | "minimum-stability": "stable", 1746 | "stability-flags": [], 1747 | "prefer-stable": false, 1748 | "prefer-lowest": false, 1749 | "platform": [], 1750 | "platform-dev": [] 1751 | } 1752 | --------------------------------------------------------------------------------