├── .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 |
--------------------------------------------------------------------------------