├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── README.md
├── composer.json
├── composer.lock
├── docker-compose.yml
├── docker
└── app
│ └── Dockerfile
├── phpargsdetector
└── src
├── Commands
└── InspectCommand.php
├── Detector.php
├── Method.php
├── NodeMethodExplorer.php
├── Printers
└── Console.php
└── Visitors
└── FileVisitor.php
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: build
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 | runs-on: ubuntu-latest
8 |
9 | strategy:
10 | matrix:
11 | php: [7.3, 7.4, 8.0, 8.1]
12 |
13 | steps:
14 | - uses: actions/checkout@v1
15 |
16 | - name: Set PHP version
17 | uses: shivammathur/setup-php@v2
18 | with:
19 | php-version: ${{ matrix.php }}
20 |
21 | - name: Install composer dependencies
22 | run: composer update --quiet --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | vendor/
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/DeGraciaMathieu/php-arguments-detector/actions/workflows/build.yml)
2 | []([https://github.com/DeGraciaMathieu/php-arguments-detector/actions/workflows/build.yml](https://img.shields.io/packagist/v/DeGraciaMathieu/php-arguments-detector))
3 | []([https://img.shields.io/badge/php%20versions-7.3%20%7C%207.4%20%7C%20%5E8-blue](https://img.shields.io/badge/php%20versions-7.3%20%7C%207.4%20%7C%20%5E8-blue))
4 |
5 | # php arguments detector
6 | > The ideal number of arguments for a function is zero. ~ Robert C. Martin
7 |
8 | Keep control over the complexity of your methods by checking that they do not have too many arguments with this package.
9 | ## Installation
10 | Requires >= PHP 7.3
11 | ```
12 | composer require degraciamathieu/php-arguments-detector --dev
13 | ```
14 | ## Usage
15 | ```
16 | vendor/bin/phpargsdetector inspect {folder}
17 | ```
18 | ## Options
19 | | options | description |
20 | |-----------------------|-------------|
21 | | --min-args= | Ignore methods with less than --min-args arguments. |
22 | | --max-args= | Ignore methods with more than --max-args arguments. |
23 | | --min-weight= | Ignore methods with less than --min-weight weight. |
24 | | --max-weight= | Ignore methods with more than --max-weight weight. |
25 | | --limit= | Number of methods displayed. |
26 | | --without-constructor | Ignore method constructors from detection. |
27 | | --sort-by-weight | Sort the results by the weight of methods. |
28 | ## Examples
29 | ```
30 | vendor/bin/phpargsdetector inspect app/Services/Saml/
31 |
32 | +------------------------------------------+------------------+-----------+--------+
33 | | Files | Methods | Arguments | Weight |
34 | +------------------------------------------+------------------+-----------+--------+
35 | | app/Services/Saml/SamlMessageFactory.php | __construct | 2 | 2 |
36 | | app/Services/Saml/SamlMessageFactory.php | makeSamlResponse | 2 | 68 |
37 | | app/Services/Saml/SamlSecurity.php | checkSignature | 2 | 18 |
38 | | app/Services/Saml/SamlIssuer.php | find | 1 | 3 |
39 | | app/Services/Saml/SamlKeeper.php | keep | 1 | 1 |
40 | | app/Services/Saml/SamlMessageFactory.php | addAttributes | 1 | 26 |
41 | | app/Services/Saml/SamlMessageFactory.php | sign | 1 | 12 |
42 | | app/Services/Saml/SamlResponder.php | launch | 1 | 10 |
43 | | app/Services/Saml/SamlKeeper.php | has | 0 | 0 |
44 | | app/Services/Saml/SamlKeeper.php | retrieve | 0 | 0 |
45 | +------------------------------------------+------------------+-----------+--------+
46 | Total of methods : 10
47 | ```
48 | ```
49 | vendor/bin/phpargsdetector inspect app/ --limit=3 --min-args=2 --without-constructor
50 |
51 | +-------------------------------------------------+---------+-----------+--------+
52 | | Files | Methods | Arguments | Weight |
53 | +-------------------------------------------------+---------+-----------+--------+
54 | | app/Http/Middleware/RedirectIfAuthenticated.php | handle | 3 | 27 |
55 | | app/Http/Controllers/IssuerController.php | update | 2 | 24 |
56 | | app/Http/Controllers/RestrictionController.php | update | 2 | 28 |
57 | +-------------------------------------------------+---------+-----------+--------+
58 | Total of methods : 3
59 | ```
60 | ```
61 | vendor/bin/phpargsdetector inspect app/ --limit=3 --sort-by-weight
62 |
63 | +-------------------------------------------------+------------------+-----------+--------+
64 | | Files | Methods | Arguments | Weight |
65 | +-------------------------------------------------+------------------+-----------+--------+
66 | | app/Services/Saml/SamlMessageFactory.php | makeSamlResponse | 2 | 68 |
67 | | app/Http/Controllers/RestrictionController.php | update | 2 | 28 |
68 | | app/Http/Middleware/RedirectIfAuthenticated.php | handle | 3 | 27 |
69 | +-------------------------------------------------+------------------+-----------+--------+
70 | Total of methods : 3
71 | ```
72 | ## Weight
73 | The weight is the number of arguments multiplied by the number of lines of the method.
74 |
75 | The weight of the `foo` method is 10 : 2 arguments * 5 lines.
76 |
77 | ```php
78 | class Bar {
79 | public function foo($a, $b)
80 | {
81 | if ($a) {
82 | //
83 | }
84 |
85 | return $b;
86 | }
87 | }
88 | ```
89 |
90 | You can use it as a complexity indicator.
91 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "degraciamathieu/php-arguments-detector",
3 | "type": "package",
4 | "description": "Keep control over the complexity of your methods by checking that they do not have too many arguments.",
5 | "homepage": "https://github.com/DeGraciaMathieu/php-arguments-detector",
6 | "license": "MIT",
7 | "authors": [
8 | {
9 | "name": "De Gracia Mathieu",
10 | "email": "dev@degracia-mathieu.fr"
11 | }
12 | ],
13 | "require": {
14 | "php": "^7.3 || ^7.4 || ^8.0",
15 | "symfony/console": "^4.4 || ^5.0 || ^6.0",
16 | "symfony/finder": "^4.4 || ^5.0 || ^6.0",
17 | "nikic/php-parser": "^4.13"
18 | },
19 | "require-dev": {
20 | "phpunit/phpunit": "^9.5",
21 | "symfony/var-dumper": "^5.1|^6.1"
22 | },
23 | "autoload": {
24 | "psr-4": {
25 | "DeGraciaMathieu\\PhpArgsDetector\\": "src/"
26 | }
27 | },
28 | "autoload-dev": {
29 | "psr-4": {
30 | "DeGraciaMathieu\\PhpArgsDetector\\Tests\\": "tests/"
31 | }
32 | },
33 | "bin": [
34 | "phpargsdetector"
35 | ]
36 | }
37 |
--------------------------------------------------------------------------------
/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": "5309496091b626c228d4bd1e9a9b2005",
8 | "packages": [
9 | {
10 | "name": "nikic/php-parser",
11 | "version": "v4.14.0",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/nikic/PHP-Parser.git",
15 | "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
20 | "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "ext-tokenizer": "*",
25 | "php": ">=7.0"
26 | },
27 | "require-dev": {
28 | "ircmaxell/php-yacc": "^0.0.7",
29 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
30 | },
31 | "bin": [
32 | "bin/php-parse"
33 | ],
34 | "type": "library",
35 | "extra": {
36 | "branch-alias": {
37 | "dev-master": "4.9-dev"
38 | }
39 | },
40 | "autoload": {
41 | "psr-4": {
42 | "PhpParser\\": "lib/PhpParser"
43 | }
44 | },
45 | "notification-url": "https://packagist.org/downloads/",
46 | "license": [
47 | "BSD-3-Clause"
48 | ],
49 | "authors": [
50 | {
51 | "name": "Nikita Popov"
52 | }
53 | ],
54 | "description": "A PHP parser written in PHP",
55 | "keywords": [
56 | "parser",
57 | "php"
58 | ],
59 | "support": {
60 | "issues": "https://github.com/nikic/PHP-Parser/issues",
61 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
62 | },
63 | "time": "2022-05-31T20:59:12+00:00"
64 | },
65 | {
66 | "name": "phpunit/php-timer",
67 | "version": "5.0.3",
68 | "source": {
69 | "type": "git",
70 | "url": "https://github.com/sebastianbergmann/php-timer.git",
71 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
72 | },
73 | "dist": {
74 | "type": "zip",
75 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
76 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
77 | "shasum": ""
78 | },
79 | "require": {
80 | "php": ">=7.3"
81 | },
82 | "require-dev": {
83 | "phpunit/phpunit": "^9.3"
84 | },
85 | "type": "library",
86 | "extra": {
87 | "branch-alias": {
88 | "dev-master": "5.0-dev"
89 | }
90 | },
91 | "autoload": {
92 | "classmap": [
93 | "src/"
94 | ]
95 | },
96 | "notification-url": "https://packagist.org/downloads/",
97 | "license": [
98 | "BSD-3-Clause"
99 | ],
100 | "authors": [
101 | {
102 | "name": "Sebastian Bergmann",
103 | "email": "sebastian@phpunit.de",
104 | "role": "lead"
105 | }
106 | ],
107 | "description": "Utility class for timing",
108 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
109 | "keywords": [
110 | "timer"
111 | ],
112 | "support": {
113 | "issues": "https://github.com/sebastianbergmann/php-timer/issues",
114 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
115 | },
116 | "funding": [
117 | {
118 | "url": "https://github.com/sebastianbergmann",
119 | "type": "github"
120 | }
121 | ],
122 | "time": "2020-10-26T13:16:10+00:00"
123 | },
124 | {
125 | "name": "psr/container",
126 | "version": "2.0.2",
127 | "source": {
128 | "type": "git",
129 | "url": "https://github.com/php-fig/container.git",
130 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
131 | },
132 | "dist": {
133 | "type": "zip",
134 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
135 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
136 | "shasum": ""
137 | },
138 | "require": {
139 | "php": ">=7.4.0"
140 | },
141 | "type": "library",
142 | "extra": {
143 | "branch-alias": {
144 | "dev-master": "2.0.x-dev"
145 | }
146 | },
147 | "autoload": {
148 | "psr-4": {
149 | "Psr\\Container\\": "src/"
150 | }
151 | },
152 | "notification-url": "https://packagist.org/downloads/",
153 | "license": [
154 | "MIT"
155 | ],
156 | "authors": [
157 | {
158 | "name": "PHP-FIG",
159 | "homepage": "https://www.php-fig.org/"
160 | }
161 | ],
162 | "description": "Common Container Interface (PHP FIG PSR-11)",
163 | "homepage": "https://github.com/php-fig/container",
164 | "keywords": [
165 | "PSR-11",
166 | "container",
167 | "container-interface",
168 | "container-interop",
169 | "psr"
170 | ],
171 | "support": {
172 | "issues": "https://github.com/php-fig/container/issues",
173 | "source": "https://github.com/php-fig/container/tree/2.0.2"
174 | },
175 | "time": "2021-11-05T16:47:00+00:00"
176 | },
177 | {
178 | "name": "symfony/console",
179 | "version": "v6.1.3",
180 | "source": {
181 | "type": "git",
182 | "url": "https://github.com/symfony/console.git",
183 | "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8"
184 | },
185 | "dist": {
186 | "type": "zip",
187 | "url": "https://api.github.com/repos/symfony/console/zipball/43fcb5c5966b43c56bcfa481368d90d748936ab8",
188 | "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8",
189 | "shasum": ""
190 | },
191 | "require": {
192 | "php": ">=8.1",
193 | "symfony/deprecation-contracts": "^2.1|^3",
194 | "symfony/polyfill-mbstring": "~1.0",
195 | "symfony/service-contracts": "^1.1|^2|^3",
196 | "symfony/string": "^5.4|^6.0"
197 | },
198 | "conflict": {
199 | "symfony/dependency-injection": "<5.4",
200 | "symfony/dotenv": "<5.4",
201 | "symfony/event-dispatcher": "<5.4",
202 | "symfony/lock": "<5.4",
203 | "symfony/process": "<5.4"
204 | },
205 | "provide": {
206 | "psr/log-implementation": "1.0|2.0|3.0"
207 | },
208 | "require-dev": {
209 | "psr/log": "^1|^2|^3",
210 | "symfony/config": "^5.4|^6.0",
211 | "symfony/dependency-injection": "^5.4|^6.0",
212 | "symfony/event-dispatcher": "^5.4|^6.0",
213 | "symfony/lock": "^5.4|^6.0",
214 | "symfony/process": "^5.4|^6.0",
215 | "symfony/var-dumper": "^5.4|^6.0"
216 | },
217 | "suggest": {
218 | "psr/log": "For using the console logger",
219 | "symfony/event-dispatcher": "",
220 | "symfony/lock": "",
221 | "symfony/process": ""
222 | },
223 | "type": "library",
224 | "autoload": {
225 | "psr-4": {
226 | "Symfony\\Component\\Console\\": ""
227 | },
228 | "exclude-from-classmap": [
229 | "/Tests/"
230 | ]
231 | },
232 | "notification-url": "https://packagist.org/downloads/",
233 | "license": [
234 | "MIT"
235 | ],
236 | "authors": [
237 | {
238 | "name": "Fabien Potencier",
239 | "email": "fabien@symfony.com"
240 | },
241 | {
242 | "name": "Symfony Community",
243 | "homepage": "https://symfony.com/contributors"
244 | }
245 | ],
246 | "description": "Eases the creation of beautiful and testable command line interfaces",
247 | "homepage": "https://symfony.com",
248 | "keywords": [
249 | "cli",
250 | "command line",
251 | "console",
252 | "terminal"
253 | ],
254 | "support": {
255 | "source": "https://github.com/symfony/console/tree/v6.1.3"
256 | },
257 | "funding": [
258 | {
259 | "url": "https://symfony.com/sponsor",
260 | "type": "custom"
261 | },
262 | {
263 | "url": "https://github.com/fabpot",
264 | "type": "github"
265 | },
266 | {
267 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
268 | "type": "tidelift"
269 | }
270 | ],
271 | "time": "2022-07-22T14:17:57+00:00"
272 | },
273 | {
274 | "name": "symfony/deprecation-contracts",
275 | "version": "v3.1.1",
276 | "source": {
277 | "type": "git",
278 | "url": "https://github.com/symfony/deprecation-contracts.git",
279 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
280 | },
281 | "dist": {
282 | "type": "zip",
283 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
284 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
285 | "shasum": ""
286 | },
287 | "require": {
288 | "php": ">=8.1"
289 | },
290 | "type": "library",
291 | "extra": {
292 | "branch-alias": {
293 | "dev-main": "3.1-dev"
294 | },
295 | "thanks": {
296 | "name": "symfony/contracts",
297 | "url": "https://github.com/symfony/contracts"
298 | }
299 | },
300 | "autoload": {
301 | "files": [
302 | "function.php"
303 | ]
304 | },
305 | "notification-url": "https://packagist.org/downloads/",
306 | "license": [
307 | "MIT"
308 | ],
309 | "authors": [
310 | {
311 | "name": "Nicolas Grekas",
312 | "email": "p@tchwork.com"
313 | },
314 | {
315 | "name": "Symfony Community",
316 | "homepage": "https://symfony.com/contributors"
317 | }
318 | ],
319 | "description": "A generic function and convention to trigger deprecation notices",
320 | "homepage": "https://symfony.com",
321 | "support": {
322 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1"
323 | },
324 | "funding": [
325 | {
326 | "url": "https://symfony.com/sponsor",
327 | "type": "custom"
328 | },
329 | {
330 | "url": "https://github.com/fabpot",
331 | "type": "github"
332 | },
333 | {
334 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
335 | "type": "tidelift"
336 | }
337 | ],
338 | "time": "2022-02-25T11:15:52+00:00"
339 | },
340 | {
341 | "name": "symfony/finder",
342 | "version": "v6.1.3",
343 | "source": {
344 | "type": "git",
345 | "url": "https://github.com/symfony/finder.git",
346 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709"
347 | },
348 | "dist": {
349 | "type": "zip",
350 | "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709",
351 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709",
352 | "shasum": ""
353 | },
354 | "require": {
355 | "php": ">=8.1"
356 | },
357 | "require-dev": {
358 | "symfony/filesystem": "^6.0"
359 | },
360 | "type": "library",
361 | "autoload": {
362 | "psr-4": {
363 | "Symfony\\Component\\Finder\\": ""
364 | },
365 | "exclude-from-classmap": [
366 | "/Tests/"
367 | ]
368 | },
369 | "notification-url": "https://packagist.org/downloads/",
370 | "license": [
371 | "MIT"
372 | ],
373 | "authors": [
374 | {
375 | "name": "Fabien Potencier",
376 | "email": "fabien@symfony.com"
377 | },
378 | {
379 | "name": "Symfony Community",
380 | "homepage": "https://symfony.com/contributors"
381 | }
382 | ],
383 | "description": "Finds files and directories via an intuitive fluent interface",
384 | "homepage": "https://symfony.com",
385 | "support": {
386 | "source": "https://github.com/symfony/finder/tree/v6.1.3"
387 | },
388 | "funding": [
389 | {
390 | "url": "https://symfony.com/sponsor",
391 | "type": "custom"
392 | },
393 | {
394 | "url": "https://github.com/fabpot",
395 | "type": "github"
396 | },
397 | {
398 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
399 | "type": "tidelift"
400 | }
401 | ],
402 | "time": "2022-07-29T07:42:06+00:00"
403 | },
404 | {
405 | "name": "symfony/polyfill-ctype",
406 | "version": "v1.26.0",
407 | "source": {
408 | "type": "git",
409 | "url": "https://github.com/symfony/polyfill-ctype.git",
410 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
411 | },
412 | "dist": {
413 | "type": "zip",
414 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
415 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
416 | "shasum": ""
417 | },
418 | "require": {
419 | "php": ">=7.1"
420 | },
421 | "provide": {
422 | "ext-ctype": "*"
423 | },
424 | "suggest": {
425 | "ext-ctype": "For best performance"
426 | },
427 | "type": "library",
428 | "extra": {
429 | "branch-alias": {
430 | "dev-main": "1.26-dev"
431 | },
432 | "thanks": {
433 | "name": "symfony/polyfill",
434 | "url": "https://github.com/symfony/polyfill"
435 | }
436 | },
437 | "autoload": {
438 | "files": [
439 | "bootstrap.php"
440 | ],
441 | "psr-4": {
442 | "Symfony\\Polyfill\\Ctype\\": ""
443 | }
444 | },
445 | "notification-url": "https://packagist.org/downloads/",
446 | "license": [
447 | "MIT"
448 | ],
449 | "authors": [
450 | {
451 | "name": "Gert de Pagter",
452 | "email": "BackEndTea@gmail.com"
453 | },
454 | {
455 | "name": "Symfony Community",
456 | "homepage": "https://symfony.com/contributors"
457 | }
458 | ],
459 | "description": "Symfony polyfill for ctype functions",
460 | "homepage": "https://symfony.com",
461 | "keywords": [
462 | "compatibility",
463 | "ctype",
464 | "polyfill",
465 | "portable"
466 | ],
467 | "support": {
468 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
469 | },
470 | "funding": [
471 | {
472 | "url": "https://symfony.com/sponsor",
473 | "type": "custom"
474 | },
475 | {
476 | "url": "https://github.com/fabpot",
477 | "type": "github"
478 | },
479 | {
480 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
481 | "type": "tidelift"
482 | }
483 | ],
484 | "time": "2022-05-24T11:49:31+00:00"
485 | },
486 | {
487 | "name": "symfony/polyfill-intl-grapheme",
488 | "version": "v1.26.0",
489 | "source": {
490 | "type": "git",
491 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
492 | "reference": "433d05519ce6990bf3530fba6957499d327395c2"
493 | },
494 | "dist": {
495 | "type": "zip",
496 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
497 | "reference": "433d05519ce6990bf3530fba6957499d327395c2",
498 | "shasum": ""
499 | },
500 | "require": {
501 | "php": ">=7.1"
502 | },
503 | "suggest": {
504 | "ext-intl": "For best performance"
505 | },
506 | "type": "library",
507 | "extra": {
508 | "branch-alias": {
509 | "dev-main": "1.26-dev"
510 | },
511 | "thanks": {
512 | "name": "symfony/polyfill",
513 | "url": "https://github.com/symfony/polyfill"
514 | }
515 | },
516 | "autoload": {
517 | "files": [
518 | "bootstrap.php"
519 | ],
520 | "psr-4": {
521 | "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
522 | }
523 | },
524 | "notification-url": "https://packagist.org/downloads/",
525 | "license": [
526 | "MIT"
527 | ],
528 | "authors": [
529 | {
530 | "name": "Nicolas Grekas",
531 | "email": "p@tchwork.com"
532 | },
533 | {
534 | "name": "Symfony Community",
535 | "homepage": "https://symfony.com/contributors"
536 | }
537 | ],
538 | "description": "Symfony polyfill for intl's grapheme_* functions",
539 | "homepage": "https://symfony.com",
540 | "keywords": [
541 | "compatibility",
542 | "grapheme",
543 | "intl",
544 | "polyfill",
545 | "portable",
546 | "shim"
547 | ],
548 | "support": {
549 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
550 | },
551 | "funding": [
552 | {
553 | "url": "https://symfony.com/sponsor",
554 | "type": "custom"
555 | },
556 | {
557 | "url": "https://github.com/fabpot",
558 | "type": "github"
559 | },
560 | {
561 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
562 | "type": "tidelift"
563 | }
564 | ],
565 | "time": "2022-05-24T11:49:31+00:00"
566 | },
567 | {
568 | "name": "symfony/polyfill-intl-normalizer",
569 | "version": "v1.26.0",
570 | "source": {
571 | "type": "git",
572 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
573 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
574 | },
575 | "dist": {
576 | "type": "zip",
577 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
578 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
579 | "shasum": ""
580 | },
581 | "require": {
582 | "php": ">=7.1"
583 | },
584 | "suggest": {
585 | "ext-intl": "For best performance"
586 | },
587 | "type": "library",
588 | "extra": {
589 | "branch-alias": {
590 | "dev-main": "1.26-dev"
591 | },
592 | "thanks": {
593 | "name": "symfony/polyfill",
594 | "url": "https://github.com/symfony/polyfill"
595 | }
596 | },
597 | "autoload": {
598 | "files": [
599 | "bootstrap.php"
600 | ],
601 | "psr-4": {
602 | "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
603 | },
604 | "classmap": [
605 | "Resources/stubs"
606 | ]
607 | },
608 | "notification-url": "https://packagist.org/downloads/",
609 | "license": [
610 | "MIT"
611 | ],
612 | "authors": [
613 | {
614 | "name": "Nicolas Grekas",
615 | "email": "p@tchwork.com"
616 | },
617 | {
618 | "name": "Symfony Community",
619 | "homepage": "https://symfony.com/contributors"
620 | }
621 | ],
622 | "description": "Symfony polyfill for intl's Normalizer class and related functions",
623 | "homepage": "https://symfony.com",
624 | "keywords": [
625 | "compatibility",
626 | "intl",
627 | "normalizer",
628 | "polyfill",
629 | "portable",
630 | "shim"
631 | ],
632 | "support": {
633 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
634 | },
635 | "funding": [
636 | {
637 | "url": "https://symfony.com/sponsor",
638 | "type": "custom"
639 | },
640 | {
641 | "url": "https://github.com/fabpot",
642 | "type": "github"
643 | },
644 | {
645 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
646 | "type": "tidelift"
647 | }
648 | ],
649 | "time": "2022-05-24T11:49:31+00:00"
650 | },
651 | {
652 | "name": "symfony/polyfill-mbstring",
653 | "version": "v1.26.0",
654 | "source": {
655 | "type": "git",
656 | "url": "https://github.com/symfony/polyfill-mbstring.git",
657 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
658 | },
659 | "dist": {
660 | "type": "zip",
661 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
662 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
663 | "shasum": ""
664 | },
665 | "require": {
666 | "php": ">=7.1"
667 | },
668 | "provide": {
669 | "ext-mbstring": "*"
670 | },
671 | "suggest": {
672 | "ext-mbstring": "For best performance"
673 | },
674 | "type": "library",
675 | "extra": {
676 | "branch-alias": {
677 | "dev-main": "1.26-dev"
678 | },
679 | "thanks": {
680 | "name": "symfony/polyfill",
681 | "url": "https://github.com/symfony/polyfill"
682 | }
683 | },
684 | "autoload": {
685 | "files": [
686 | "bootstrap.php"
687 | ],
688 | "psr-4": {
689 | "Symfony\\Polyfill\\Mbstring\\": ""
690 | }
691 | },
692 | "notification-url": "https://packagist.org/downloads/",
693 | "license": [
694 | "MIT"
695 | ],
696 | "authors": [
697 | {
698 | "name": "Nicolas Grekas",
699 | "email": "p@tchwork.com"
700 | },
701 | {
702 | "name": "Symfony Community",
703 | "homepage": "https://symfony.com/contributors"
704 | }
705 | ],
706 | "description": "Symfony polyfill for the Mbstring extension",
707 | "homepage": "https://symfony.com",
708 | "keywords": [
709 | "compatibility",
710 | "mbstring",
711 | "polyfill",
712 | "portable",
713 | "shim"
714 | ],
715 | "support": {
716 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
717 | },
718 | "funding": [
719 | {
720 | "url": "https://symfony.com/sponsor",
721 | "type": "custom"
722 | },
723 | {
724 | "url": "https://github.com/fabpot",
725 | "type": "github"
726 | },
727 | {
728 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
729 | "type": "tidelift"
730 | }
731 | ],
732 | "time": "2022-05-24T11:49:31+00:00"
733 | },
734 | {
735 | "name": "symfony/service-contracts",
736 | "version": "v3.1.1",
737 | "source": {
738 | "type": "git",
739 | "url": "https://github.com/symfony/service-contracts.git",
740 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239"
741 | },
742 | "dist": {
743 | "type": "zip",
744 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239",
745 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239",
746 | "shasum": ""
747 | },
748 | "require": {
749 | "php": ">=8.1",
750 | "psr/container": "^2.0"
751 | },
752 | "conflict": {
753 | "ext-psr": "<1.1|>=2"
754 | },
755 | "suggest": {
756 | "symfony/service-implementation": ""
757 | },
758 | "type": "library",
759 | "extra": {
760 | "branch-alias": {
761 | "dev-main": "3.1-dev"
762 | },
763 | "thanks": {
764 | "name": "symfony/contracts",
765 | "url": "https://github.com/symfony/contracts"
766 | }
767 | },
768 | "autoload": {
769 | "psr-4": {
770 | "Symfony\\Contracts\\Service\\": ""
771 | },
772 | "exclude-from-classmap": [
773 | "/Test/"
774 | ]
775 | },
776 | "notification-url": "https://packagist.org/downloads/",
777 | "license": [
778 | "MIT"
779 | ],
780 | "authors": [
781 | {
782 | "name": "Nicolas Grekas",
783 | "email": "p@tchwork.com"
784 | },
785 | {
786 | "name": "Symfony Community",
787 | "homepage": "https://symfony.com/contributors"
788 | }
789 | ],
790 | "description": "Generic abstractions related to writing services",
791 | "homepage": "https://symfony.com",
792 | "keywords": [
793 | "abstractions",
794 | "contracts",
795 | "decoupling",
796 | "interfaces",
797 | "interoperability",
798 | "standards"
799 | ],
800 | "support": {
801 | "source": "https://github.com/symfony/service-contracts/tree/v3.1.1"
802 | },
803 | "funding": [
804 | {
805 | "url": "https://symfony.com/sponsor",
806 | "type": "custom"
807 | },
808 | {
809 | "url": "https://github.com/fabpot",
810 | "type": "github"
811 | },
812 | {
813 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
814 | "type": "tidelift"
815 | }
816 | ],
817 | "time": "2022-05-30T19:18:58+00:00"
818 | },
819 | {
820 | "name": "symfony/string",
821 | "version": "v6.1.3",
822 | "source": {
823 | "type": "git",
824 | "url": "https://github.com/symfony/string.git",
825 | "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b"
826 | },
827 | "dist": {
828 | "type": "zip",
829 | "url": "https://api.github.com/repos/symfony/string/zipball/f35241f45c30bcd9046af2bb200a7086f70e1d6b",
830 | "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b",
831 | "shasum": ""
832 | },
833 | "require": {
834 | "php": ">=8.1",
835 | "symfony/polyfill-ctype": "~1.8",
836 | "symfony/polyfill-intl-grapheme": "~1.0",
837 | "symfony/polyfill-intl-normalizer": "~1.0",
838 | "symfony/polyfill-mbstring": "~1.0"
839 | },
840 | "conflict": {
841 | "symfony/translation-contracts": "<2.0"
842 | },
843 | "require-dev": {
844 | "symfony/error-handler": "^5.4|^6.0",
845 | "symfony/http-client": "^5.4|^6.0",
846 | "symfony/translation-contracts": "^2.0|^3.0",
847 | "symfony/var-exporter": "^5.4|^6.0"
848 | },
849 | "type": "library",
850 | "autoload": {
851 | "files": [
852 | "Resources/functions.php"
853 | ],
854 | "psr-4": {
855 | "Symfony\\Component\\String\\": ""
856 | },
857 | "exclude-from-classmap": [
858 | "/Tests/"
859 | ]
860 | },
861 | "notification-url": "https://packagist.org/downloads/",
862 | "license": [
863 | "MIT"
864 | ],
865 | "authors": [
866 | {
867 | "name": "Nicolas Grekas",
868 | "email": "p@tchwork.com"
869 | },
870 | {
871 | "name": "Symfony Community",
872 | "homepage": "https://symfony.com/contributors"
873 | }
874 | ],
875 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
876 | "homepage": "https://symfony.com",
877 | "keywords": [
878 | "grapheme",
879 | "i18n",
880 | "string",
881 | "unicode",
882 | "utf-8",
883 | "utf8"
884 | ],
885 | "support": {
886 | "source": "https://github.com/symfony/string/tree/v6.1.3"
887 | },
888 | "funding": [
889 | {
890 | "url": "https://symfony.com/sponsor",
891 | "type": "custom"
892 | },
893 | {
894 | "url": "https://github.com/fabpot",
895 | "type": "github"
896 | },
897 | {
898 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
899 | "type": "tidelift"
900 | }
901 | ],
902 | "time": "2022-07-27T15:50:51+00:00"
903 | }
904 | ],
905 | "packages-dev": [
906 | {
907 | "name": "doctrine/instantiator",
908 | "version": "1.4.1",
909 | "source": {
910 | "type": "git",
911 | "url": "https://github.com/doctrine/instantiator.git",
912 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
913 | },
914 | "dist": {
915 | "type": "zip",
916 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
917 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
918 | "shasum": ""
919 | },
920 | "require": {
921 | "php": "^7.1 || ^8.0"
922 | },
923 | "require-dev": {
924 | "doctrine/coding-standard": "^9",
925 | "ext-pdo": "*",
926 | "ext-phar": "*",
927 | "phpbench/phpbench": "^0.16 || ^1",
928 | "phpstan/phpstan": "^1.4",
929 | "phpstan/phpstan-phpunit": "^1",
930 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
931 | "vimeo/psalm": "^4.22"
932 | },
933 | "type": "library",
934 | "autoload": {
935 | "psr-4": {
936 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
937 | }
938 | },
939 | "notification-url": "https://packagist.org/downloads/",
940 | "license": [
941 | "MIT"
942 | ],
943 | "authors": [
944 | {
945 | "name": "Marco Pivetta",
946 | "email": "ocramius@gmail.com",
947 | "homepage": "https://ocramius.github.io/"
948 | }
949 | ],
950 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
951 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
952 | "keywords": [
953 | "constructor",
954 | "instantiate"
955 | ],
956 | "support": {
957 | "issues": "https://github.com/doctrine/instantiator/issues",
958 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
959 | },
960 | "funding": [
961 | {
962 | "url": "https://www.doctrine-project.org/sponsorship.html",
963 | "type": "custom"
964 | },
965 | {
966 | "url": "https://www.patreon.com/phpdoctrine",
967 | "type": "patreon"
968 | },
969 | {
970 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
971 | "type": "tidelift"
972 | }
973 | ],
974 | "time": "2022-03-03T08:28:38+00:00"
975 | },
976 | {
977 | "name": "myclabs/deep-copy",
978 | "version": "1.11.0",
979 | "source": {
980 | "type": "git",
981 | "url": "https://github.com/myclabs/DeepCopy.git",
982 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
983 | },
984 | "dist": {
985 | "type": "zip",
986 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
987 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
988 | "shasum": ""
989 | },
990 | "require": {
991 | "php": "^7.1 || ^8.0"
992 | },
993 | "conflict": {
994 | "doctrine/collections": "<1.6.8",
995 | "doctrine/common": "<2.13.3 || >=3,<3.2.2"
996 | },
997 | "require-dev": {
998 | "doctrine/collections": "^1.6.8",
999 | "doctrine/common": "^2.13.3 || ^3.2.2",
1000 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
1001 | },
1002 | "type": "library",
1003 | "autoload": {
1004 | "files": [
1005 | "src/DeepCopy/deep_copy.php"
1006 | ],
1007 | "psr-4": {
1008 | "DeepCopy\\": "src/DeepCopy/"
1009 | }
1010 | },
1011 | "notification-url": "https://packagist.org/downloads/",
1012 | "license": [
1013 | "MIT"
1014 | ],
1015 | "description": "Create deep copies (clones) of your objects",
1016 | "keywords": [
1017 | "clone",
1018 | "copy",
1019 | "duplicate",
1020 | "object",
1021 | "object graph"
1022 | ],
1023 | "support": {
1024 | "issues": "https://github.com/myclabs/DeepCopy/issues",
1025 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
1026 | },
1027 | "funding": [
1028 | {
1029 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
1030 | "type": "tidelift"
1031 | }
1032 | ],
1033 | "time": "2022-03-03T13:19:32+00:00"
1034 | },
1035 | {
1036 | "name": "phar-io/manifest",
1037 | "version": "2.0.3",
1038 | "source": {
1039 | "type": "git",
1040 | "url": "https://github.com/phar-io/manifest.git",
1041 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
1042 | },
1043 | "dist": {
1044 | "type": "zip",
1045 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
1046 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
1047 | "shasum": ""
1048 | },
1049 | "require": {
1050 | "ext-dom": "*",
1051 | "ext-phar": "*",
1052 | "ext-xmlwriter": "*",
1053 | "phar-io/version": "^3.0.1",
1054 | "php": "^7.2 || ^8.0"
1055 | },
1056 | "type": "library",
1057 | "extra": {
1058 | "branch-alias": {
1059 | "dev-master": "2.0.x-dev"
1060 | }
1061 | },
1062 | "autoload": {
1063 | "classmap": [
1064 | "src/"
1065 | ]
1066 | },
1067 | "notification-url": "https://packagist.org/downloads/",
1068 | "license": [
1069 | "BSD-3-Clause"
1070 | ],
1071 | "authors": [
1072 | {
1073 | "name": "Arne Blankerts",
1074 | "email": "arne@blankerts.de",
1075 | "role": "Developer"
1076 | },
1077 | {
1078 | "name": "Sebastian Heuer",
1079 | "email": "sebastian@phpeople.de",
1080 | "role": "Developer"
1081 | },
1082 | {
1083 | "name": "Sebastian Bergmann",
1084 | "email": "sebastian@phpunit.de",
1085 | "role": "Developer"
1086 | }
1087 | ],
1088 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
1089 | "support": {
1090 | "issues": "https://github.com/phar-io/manifest/issues",
1091 | "source": "https://github.com/phar-io/manifest/tree/2.0.3"
1092 | },
1093 | "time": "2021-07-20T11:28:43+00:00"
1094 | },
1095 | {
1096 | "name": "phar-io/version",
1097 | "version": "3.2.1",
1098 | "source": {
1099 | "type": "git",
1100 | "url": "https://github.com/phar-io/version.git",
1101 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
1102 | },
1103 | "dist": {
1104 | "type": "zip",
1105 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
1106 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
1107 | "shasum": ""
1108 | },
1109 | "require": {
1110 | "php": "^7.2 || ^8.0"
1111 | },
1112 | "type": "library",
1113 | "autoload": {
1114 | "classmap": [
1115 | "src/"
1116 | ]
1117 | },
1118 | "notification-url": "https://packagist.org/downloads/",
1119 | "license": [
1120 | "BSD-3-Clause"
1121 | ],
1122 | "authors": [
1123 | {
1124 | "name": "Arne Blankerts",
1125 | "email": "arne@blankerts.de",
1126 | "role": "Developer"
1127 | },
1128 | {
1129 | "name": "Sebastian Heuer",
1130 | "email": "sebastian@phpeople.de",
1131 | "role": "Developer"
1132 | },
1133 | {
1134 | "name": "Sebastian Bergmann",
1135 | "email": "sebastian@phpunit.de",
1136 | "role": "Developer"
1137 | }
1138 | ],
1139 | "description": "Library for handling version information and constraints",
1140 | "support": {
1141 | "issues": "https://github.com/phar-io/version/issues",
1142 | "source": "https://github.com/phar-io/version/tree/3.2.1"
1143 | },
1144 | "time": "2022-02-21T01:04:05+00:00"
1145 | },
1146 | {
1147 | "name": "phpdocumentor/reflection-common",
1148 | "version": "2.2.0",
1149 | "source": {
1150 | "type": "git",
1151 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
1152 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
1153 | },
1154 | "dist": {
1155 | "type": "zip",
1156 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1157 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1158 | "shasum": ""
1159 | },
1160 | "require": {
1161 | "php": "^7.2 || ^8.0"
1162 | },
1163 | "type": "library",
1164 | "extra": {
1165 | "branch-alias": {
1166 | "dev-2.x": "2.x-dev"
1167 | }
1168 | },
1169 | "autoload": {
1170 | "psr-4": {
1171 | "phpDocumentor\\Reflection\\": "src/"
1172 | }
1173 | },
1174 | "notification-url": "https://packagist.org/downloads/",
1175 | "license": [
1176 | "MIT"
1177 | ],
1178 | "authors": [
1179 | {
1180 | "name": "Jaap van Otterdijk",
1181 | "email": "opensource@ijaap.nl"
1182 | }
1183 | ],
1184 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
1185 | "homepage": "http://www.phpdoc.org",
1186 | "keywords": [
1187 | "FQSEN",
1188 | "phpDocumentor",
1189 | "phpdoc",
1190 | "reflection",
1191 | "static analysis"
1192 | ],
1193 | "support": {
1194 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
1195 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
1196 | },
1197 | "time": "2020-06-27T09:03:43+00:00"
1198 | },
1199 | {
1200 | "name": "phpdocumentor/reflection-docblock",
1201 | "version": "5.3.0",
1202 | "source": {
1203 | "type": "git",
1204 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
1205 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
1206 | },
1207 | "dist": {
1208 | "type": "zip",
1209 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
1210 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
1211 | "shasum": ""
1212 | },
1213 | "require": {
1214 | "ext-filter": "*",
1215 | "php": "^7.2 || ^8.0",
1216 | "phpdocumentor/reflection-common": "^2.2",
1217 | "phpdocumentor/type-resolver": "^1.3",
1218 | "webmozart/assert": "^1.9.1"
1219 | },
1220 | "require-dev": {
1221 | "mockery/mockery": "~1.3.2",
1222 | "psalm/phar": "^4.8"
1223 | },
1224 | "type": "library",
1225 | "extra": {
1226 | "branch-alias": {
1227 | "dev-master": "5.x-dev"
1228 | }
1229 | },
1230 | "autoload": {
1231 | "psr-4": {
1232 | "phpDocumentor\\Reflection\\": "src"
1233 | }
1234 | },
1235 | "notification-url": "https://packagist.org/downloads/",
1236 | "license": [
1237 | "MIT"
1238 | ],
1239 | "authors": [
1240 | {
1241 | "name": "Mike van Riel",
1242 | "email": "me@mikevanriel.com"
1243 | },
1244 | {
1245 | "name": "Jaap van Otterdijk",
1246 | "email": "account@ijaap.nl"
1247 | }
1248 | ],
1249 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
1250 | "support": {
1251 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
1252 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
1253 | },
1254 | "time": "2021-10-19T17:43:47+00:00"
1255 | },
1256 | {
1257 | "name": "phpdocumentor/type-resolver",
1258 | "version": "1.6.1",
1259 | "source": {
1260 | "type": "git",
1261 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
1262 | "reference": "77a32518733312af16a44300404e945338981de3"
1263 | },
1264 | "dist": {
1265 | "type": "zip",
1266 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
1267 | "reference": "77a32518733312af16a44300404e945338981de3",
1268 | "shasum": ""
1269 | },
1270 | "require": {
1271 | "php": "^7.2 || ^8.0",
1272 | "phpdocumentor/reflection-common": "^2.0"
1273 | },
1274 | "require-dev": {
1275 | "ext-tokenizer": "*",
1276 | "psalm/phar": "^4.8"
1277 | },
1278 | "type": "library",
1279 | "extra": {
1280 | "branch-alias": {
1281 | "dev-1.x": "1.x-dev"
1282 | }
1283 | },
1284 | "autoload": {
1285 | "psr-4": {
1286 | "phpDocumentor\\Reflection\\": "src"
1287 | }
1288 | },
1289 | "notification-url": "https://packagist.org/downloads/",
1290 | "license": [
1291 | "MIT"
1292 | ],
1293 | "authors": [
1294 | {
1295 | "name": "Mike van Riel",
1296 | "email": "me@mikevanriel.com"
1297 | }
1298 | ],
1299 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
1300 | "support": {
1301 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
1302 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
1303 | },
1304 | "time": "2022-03-15T21:29:03+00:00"
1305 | },
1306 | {
1307 | "name": "phpspec/prophecy",
1308 | "version": "v1.15.0",
1309 | "source": {
1310 | "type": "git",
1311 | "url": "https://github.com/phpspec/prophecy.git",
1312 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
1313 | },
1314 | "dist": {
1315 | "type": "zip",
1316 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
1317 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
1318 | "shasum": ""
1319 | },
1320 | "require": {
1321 | "doctrine/instantiator": "^1.2",
1322 | "php": "^7.2 || ~8.0, <8.2",
1323 | "phpdocumentor/reflection-docblock": "^5.2",
1324 | "sebastian/comparator": "^3.0 || ^4.0",
1325 | "sebastian/recursion-context": "^3.0 || ^4.0"
1326 | },
1327 | "require-dev": {
1328 | "phpspec/phpspec": "^6.0 || ^7.0",
1329 | "phpunit/phpunit": "^8.0 || ^9.0"
1330 | },
1331 | "type": "library",
1332 | "extra": {
1333 | "branch-alias": {
1334 | "dev-master": "1.x-dev"
1335 | }
1336 | },
1337 | "autoload": {
1338 | "psr-4": {
1339 | "Prophecy\\": "src/Prophecy"
1340 | }
1341 | },
1342 | "notification-url": "https://packagist.org/downloads/",
1343 | "license": [
1344 | "MIT"
1345 | ],
1346 | "authors": [
1347 | {
1348 | "name": "Konstantin Kudryashov",
1349 | "email": "ever.zet@gmail.com",
1350 | "homepage": "http://everzet.com"
1351 | },
1352 | {
1353 | "name": "Marcello Duarte",
1354 | "email": "marcello.duarte@gmail.com"
1355 | }
1356 | ],
1357 | "description": "Highly opinionated mocking framework for PHP 5.3+",
1358 | "homepage": "https://github.com/phpspec/prophecy",
1359 | "keywords": [
1360 | "Double",
1361 | "Dummy",
1362 | "fake",
1363 | "mock",
1364 | "spy",
1365 | "stub"
1366 | ],
1367 | "support": {
1368 | "issues": "https://github.com/phpspec/prophecy/issues",
1369 | "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
1370 | },
1371 | "time": "2021-12-08T12:19:24+00:00"
1372 | },
1373 | {
1374 | "name": "phpunit/php-code-coverage",
1375 | "version": "9.2.15",
1376 | "source": {
1377 | "type": "git",
1378 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1379 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
1380 | },
1381 | "dist": {
1382 | "type": "zip",
1383 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
1384 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
1385 | "shasum": ""
1386 | },
1387 | "require": {
1388 | "ext-dom": "*",
1389 | "ext-libxml": "*",
1390 | "ext-xmlwriter": "*",
1391 | "nikic/php-parser": "^4.13.0",
1392 | "php": ">=7.3",
1393 | "phpunit/php-file-iterator": "^3.0.3",
1394 | "phpunit/php-text-template": "^2.0.2",
1395 | "sebastian/code-unit-reverse-lookup": "^2.0.2",
1396 | "sebastian/complexity": "^2.0",
1397 | "sebastian/environment": "^5.1.2",
1398 | "sebastian/lines-of-code": "^1.0.3",
1399 | "sebastian/version": "^3.0.1",
1400 | "theseer/tokenizer": "^1.2.0"
1401 | },
1402 | "require-dev": {
1403 | "phpunit/phpunit": "^9.3"
1404 | },
1405 | "suggest": {
1406 | "ext-pcov": "*",
1407 | "ext-xdebug": "*"
1408 | },
1409 | "type": "library",
1410 | "extra": {
1411 | "branch-alias": {
1412 | "dev-master": "9.2-dev"
1413 | }
1414 | },
1415 | "autoload": {
1416 | "classmap": [
1417 | "src/"
1418 | ]
1419 | },
1420 | "notification-url": "https://packagist.org/downloads/",
1421 | "license": [
1422 | "BSD-3-Clause"
1423 | ],
1424 | "authors": [
1425 | {
1426 | "name": "Sebastian Bergmann",
1427 | "email": "sebastian@phpunit.de",
1428 | "role": "lead"
1429 | }
1430 | ],
1431 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
1432 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
1433 | "keywords": [
1434 | "coverage",
1435 | "testing",
1436 | "xunit"
1437 | ],
1438 | "support": {
1439 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
1440 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
1441 | },
1442 | "funding": [
1443 | {
1444 | "url": "https://github.com/sebastianbergmann",
1445 | "type": "github"
1446 | }
1447 | ],
1448 | "time": "2022-03-07T09:28:20+00:00"
1449 | },
1450 | {
1451 | "name": "phpunit/php-file-iterator",
1452 | "version": "3.0.6",
1453 | "source": {
1454 | "type": "git",
1455 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
1456 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
1457 | },
1458 | "dist": {
1459 | "type": "zip",
1460 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
1461 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
1462 | "shasum": ""
1463 | },
1464 | "require": {
1465 | "php": ">=7.3"
1466 | },
1467 | "require-dev": {
1468 | "phpunit/phpunit": "^9.3"
1469 | },
1470 | "type": "library",
1471 | "extra": {
1472 | "branch-alias": {
1473 | "dev-master": "3.0-dev"
1474 | }
1475 | },
1476 | "autoload": {
1477 | "classmap": [
1478 | "src/"
1479 | ]
1480 | },
1481 | "notification-url": "https://packagist.org/downloads/",
1482 | "license": [
1483 | "BSD-3-Clause"
1484 | ],
1485 | "authors": [
1486 | {
1487 | "name": "Sebastian Bergmann",
1488 | "email": "sebastian@phpunit.de",
1489 | "role": "lead"
1490 | }
1491 | ],
1492 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
1493 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
1494 | "keywords": [
1495 | "filesystem",
1496 | "iterator"
1497 | ],
1498 | "support": {
1499 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
1500 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
1501 | },
1502 | "funding": [
1503 | {
1504 | "url": "https://github.com/sebastianbergmann",
1505 | "type": "github"
1506 | }
1507 | ],
1508 | "time": "2021-12-02T12:48:52+00:00"
1509 | },
1510 | {
1511 | "name": "phpunit/php-invoker",
1512 | "version": "3.1.1",
1513 | "source": {
1514 | "type": "git",
1515 | "url": "https://github.com/sebastianbergmann/php-invoker.git",
1516 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
1517 | },
1518 | "dist": {
1519 | "type": "zip",
1520 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
1521 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
1522 | "shasum": ""
1523 | },
1524 | "require": {
1525 | "php": ">=7.3"
1526 | },
1527 | "require-dev": {
1528 | "ext-pcntl": "*",
1529 | "phpunit/phpunit": "^9.3"
1530 | },
1531 | "suggest": {
1532 | "ext-pcntl": "*"
1533 | },
1534 | "type": "library",
1535 | "extra": {
1536 | "branch-alias": {
1537 | "dev-master": "3.1-dev"
1538 | }
1539 | },
1540 | "autoload": {
1541 | "classmap": [
1542 | "src/"
1543 | ]
1544 | },
1545 | "notification-url": "https://packagist.org/downloads/",
1546 | "license": [
1547 | "BSD-3-Clause"
1548 | ],
1549 | "authors": [
1550 | {
1551 | "name": "Sebastian Bergmann",
1552 | "email": "sebastian@phpunit.de",
1553 | "role": "lead"
1554 | }
1555 | ],
1556 | "description": "Invoke callables with a timeout",
1557 | "homepage": "https://github.com/sebastianbergmann/php-invoker/",
1558 | "keywords": [
1559 | "process"
1560 | ],
1561 | "support": {
1562 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
1563 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
1564 | },
1565 | "funding": [
1566 | {
1567 | "url": "https://github.com/sebastianbergmann",
1568 | "type": "github"
1569 | }
1570 | ],
1571 | "time": "2020-09-28T05:58:55+00:00"
1572 | },
1573 | {
1574 | "name": "phpunit/php-text-template",
1575 | "version": "2.0.4",
1576 | "source": {
1577 | "type": "git",
1578 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
1579 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
1580 | },
1581 | "dist": {
1582 | "type": "zip",
1583 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1584 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
1585 | "shasum": ""
1586 | },
1587 | "require": {
1588 | "php": ">=7.3"
1589 | },
1590 | "require-dev": {
1591 | "phpunit/phpunit": "^9.3"
1592 | },
1593 | "type": "library",
1594 | "extra": {
1595 | "branch-alias": {
1596 | "dev-master": "2.0-dev"
1597 | }
1598 | },
1599 | "autoload": {
1600 | "classmap": [
1601 | "src/"
1602 | ]
1603 | },
1604 | "notification-url": "https://packagist.org/downloads/",
1605 | "license": [
1606 | "BSD-3-Clause"
1607 | ],
1608 | "authors": [
1609 | {
1610 | "name": "Sebastian Bergmann",
1611 | "email": "sebastian@phpunit.de",
1612 | "role": "lead"
1613 | }
1614 | ],
1615 | "description": "Simple template engine.",
1616 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1617 | "keywords": [
1618 | "template"
1619 | ],
1620 | "support": {
1621 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
1622 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
1623 | },
1624 | "funding": [
1625 | {
1626 | "url": "https://github.com/sebastianbergmann",
1627 | "type": "github"
1628 | }
1629 | ],
1630 | "time": "2020-10-26T05:33:50+00:00"
1631 | },
1632 | {
1633 | "name": "phpunit/phpunit",
1634 | "version": "9.5.21",
1635 | "source": {
1636 | "type": "git",
1637 | "url": "https://github.com/sebastianbergmann/phpunit.git",
1638 | "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1"
1639 | },
1640 | "dist": {
1641 | "type": "zip",
1642 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1",
1643 | "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1",
1644 | "shasum": ""
1645 | },
1646 | "require": {
1647 | "doctrine/instantiator": "^1.3.1",
1648 | "ext-dom": "*",
1649 | "ext-json": "*",
1650 | "ext-libxml": "*",
1651 | "ext-mbstring": "*",
1652 | "ext-xml": "*",
1653 | "ext-xmlwriter": "*",
1654 | "myclabs/deep-copy": "^1.10.1",
1655 | "phar-io/manifest": "^2.0.3",
1656 | "phar-io/version": "^3.0.2",
1657 | "php": ">=7.3",
1658 | "phpspec/prophecy": "^1.12.1",
1659 | "phpunit/php-code-coverage": "^9.2.13",
1660 | "phpunit/php-file-iterator": "^3.0.5",
1661 | "phpunit/php-invoker": "^3.1.1",
1662 | "phpunit/php-text-template": "^2.0.3",
1663 | "phpunit/php-timer": "^5.0.2",
1664 | "sebastian/cli-parser": "^1.0.1",
1665 | "sebastian/code-unit": "^1.0.6",
1666 | "sebastian/comparator": "^4.0.5",
1667 | "sebastian/diff": "^4.0.3",
1668 | "sebastian/environment": "^5.1.3",
1669 | "sebastian/exporter": "^4.0.3",
1670 | "sebastian/global-state": "^5.0.1",
1671 | "sebastian/object-enumerator": "^4.0.3",
1672 | "sebastian/resource-operations": "^3.0.3",
1673 | "sebastian/type": "^3.0",
1674 | "sebastian/version": "^3.0.2"
1675 | },
1676 | "require-dev": {
1677 | "phpspec/prophecy-phpunit": "^2.0.1"
1678 | },
1679 | "suggest": {
1680 | "ext-soap": "*",
1681 | "ext-xdebug": "*"
1682 | },
1683 | "bin": [
1684 | "phpunit"
1685 | ],
1686 | "type": "library",
1687 | "extra": {
1688 | "branch-alias": {
1689 | "dev-master": "9.5-dev"
1690 | }
1691 | },
1692 | "autoload": {
1693 | "files": [
1694 | "src/Framework/Assert/Functions.php"
1695 | ],
1696 | "classmap": [
1697 | "src/"
1698 | ]
1699 | },
1700 | "notification-url": "https://packagist.org/downloads/",
1701 | "license": [
1702 | "BSD-3-Clause"
1703 | ],
1704 | "authors": [
1705 | {
1706 | "name": "Sebastian Bergmann",
1707 | "email": "sebastian@phpunit.de",
1708 | "role": "lead"
1709 | }
1710 | ],
1711 | "description": "The PHP Unit Testing framework.",
1712 | "homepage": "https://phpunit.de/",
1713 | "keywords": [
1714 | "phpunit",
1715 | "testing",
1716 | "xunit"
1717 | ],
1718 | "support": {
1719 | "issues": "https://github.com/sebastianbergmann/phpunit/issues",
1720 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21"
1721 | },
1722 | "funding": [
1723 | {
1724 | "url": "https://phpunit.de/sponsors.html",
1725 | "type": "custom"
1726 | },
1727 | {
1728 | "url": "https://github.com/sebastianbergmann",
1729 | "type": "github"
1730 | }
1731 | ],
1732 | "time": "2022-06-19T12:14:25+00:00"
1733 | },
1734 | {
1735 | "name": "sebastian/cli-parser",
1736 | "version": "1.0.1",
1737 | "source": {
1738 | "type": "git",
1739 | "url": "https://github.com/sebastianbergmann/cli-parser.git",
1740 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
1741 | },
1742 | "dist": {
1743 | "type": "zip",
1744 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1745 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1746 | "shasum": ""
1747 | },
1748 | "require": {
1749 | "php": ">=7.3"
1750 | },
1751 | "require-dev": {
1752 | "phpunit/phpunit": "^9.3"
1753 | },
1754 | "type": "library",
1755 | "extra": {
1756 | "branch-alias": {
1757 | "dev-master": "1.0-dev"
1758 | }
1759 | },
1760 | "autoload": {
1761 | "classmap": [
1762 | "src/"
1763 | ]
1764 | },
1765 | "notification-url": "https://packagist.org/downloads/",
1766 | "license": [
1767 | "BSD-3-Clause"
1768 | ],
1769 | "authors": [
1770 | {
1771 | "name": "Sebastian Bergmann",
1772 | "email": "sebastian@phpunit.de",
1773 | "role": "lead"
1774 | }
1775 | ],
1776 | "description": "Library for parsing CLI options",
1777 | "homepage": "https://github.com/sebastianbergmann/cli-parser",
1778 | "support": {
1779 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
1780 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
1781 | },
1782 | "funding": [
1783 | {
1784 | "url": "https://github.com/sebastianbergmann",
1785 | "type": "github"
1786 | }
1787 | ],
1788 | "time": "2020-09-28T06:08:49+00:00"
1789 | },
1790 | {
1791 | "name": "sebastian/code-unit",
1792 | "version": "1.0.8",
1793 | "source": {
1794 | "type": "git",
1795 | "url": "https://github.com/sebastianbergmann/code-unit.git",
1796 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
1797 | },
1798 | "dist": {
1799 | "type": "zip",
1800 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
1801 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
1802 | "shasum": ""
1803 | },
1804 | "require": {
1805 | "php": ">=7.3"
1806 | },
1807 | "require-dev": {
1808 | "phpunit/phpunit": "^9.3"
1809 | },
1810 | "type": "library",
1811 | "extra": {
1812 | "branch-alias": {
1813 | "dev-master": "1.0-dev"
1814 | }
1815 | },
1816 | "autoload": {
1817 | "classmap": [
1818 | "src/"
1819 | ]
1820 | },
1821 | "notification-url": "https://packagist.org/downloads/",
1822 | "license": [
1823 | "BSD-3-Clause"
1824 | ],
1825 | "authors": [
1826 | {
1827 | "name": "Sebastian Bergmann",
1828 | "email": "sebastian@phpunit.de",
1829 | "role": "lead"
1830 | }
1831 | ],
1832 | "description": "Collection of value objects that represent the PHP code units",
1833 | "homepage": "https://github.com/sebastianbergmann/code-unit",
1834 | "support": {
1835 | "issues": "https://github.com/sebastianbergmann/code-unit/issues",
1836 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
1837 | },
1838 | "funding": [
1839 | {
1840 | "url": "https://github.com/sebastianbergmann",
1841 | "type": "github"
1842 | }
1843 | ],
1844 | "time": "2020-10-26T13:08:54+00:00"
1845 | },
1846 | {
1847 | "name": "sebastian/code-unit-reverse-lookup",
1848 | "version": "2.0.3",
1849 | "source": {
1850 | "type": "git",
1851 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1852 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
1853 | },
1854 | "dist": {
1855 | "type": "zip",
1856 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1857 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1858 | "shasum": ""
1859 | },
1860 | "require": {
1861 | "php": ">=7.3"
1862 | },
1863 | "require-dev": {
1864 | "phpunit/phpunit": "^9.3"
1865 | },
1866 | "type": "library",
1867 | "extra": {
1868 | "branch-alias": {
1869 | "dev-master": "2.0-dev"
1870 | }
1871 | },
1872 | "autoload": {
1873 | "classmap": [
1874 | "src/"
1875 | ]
1876 | },
1877 | "notification-url": "https://packagist.org/downloads/",
1878 | "license": [
1879 | "BSD-3-Clause"
1880 | ],
1881 | "authors": [
1882 | {
1883 | "name": "Sebastian Bergmann",
1884 | "email": "sebastian@phpunit.de"
1885 | }
1886 | ],
1887 | "description": "Looks up which function or method a line of code belongs to",
1888 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1889 | "support": {
1890 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
1891 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
1892 | },
1893 | "funding": [
1894 | {
1895 | "url": "https://github.com/sebastianbergmann",
1896 | "type": "github"
1897 | }
1898 | ],
1899 | "time": "2020-09-28T05:30:19+00:00"
1900 | },
1901 | {
1902 | "name": "sebastian/comparator",
1903 | "version": "4.0.6",
1904 | "source": {
1905 | "type": "git",
1906 | "url": "https://github.com/sebastianbergmann/comparator.git",
1907 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
1908 | },
1909 | "dist": {
1910 | "type": "zip",
1911 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
1912 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
1913 | "shasum": ""
1914 | },
1915 | "require": {
1916 | "php": ">=7.3",
1917 | "sebastian/diff": "^4.0",
1918 | "sebastian/exporter": "^4.0"
1919 | },
1920 | "require-dev": {
1921 | "phpunit/phpunit": "^9.3"
1922 | },
1923 | "type": "library",
1924 | "extra": {
1925 | "branch-alias": {
1926 | "dev-master": "4.0-dev"
1927 | }
1928 | },
1929 | "autoload": {
1930 | "classmap": [
1931 | "src/"
1932 | ]
1933 | },
1934 | "notification-url": "https://packagist.org/downloads/",
1935 | "license": [
1936 | "BSD-3-Clause"
1937 | ],
1938 | "authors": [
1939 | {
1940 | "name": "Sebastian Bergmann",
1941 | "email": "sebastian@phpunit.de"
1942 | },
1943 | {
1944 | "name": "Jeff Welch",
1945 | "email": "whatthejeff@gmail.com"
1946 | },
1947 | {
1948 | "name": "Volker Dusch",
1949 | "email": "github@wallbash.com"
1950 | },
1951 | {
1952 | "name": "Bernhard Schussek",
1953 | "email": "bschussek@2bepublished.at"
1954 | }
1955 | ],
1956 | "description": "Provides the functionality to compare PHP values for equality",
1957 | "homepage": "https://github.com/sebastianbergmann/comparator",
1958 | "keywords": [
1959 | "comparator",
1960 | "compare",
1961 | "equality"
1962 | ],
1963 | "support": {
1964 | "issues": "https://github.com/sebastianbergmann/comparator/issues",
1965 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
1966 | },
1967 | "funding": [
1968 | {
1969 | "url": "https://github.com/sebastianbergmann",
1970 | "type": "github"
1971 | }
1972 | ],
1973 | "time": "2020-10-26T15:49:45+00:00"
1974 | },
1975 | {
1976 | "name": "sebastian/complexity",
1977 | "version": "2.0.2",
1978 | "source": {
1979 | "type": "git",
1980 | "url": "https://github.com/sebastianbergmann/complexity.git",
1981 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
1982 | },
1983 | "dist": {
1984 | "type": "zip",
1985 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
1986 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
1987 | "shasum": ""
1988 | },
1989 | "require": {
1990 | "nikic/php-parser": "^4.7",
1991 | "php": ">=7.3"
1992 | },
1993 | "require-dev": {
1994 | "phpunit/phpunit": "^9.3"
1995 | },
1996 | "type": "library",
1997 | "extra": {
1998 | "branch-alias": {
1999 | "dev-master": "2.0-dev"
2000 | }
2001 | },
2002 | "autoload": {
2003 | "classmap": [
2004 | "src/"
2005 | ]
2006 | },
2007 | "notification-url": "https://packagist.org/downloads/",
2008 | "license": [
2009 | "BSD-3-Clause"
2010 | ],
2011 | "authors": [
2012 | {
2013 | "name": "Sebastian Bergmann",
2014 | "email": "sebastian@phpunit.de",
2015 | "role": "lead"
2016 | }
2017 | ],
2018 | "description": "Library for calculating the complexity of PHP code units",
2019 | "homepage": "https://github.com/sebastianbergmann/complexity",
2020 | "support": {
2021 | "issues": "https://github.com/sebastianbergmann/complexity/issues",
2022 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
2023 | },
2024 | "funding": [
2025 | {
2026 | "url": "https://github.com/sebastianbergmann",
2027 | "type": "github"
2028 | }
2029 | ],
2030 | "time": "2020-10-26T15:52:27+00:00"
2031 | },
2032 | {
2033 | "name": "sebastian/diff",
2034 | "version": "4.0.4",
2035 | "source": {
2036 | "type": "git",
2037 | "url": "https://github.com/sebastianbergmann/diff.git",
2038 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
2039 | },
2040 | "dist": {
2041 | "type": "zip",
2042 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
2043 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
2044 | "shasum": ""
2045 | },
2046 | "require": {
2047 | "php": ">=7.3"
2048 | },
2049 | "require-dev": {
2050 | "phpunit/phpunit": "^9.3",
2051 | "symfony/process": "^4.2 || ^5"
2052 | },
2053 | "type": "library",
2054 | "extra": {
2055 | "branch-alias": {
2056 | "dev-master": "4.0-dev"
2057 | }
2058 | },
2059 | "autoload": {
2060 | "classmap": [
2061 | "src/"
2062 | ]
2063 | },
2064 | "notification-url": "https://packagist.org/downloads/",
2065 | "license": [
2066 | "BSD-3-Clause"
2067 | ],
2068 | "authors": [
2069 | {
2070 | "name": "Sebastian Bergmann",
2071 | "email": "sebastian@phpunit.de"
2072 | },
2073 | {
2074 | "name": "Kore Nordmann",
2075 | "email": "mail@kore-nordmann.de"
2076 | }
2077 | ],
2078 | "description": "Diff implementation",
2079 | "homepage": "https://github.com/sebastianbergmann/diff",
2080 | "keywords": [
2081 | "diff",
2082 | "udiff",
2083 | "unidiff",
2084 | "unified diff"
2085 | ],
2086 | "support": {
2087 | "issues": "https://github.com/sebastianbergmann/diff/issues",
2088 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
2089 | },
2090 | "funding": [
2091 | {
2092 | "url": "https://github.com/sebastianbergmann",
2093 | "type": "github"
2094 | }
2095 | ],
2096 | "time": "2020-10-26T13:10:38+00:00"
2097 | },
2098 | {
2099 | "name": "sebastian/environment",
2100 | "version": "5.1.4",
2101 | "source": {
2102 | "type": "git",
2103 | "url": "https://github.com/sebastianbergmann/environment.git",
2104 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
2105 | },
2106 | "dist": {
2107 | "type": "zip",
2108 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
2109 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
2110 | "shasum": ""
2111 | },
2112 | "require": {
2113 | "php": ">=7.3"
2114 | },
2115 | "require-dev": {
2116 | "phpunit/phpunit": "^9.3"
2117 | },
2118 | "suggest": {
2119 | "ext-posix": "*"
2120 | },
2121 | "type": "library",
2122 | "extra": {
2123 | "branch-alias": {
2124 | "dev-master": "5.1-dev"
2125 | }
2126 | },
2127 | "autoload": {
2128 | "classmap": [
2129 | "src/"
2130 | ]
2131 | },
2132 | "notification-url": "https://packagist.org/downloads/",
2133 | "license": [
2134 | "BSD-3-Clause"
2135 | ],
2136 | "authors": [
2137 | {
2138 | "name": "Sebastian Bergmann",
2139 | "email": "sebastian@phpunit.de"
2140 | }
2141 | ],
2142 | "description": "Provides functionality to handle HHVM/PHP environments",
2143 | "homepage": "http://www.github.com/sebastianbergmann/environment",
2144 | "keywords": [
2145 | "Xdebug",
2146 | "environment",
2147 | "hhvm"
2148 | ],
2149 | "support": {
2150 | "issues": "https://github.com/sebastianbergmann/environment/issues",
2151 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
2152 | },
2153 | "funding": [
2154 | {
2155 | "url": "https://github.com/sebastianbergmann",
2156 | "type": "github"
2157 | }
2158 | ],
2159 | "time": "2022-04-03T09:37:03+00:00"
2160 | },
2161 | {
2162 | "name": "sebastian/exporter",
2163 | "version": "4.0.4",
2164 | "source": {
2165 | "type": "git",
2166 | "url": "https://github.com/sebastianbergmann/exporter.git",
2167 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
2168 | },
2169 | "dist": {
2170 | "type": "zip",
2171 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
2172 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
2173 | "shasum": ""
2174 | },
2175 | "require": {
2176 | "php": ">=7.3",
2177 | "sebastian/recursion-context": "^4.0"
2178 | },
2179 | "require-dev": {
2180 | "ext-mbstring": "*",
2181 | "phpunit/phpunit": "^9.3"
2182 | },
2183 | "type": "library",
2184 | "extra": {
2185 | "branch-alias": {
2186 | "dev-master": "4.0-dev"
2187 | }
2188 | },
2189 | "autoload": {
2190 | "classmap": [
2191 | "src/"
2192 | ]
2193 | },
2194 | "notification-url": "https://packagist.org/downloads/",
2195 | "license": [
2196 | "BSD-3-Clause"
2197 | ],
2198 | "authors": [
2199 | {
2200 | "name": "Sebastian Bergmann",
2201 | "email": "sebastian@phpunit.de"
2202 | },
2203 | {
2204 | "name": "Jeff Welch",
2205 | "email": "whatthejeff@gmail.com"
2206 | },
2207 | {
2208 | "name": "Volker Dusch",
2209 | "email": "github@wallbash.com"
2210 | },
2211 | {
2212 | "name": "Adam Harvey",
2213 | "email": "aharvey@php.net"
2214 | },
2215 | {
2216 | "name": "Bernhard Schussek",
2217 | "email": "bschussek@gmail.com"
2218 | }
2219 | ],
2220 | "description": "Provides the functionality to export PHP variables for visualization",
2221 | "homepage": "https://www.github.com/sebastianbergmann/exporter",
2222 | "keywords": [
2223 | "export",
2224 | "exporter"
2225 | ],
2226 | "support": {
2227 | "issues": "https://github.com/sebastianbergmann/exporter/issues",
2228 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
2229 | },
2230 | "funding": [
2231 | {
2232 | "url": "https://github.com/sebastianbergmann",
2233 | "type": "github"
2234 | }
2235 | ],
2236 | "time": "2021-11-11T14:18:36+00:00"
2237 | },
2238 | {
2239 | "name": "sebastian/global-state",
2240 | "version": "5.0.5",
2241 | "source": {
2242 | "type": "git",
2243 | "url": "https://github.com/sebastianbergmann/global-state.git",
2244 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
2245 | },
2246 | "dist": {
2247 | "type": "zip",
2248 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
2249 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
2250 | "shasum": ""
2251 | },
2252 | "require": {
2253 | "php": ">=7.3",
2254 | "sebastian/object-reflector": "^2.0",
2255 | "sebastian/recursion-context": "^4.0"
2256 | },
2257 | "require-dev": {
2258 | "ext-dom": "*",
2259 | "phpunit/phpunit": "^9.3"
2260 | },
2261 | "suggest": {
2262 | "ext-uopz": "*"
2263 | },
2264 | "type": "library",
2265 | "extra": {
2266 | "branch-alias": {
2267 | "dev-master": "5.0-dev"
2268 | }
2269 | },
2270 | "autoload": {
2271 | "classmap": [
2272 | "src/"
2273 | ]
2274 | },
2275 | "notification-url": "https://packagist.org/downloads/",
2276 | "license": [
2277 | "BSD-3-Clause"
2278 | ],
2279 | "authors": [
2280 | {
2281 | "name": "Sebastian Bergmann",
2282 | "email": "sebastian@phpunit.de"
2283 | }
2284 | ],
2285 | "description": "Snapshotting of global state",
2286 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
2287 | "keywords": [
2288 | "global state"
2289 | ],
2290 | "support": {
2291 | "issues": "https://github.com/sebastianbergmann/global-state/issues",
2292 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
2293 | },
2294 | "funding": [
2295 | {
2296 | "url": "https://github.com/sebastianbergmann",
2297 | "type": "github"
2298 | }
2299 | ],
2300 | "time": "2022-02-14T08:28:10+00:00"
2301 | },
2302 | {
2303 | "name": "sebastian/lines-of-code",
2304 | "version": "1.0.3",
2305 | "source": {
2306 | "type": "git",
2307 | "url": "https://github.com/sebastianbergmann/lines-of-code.git",
2308 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
2309 | },
2310 | "dist": {
2311 | "type": "zip",
2312 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
2313 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
2314 | "shasum": ""
2315 | },
2316 | "require": {
2317 | "nikic/php-parser": "^4.6",
2318 | "php": ">=7.3"
2319 | },
2320 | "require-dev": {
2321 | "phpunit/phpunit": "^9.3"
2322 | },
2323 | "type": "library",
2324 | "extra": {
2325 | "branch-alias": {
2326 | "dev-master": "1.0-dev"
2327 | }
2328 | },
2329 | "autoload": {
2330 | "classmap": [
2331 | "src/"
2332 | ]
2333 | },
2334 | "notification-url": "https://packagist.org/downloads/",
2335 | "license": [
2336 | "BSD-3-Clause"
2337 | ],
2338 | "authors": [
2339 | {
2340 | "name": "Sebastian Bergmann",
2341 | "email": "sebastian@phpunit.de",
2342 | "role": "lead"
2343 | }
2344 | ],
2345 | "description": "Library for counting the lines of code in PHP source code",
2346 | "homepage": "https://github.com/sebastianbergmann/lines-of-code",
2347 | "support": {
2348 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
2349 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
2350 | },
2351 | "funding": [
2352 | {
2353 | "url": "https://github.com/sebastianbergmann",
2354 | "type": "github"
2355 | }
2356 | ],
2357 | "time": "2020-11-28T06:42:11+00:00"
2358 | },
2359 | {
2360 | "name": "sebastian/object-enumerator",
2361 | "version": "4.0.4",
2362 | "source": {
2363 | "type": "git",
2364 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2365 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
2366 | },
2367 | "dist": {
2368 | "type": "zip",
2369 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
2370 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
2371 | "shasum": ""
2372 | },
2373 | "require": {
2374 | "php": ">=7.3",
2375 | "sebastian/object-reflector": "^2.0",
2376 | "sebastian/recursion-context": "^4.0"
2377 | },
2378 | "require-dev": {
2379 | "phpunit/phpunit": "^9.3"
2380 | },
2381 | "type": "library",
2382 | "extra": {
2383 | "branch-alias": {
2384 | "dev-master": "4.0-dev"
2385 | }
2386 | },
2387 | "autoload": {
2388 | "classmap": [
2389 | "src/"
2390 | ]
2391 | },
2392 | "notification-url": "https://packagist.org/downloads/",
2393 | "license": [
2394 | "BSD-3-Clause"
2395 | ],
2396 | "authors": [
2397 | {
2398 | "name": "Sebastian Bergmann",
2399 | "email": "sebastian@phpunit.de"
2400 | }
2401 | ],
2402 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2403 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2404 | "support": {
2405 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
2406 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
2407 | },
2408 | "funding": [
2409 | {
2410 | "url": "https://github.com/sebastianbergmann",
2411 | "type": "github"
2412 | }
2413 | ],
2414 | "time": "2020-10-26T13:12:34+00:00"
2415 | },
2416 | {
2417 | "name": "sebastian/object-reflector",
2418 | "version": "2.0.4",
2419 | "source": {
2420 | "type": "git",
2421 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
2422 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
2423 | },
2424 | "dist": {
2425 | "type": "zip",
2426 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
2427 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
2428 | "shasum": ""
2429 | },
2430 | "require": {
2431 | "php": ">=7.3"
2432 | },
2433 | "require-dev": {
2434 | "phpunit/phpunit": "^9.3"
2435 | },
2436 | "type": "library",
2437 | "extra": {
2438 | "branch-alias": {
2439 | "dev-master": "2.0-dev"
2440 | }
2441 | },
2442 | "autoload": {
2443 | "classmap": [
2444 | "src/"
2445 | ]
2446 | },
2447 | "notification-url": "https://packagist.org/downloads/",
2448 | "license": [
2449 | "BSD-3-Clause"
2450 | ],
2451 | "authors": [
2452 | {
2453 | "name": "Sebastian Bergmann",
2454 | "email": "sebastian@phpunit.de"
2455 | }
2456 | ],
2457 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
2458 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2459 | "support": {
2460 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
2461 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
2462 | },
2463 | "funding": [
2464 | {
2465 | "url": "https://github.com/sebastianbergmann",
2466 | "type": "github"
2467 | }
2468 | ],
2469 | "time": "2020-10-26T13:14:26+00:00"
2470 | },
2471 | {
2472 | "name": "sebastian/recursion-context",
2473 | "version": "4.0.4",
2474 | "source": {
2475 | "type": "git",
2476 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
2477 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
2478 | },
2479 | "dist": {
2480 | "type": "zip",
2481 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
2482 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
2483 | "shasum": ""
2484 | },
2485 | "require": {
2486 | "php": ">=7.3"
2487 | },
2488 | "require-dev": {
2489 | "phpunit/phpunit": "^9.3"
2490 | },
2491 | "type": "library",
2492 | "extra": {
2493 | "branch-alias": {
2494 | "dev-master": "4.0-dev"
2495 | }
2496 | },
2497 | "autoload": {
2498 | "classmap": [
2499 | "src/"
2500 | ]
2501 | },
2502 | "notification-url": "https://packagist.org/downloads/",
2503 | "license": [
2504 | "BSD-3-Clause"
2505 | ],
2506 | "authors": [
2507 | {
2508 | "name": "Sebastian Bergmann",
2509 | "email": "sebastian@phpunit.de"
2510 | },
2511 | {
2512 | "name": "Jeff Welch",
2513 | "email": "whatthejeff@gmail.com"
2514 | },
2515 | {
2516 | "name": "Adam Harvey",
2517 | "email": "aharvey@php.net"
2518 | }
2519 | ],
2520 | "description": "Provides functionality to recursively process PHP variables",
2521 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2522 | "support": {
2523 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
2524 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
2525 | },
2526 | "funding": [
2527 | {
2528 | "url": "https://github.com/sebastianbergmann",
2529 | "type": "github"
2530 | }
2531 | ],
2532 | "time": "2020-10-26T13:17:30+00:00"
2533 | },
2534 | {
2535 | "name": "sebastian/resource-operations",
2536 | "version": "3.0.3",
2537 | "source": {
2538 | "type": "git",
2539 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
2540 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
2541 | },
2542 | "dist": {
2543 | "type": "zip",
2544 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2545 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2546 | "shasum": ""
2547 | },
2548 | "require": {
2549 | "php": ">=7.3"
2550 | },
2551 | "require-dev": {
2552 | "phpunit/phpunit": "^9.0"
2553 | },
2554 | "type": "library",
2555 | "extra": {
2556 | "branch-alias": {
2557 | "dev-master": "3.0-dev"
2558 | }
2559 | },
2560 | "autoload": {
2561 | "classmap": [
2562 | "src/"
2563 | ]
2564 | },
2565 | "notification-url": "https://packagist.org/downloads/",
2566 | "license": [
2567 | "BSD-3-Clause"
2568 | ],
2569 | "authors": [
2570 | {
2571 | "name": "Sebastian Bergmann",
2572 | "email": "sebastian@phpunit.de"
2573 | }
2574 | ],
2575 | "description": "Provides a list of PHP built-in functions that operate on resources",
2576 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2577 | "support": {
2578 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
2579 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
2580 | },
2581 | "funding": [
2582 | {
2583 | "url": "https://github.com/sebastianbergmann",
2584 | "type": "github"
2585 | }
2586 | ],
2587 | "time": "2020-09-28T06:45:17+00:00"
2588 | },
2589 | {
2590 | "name": "sebastian/type",
2591 | "version": "3.0.0",
2592 | "source": {
2593 | "type": "git",
2594 | "url": "https://github.com/sebastianbergmann/type.git",
2595 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
2596 | },
2597 | "dist": {
2598 | "type": "zip",
2599 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
2600 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
2601 | "shasum": ""
2602 | },
2603 | "require": {
2604 | "php": ">=7.3"
2605 | },
2606 | "require-dev": {
2607 | "phpunit/phpunit": "^9.5"
2608 | },
2609 | "type": "library",
2610 | "extra": {
2611 | "branch-alias": {
2612 | "dev-master": "3.0-dev"
2613 | }
2614 | },
2615 | "autoload": {
2616 | "classmap": [
2617 | "src/"
2618 | ]
2619 | },
2620 | "notification-url": "https://packagist.org/downloads/",
2621 | "license": [
2622 | "BSD-3-Clause"
2623 | ],
2624 | "authors": [
2625 | {
2626 | "name": "Sebastian Bergmann",
2627 | "email": "sebastian@phpunit.de",
2628 | "role": "lead"
2629 | }
2630 | ],
2631 | "description": "Collection of value objects that represent the types of the PHP type system",
2632 | "homepage": "https://github.com/sebastianbergmann/type",
2633 | "support": {
2634 | "issues": "https://github.com/sebastianbergmann/type/issues",
2635 | "source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
2636 | },
2637 | "funding": [
2638 | {
2639 | "url": "https://github.com/sebastianbergmann",
2640 | "type": "github"
2641 | }
2642 | ],
2643 | "time": "2022-03-15T09:54:48+00:00"
2644 | },
2645 | {
2646 | "name": "sebastian/version",
2647 | "version": "3.0.2",
2648 | "source": {
2649 | "type": "git",
2650 | "url": "https://github.com/sebastianbergmann/version.git",
2651 | "reference": "c6c1022351a901512170118436c764e473f6de8c"
2652 | },
2653 | "dist": {
2654 | "type": "zip",
2655 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
2656 | "reference": "c6c1022351a901512170118436c764e473f6de8c",
2657 | "shasum": ""
2658 | },
2659 | "require": {
2660 | "php": ">=7.3"
2661 | },
2662 | "type": "library",
2663 | "extra": {
2664 | "branch-alias": {
2665 | "dev-master": "3.0-dev"
2666 | }
2667 | },
2668 | "autoload": {
2669 | "classmap": [
2670 | "src/"
2671 | ]
2672 | },
2673 | "notification-url": "https://packagist.org/downloads/",
2674 | "license": [
2675 | "BSD-3-Clause"
2676 | ],
2677 | "authors": [
2678 | {
2679 | "name": "Sebastian Bergmann",
2680 | "email": "sebastian@phpunit.de",
2681 | "role": "lead"
2682 | }
2683 | ],
2684 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2685 | "homepage": "https://github.com/sebastianbergmann/version",
2686 | "support": {
2687 | "issues": "https://github.com/sebastianbergmann/version/issues",
2688 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
2689 | },
2690 | "funding": [
2691 | {
2692 | "url": "https://github.com/sebastianbergmann",
2693 | "type": "github"
2694 | }
2695 | ],
2696 | "time": "2020-09-28T06:39:44+00:00"
2697 | },
2698 | {
2699 | "name": "squizlabs/php_codesniffer",
2700 | "version": "3.7.1",
2701 | "source": {
2702 | "type": "git",
2703 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
2704 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619"
2705 | },
2706 | "dist": {
2707 | "type": "zip",
2708 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619",
2709 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619",
2710 | "shasum": ""
2711 | },
2712 | "require": {
2713 | "ext-simplexml": "*",
2714 | "ext-tokenizer": "*",
2715 | "ext-xmlwriter": "*",
2716 | "php": ">=5.4.0"
2717 | },
2718 | "require-dev": {
2719 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
2720 | },
2721 | "bin": [
2722 | "bin/phpcs",
2723 | "bin/phpcbf"
2724 | ],
2725 | "type": "library",
2726 | "extra": {
2727 | "branch-alias": {
2728 | "dev-master": "3.x-dev"
2729 | }
2730 | },
2731 | "notification-url": "https://packagist.org/downloads/",
2732 | "license": [
2733 | "BSD-3-Clause"
2734 | ],
2735 | "authors": [
2736 | {
2737 | "name": "Greg Sherwood",
2738 | "role": "lead"
2739 | }
2740 | ],
2741 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
2742 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
2743 | "keywords": [
2744 | "phpcs",
2745 | "standards"
2746 | ],
2747 | "support": {
2748 | "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
2749 | "source": "https://github.com/squizlabs/PHP_CodeSniffer",
2750 | "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
2751 | },
2752 | "time": "2022-06-18T07:21:10+00:00"
2753 | },
2754 | {
2755 | "name": "symfony/var-dumper",
2756 | "version": "v6.1.3",
2757 | "source": {
2758 | "type": "git",
2759 | "url": "https://github.com/symfony/var-dumper.git",
2760 | "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427"
2761 | },
2762 | "dist": {
2763 | "type": "zip",
2764 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427",
2765 | "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427",
2766 | "shasum": ""
2767 | },
2768 | "require": {
2769 | "php": ">=8.1",
2770 | "symfony/polyfill-mbstring": "~1.0"
2771 | },
2772 | "conflict": {
2773 | "phpunit/phpunit": "<5.4.3",
2774 | "symfony/console": "<5.4"
2775 | },
2776 | "require-dev": {
2777 | "ext-iconv": "*",
2778 | "symfony/console": "^5.4|^6.0",
2779 | "symfony/process": "^5.4|^6.0",
2780 | "symfony/uid": "^5.4|^6.0",
2781 | "twig/twig": "^2.13|^3.0.4"
2782 | },
2783 | "suggest": {
2784 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
2785 | "ext-intl": "To show region name in time zone dump",
2786 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
2787 | },
2788 | "bin": [
2789 | "Resources/bin/var-dump-server"
2790 | ],
2791 | "type": "library",
2792 | "autoload": {
2793 | "files": [
2794 | "Resources/functions/dump.php"
2795 | ],
2796 | "psr-4": {
2797 | "Symfony\\Component\\VarDumper\\": ""
2798 | },
2799 | "exclude-from-classmap": [
2800 | "/Tests/"
2801 | ]
2802 | },
2803 | "notification-url": "https://packagist.org/downloads/",
2804 | "license": [
2805 | "MIT"
2806 | ],
2807 | "authors": [
2808 | {
2809 | "name": "Nicolas Grekas",
2810 | "email": "p@tchwork.com"
2811 | },
2812 | {
2813 | "name": "Symfony Community",
2814 | "homepage": "https://symfony.com/contributors"
2815 | }
2816 | ],
2817 | "description": "Provides mechanisms for walking through any arbitrary PHP variable",
2818 | "homepage": "https://symfony.com",
2819 | "keywords": [
2820 | "debug",
2821 | "dump"
2822 | ],
2823 | "support": {
2824 | "source": "https://github.com/symfony/var-dumper/tree/v6.1.3"
2825 | },
2826 | "funding": [
2827 | {
2828 | "url": "https://symfony.com/sponsor",
2829 | "type": "custom"
2830 | },
2831 | {
2832 | "url": "https://github.com/fabpot",
2833 | "type": "github"
2834 | },
2835 | {
2836 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2837 | "type": "tidelift"
2838 | }
2839 | ],
2840 | "time": "2022-07-20T13:46:29+00:00"
2841 | },
2842 | {
2843 | "name": "theseer/tokenizer",
2844 | "version": "1.2.1",
2845 | "source": {
2846 | "type": "git",
2847 | "url": "https://github.com/theseer/tokenizer.git",
2848 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
2849 | },
2850 | "dist": {
2851 | "type": "zip",
2852 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
2853 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
2854 | "shasum": ""
2855 | },
2856 | "require": {
2857 | "ext-dom": "*",
2858 | "ext-tokenizer": "*",
2859 | "ext-xmlwriter": "*",
2860 | "php": "^7.2 || ^8.0"
2861 | },
2862 | "type": "library",
2863 | "autoload": {
2864 | "classmap": [
2865 | "src/"
2866 | ]
2867 | },
2868 | "notification-url": "https://packagist.org/downloads/",
2869 | "license": [
2870 | "BSD-3-Clause"
2871 | ],
2872 | "authors": [
2873 | {
2874 | "name": "Arne Blankerts",
2875 | "email": "arne@blankerts.de",
2876 | "role": "Developer"
2877 | }
2878 | ],
2879 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2880 | "support": {
2881 | "issues": "https://github.com/theseer/tokenizer/issues",
2882 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
2883 | },
2884 | "funding": [
2885 | {
2886 | "url": "https://github.com/theseer",
2887 | "type": "github"
2888 | }
2889 | ],
2890 | "time": "2021-07-28T10:34:58+00:00"
2891 | },
2892 | {
2893 | "name": "webmozart/assert",
2894 | "version": "1.11.0",
2895 | "source": {
2896 | "type": "git",
2897 | "url": "https://github.com/webmozarts/assert.git",
2898 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
2899 | },
2900 | "dist": {
2901 | "type": "zip",
2902 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
2903 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
2904 | "shasum": ""
2905 | },
2906 | "require": {
2907 | "ext-ctype": "*",
2908 | "php": "^7.2 || ^8.0"
2909 | },
2910 | "conflict": {
2911 | "phpstan/phpstan": "<0.12.20",
2912 | "vimeo/psalm": "<4.6.1 || 4.6.2"
2913 | },
2914 | "require-dev": {
2915 | "phpunit/phpunit": "^8.5.13"
2916 | },
2917 | "type": "library",
2918 | "extra": {
2919 | "branch-alias": {
2920 | "dev-master": "1.10-dev"
2921 | }
2922 | },
2923 | "autoload": {
2924 | "psr-4": {
2925 | "Webmozart\\Assert\\": "src/"
2926 | }
2927 | },
2928 | "notification-url": "https://packagist.org/downloads/",
2929 | "license": [
2930 | "MIT"
2931 | ],
2932 | "authors": [
2933 | {
2934 | "name": "Bernhard Schussek",
2935 | "email": "bschussek@gmail.com"
2936 | }
2937 | ],
2938 | "description": "Assertions to validate method input/output with nice error messages.",
2939 | "keywords": [
2940 | "assert",
2941 | "check",
2942 | "validate"
2943 | ],
2944 | "support": {
2945 | "issues": "https://github.com/webmozarts/assert/issues",
2946 | "source": "https://github.com/webmozarts/assert/tree/1.11.0"
2947 | },
2948 | "time": "2022-06-03T18:03:27+00:00"
2949 | }
2950 | ],
2951 | "aliases": [],
2952 | "minimum-stability": "stable",
2953 | "stability-flags": [],
2954 | "prefer-stable": false,
2955 | "prefer-lowest": false,
2956 | "platform": {
2957 | "php": "^7.4 || ^8.0"
2958 | },
2959 | "platform-dev": [],
2960 | "plugin-api-version": "2.3.0"
2961 | }
2962 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | networks:
4 | app:
5 | driver: bridge
6 |
7 | services:
8 | app:
9 | build:
10 | context: ./docker/app
11 | volumes:
12 | - '.:/var/www'
13 |
--------------------------------------------------------------------------------
/docker/app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM php:8.1-fpm
2 |
3 | # Set working directory
4 | WORKDIR /var/www
5 |
6 | # Install system dependencies
7 | RUN apt-get update && apt-get install -y \
8 | git \
9 | curl \
10 | libpng-dev \
11 | libjpeg-dev \
12 | libfreetype6-dev \
13 | libonig-dev \
14 | libxml2-dev \
15 | libpq-dev \
16 | libzip-dev \
17 | libcurl4-openssl-dev \
18 | zip \
19 | unzip
20 |
21 | # Install PHP extensions
22 | RUN docker-php-ext-install mbstring exif pcntl bcmath gd zip curl
23 |
24 | # Install xdebug
25 | RUN pecl install xdebug-3.1.3 \
26 | && docker-php-ext-enable xdebug
27 |
28 | # Get latest Composer
29 | RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
30 |
31 | # Clear cache
32 | RUN apt-get -y autoremove \
33 | && apt-get clean \
34 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
35 |
--------------------------------------------------------------------------------
/phpargsdetector:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | add(new InspectCommand());
28 |
29 | $application->run();
30 |
--------------------------------------------------------------------------------
/src/Commands/InspectCommand.php:
--------------------------------------------------------------------------------
1 | addArgument(
27 | 'directories',
28 | InputArgument::REQUIRED,
29 | 'Directories to analyze',
30 | )
31 | ->addOption(
32 | 'min-args',
33 | null,
34 | InputOption::VALUE_REQUIRED,
35 | '',
36 | )
37 | ->addOption(
38 | 'max-args',
39 | null,
40 | InputOption::VALUE_REQUIRED,
41 | '',
42 | )
43 | ->addOption(
44 | 'min-weight',
45 | null,
46 | InputOption::VALUE_REQUIRED,
47 | '',
48 | )
49 | ->addOption(
50 | 'max-weight',
51 | null,
52 | InputOption::VALUE_REQUIRED,
53 | '',
54 | )
55 | ->addOption(
56 | 'limit',
57 | null,
58 | InputOption::VALUE_REQUIRED,
59 | '',
60 | )
61 | ->addOption(
62 | 'without-constructor',
63 | null,
64 | InputOption::VALUE_NONE,
65 | )
66 | ->addOption(
67 | 'sort-by-weight',
68 | null,
69 | InputOption::VALUE_NONE,
70 | );
71 | }
72 |
73 | protected function execute(InputInterface $input, OutputInterface $output)
74 | {
75 | $output->writeln('❀ PHP Arguments Detector ❀');
76 |
77 | $finder = $this->createFinder($input);
78 |
79 | if ($this->noFilesFound($finder)) {
80 |
81 | $output->writeln('No files found to scan');
82 |
83 | return self::SUCCESS;
84 | }
85 |
86 | $methods = $this->diveIntoNodes($output, $finder);
87 |
88 | $output->writeln(PHP_EOL);
89 |
90 | $options = $input->getOptions([
91 | 'without-constructor',
92 | 'sort-by-weight',
93 | 'min-args',
94 | 'max-args',
95 | 'min-weight',
96 | 'max-weight',
97 | 'limit',
98 | ]);
99 |
100 | $printer = new Console($options);
101 |
102 | $printer->printData($output, $methods);
103 |
104 | return self::SUCCESS;
105 | }
106 |
107 | protected function createFinder(InputInterface $input): Finder
108 | {
109 | $finder = new Finder();
110 |
111 | $directories = $input->getArgument('directories');
112 |
113 | $finder->files()->in($directories);
114 |
115 | return $finder;
116 | }
117 |
118 | protected function noFilesFound(Finder $finder): bool
119 | {
120 | $filesCount = $finder->count();
121 |
122 | return $filesCount === 0;
123 | }
124 |
125 | protected function startProgressBar(OutputInterface $output, Finder $finder): void
126 | {
127 | $this->progressBar = new ProgressBar($output, $finder->count());
128 |
129 | $this->progressBar->start();
130 | }
131 |
132 | protected function diveIntoNodes(OutputInterface $output, Finder $finder): array
133 | {
134 | $this->startProgressBar($output, $finder);
135 |
136 | $methods = [];
137 | $detector = new Detector();
138 |
139 | foreach ($finder as $file) {
140 |
141 | try {
142 |
143 | $tokens = $detector->parse($file);
144 |
145 | $fileVisitor = new FileVisitor(
146 | new NodeMethodExplorer($file),
147 | );
148 |
149 | $traverser = new NodeTraverser();
150 |
151 | $traverser->addVisitor($fileVisitor);
152 |
153 | $traverser->traverse($tokens);
154 |
155 | foreach ($fileVisitor->getMethods() as $method) {
156 | $methods[] = $method;
157 | }
158 |
159 | } catch (Error $e) {
160 | //
161 | }
162 |
163 | $this->progressBar->advance();
164 | }
165 |
166 | $this->progressBar->finish();
167 |
168 | return $methods;
169 | }
170 | }
--------------------------------------------------------------------------------
/src/Detector.php:
--------------------------------------------------------------------------------
1 | parserFactory = new ParserFactory();
14 | }
15 |
16 | public function parse(string $file): array
17 | {
18 | $parser = $this->parserFactory->create(ParserFactory::PREFER_PHP7);
19 |
20 | $buffer = file_get_contents($file);
21 |
22 | return $parser->parse($buffer);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/Method.php:
--------------------------------------------------------------------------------
1 | path = $path;
17 | $this->name = $name;
18 | $this->line = $line;
19 | $this->arguments = $arguments;
20 | }
21 |
22 | public function getPath(): string
23 | {
24 | return $this->path;
25 | }
26 |
27 | public function getName(): string
28 | {
29 | return $this->name;
30 | }
31 |
32 | public function getLine(): int
33 | {
34 | return $this->line - 2;
35 | }
36 |
37 | public function countArguments(): int
38 | {
39 | return count($this->arguments);
40 | }
41 |
42 | public function getWeight(): int
43 | {
44 | $weight = $this->getLine() * $this->countArguments();
45 |
46 | return $weight > 0 ? $weight : 0;
47 | }
48 |
49 | public function isConstructor(): bool
50 | {
51 | return $this->name === '__construct';
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/NodeMethodExplorer.php:
--------------------------------------------------------------------------------
1 | file = $file;
17 | }
18 |
19 | public function get(Node $node): iterable
20 | {
21 | if ($this->isNotClassMethod($node)) {
22 | return;
23 | }
24 |
25 | yield new Method(
26 | $this->file->getPathname(),
27 | $node->name->name,
28 | $node->getEndLine() - $node->getStartLine(),
29 | $node->getParams(),
30 | );
31 | }
32 |
33 | public function isNotClassMethod(Node $node): bool
34 | {
35 | return ! $node instanceof ClassMethod;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/Printers/Console.php:
--------------------------------------------------------------------------------
1 | options = $options;
17 | }
18 |
19 | public function printData(OutputInterface $output, array $methods)
20 | {
21 | $rows = $this->getRows($methods);
22 |
23 | if (count($rows) === 0) {
24 | $output->writeln('No methods found.');
25 | return;
26 | }
27 |
28 | $rows = $this->sortRows($rows);
29 |
30 | if ($this->options['limit']) {
31 | $rows = $this->cutRows($rows);
32 | }
33 |
34 | $this->printTable($output, $rows);
35 |
36 | $output->writeln('Total of methods : ' . count($rows) . '');
37 |
38 | return Command::SUCCESS;
39 | }
40 |
41 | protected function getRows(array $methods): array
42 | {
43 | $rows = [];
44 |
45 | foreach ($methods as $method) {
46 |
47 | if ($this->constructorIsUnwelcome($method)) {
48 | continue;
49 | }
50 |
51 | if ($this->outsideThresholds($method)) {
52 | continue;
53 | }
54 |
55 | $rows[] = [
56 | $method->getPath(),
57 | $method->getName(),
58 | $method->countArguments(),
59 | $method->getWeight(),
60 | ];
61 | }
62 |
63 | return $rows;
64 | }
65 |
66 | protected function constructorIsUnwelcome(Method $method): bool
67 | {
68 | return $this->options['without-constructor'] && $method->isConstructor();
69 | }
70 |
71 | protected function outsideThresholds(Method $method): bool
72 | {
73 | return $this->outsideArgsThresholds($method)
74 | || $this->outsideWeightThresholds($method);
75 | }
76 |
77 | protected function outsideArgsThresholds(Method $method): bool
78 | {
79 | $count = $method->countArguments();
80 |
81 | if ($this->options['min-args'] && $count < (int) $this->options['min-args']) {
82 | return true;
83 | }
84 |
85 | if ($this->options['max-args'] && $count > (int) $this->options['max-args']) {
86 | return true;
87 | }
88 |
89 | return false;
90 | }
91 |
92 | protected function outsideWeightThresholds(Method $method): bool
93 | {
94 | $weight = $method->getWeight();
95 |
96 | if ($this->options['min-weight'] && $weight < (int) $this->options['min-weight']) {
97 | return true;
98 | }
99 |
100 | if ($this->options['max-weight'] && $weight > (int) $this->options['max-weight']) {
101 | return true;
102 | }
103 |
104 | return false;
105 | }
106 |
107 | protected function sortRows(array $rows): array
108 | {
109 | $sort = $this->options['sort-by-weight'] ? 3 : 2;
110 |
111 | uasort($rows, function ($a, $b) use ($sort) {
112 |
113 | if ($a[$sort] == $b[$sort]) {
114 | return 0;
115 | }
116 |
117 | return ($a[$sort] < $b[$sort]) ? 1 : -1;
118 | });
119 |
120 | return $rows;
121 | }
122 |
123 | protected function cutRows(array $rows): array
124 | {
125 | $limit = $this->options['limit'];
126 |
127 | return array_slice($rows, 0, $limit);
128 | }
129 |
130 | protected function printTable(OutputInterface $output, array $rows): void
131 | {
132 | $table = new Table($output);
133 |
134 | $table
135 | ->setHeaders(['Files', 'Methods', 'Arguments', 'Weight'])
136 | ->setRows($rows);
137 |
138 | $table->render();
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/src/Visitors/FileVisitor.php:
--------------------------------------------------------------------------------
1 | nodeExplorer = $nodeExplorer;
17 | }
18 |
19 | public function beforeTraverse(array $nodes): void
20 | {
21 | $this->methods = [];
22 | }
23 |
24 | public function leaveNode(Node $node): void
25 | {
26 | $this->methods[] = $this->nodeExplorer->get($node);
27 | }
28 |
29 | public function getMethods(): iterable
30 | {
31 | foreach ($this->methods as $method) {
32 | yield from $method;
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------