├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── demo.php ├── demo.png └── lib ├── Graph.php ├── Options.php └── Printer.php /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 7 | 8 | ## Our Standards 9 | 10 | Examples of behavior that contributes to creating a positive environment 11 | include: 12 | 13 | * Using welcoming and inclusive language 14 | * Being respectful of differing viewpoints and experiences 15 | * Gracefully accepting constructive criticism 16 | * Focusing on what is best for the community 17 | * Showing empathy towards other community members 18 | 19 | Examples of unacceptable behavior by participants include: 20 | 21 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 22 | * Trolling, insulting/derogatory comments, and personal or political attacks 23 | * Public or private harassment 24 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 25 | * Other conduct which could reasonably be considered inappropriate in a professional setting 26 | 27 | ## Our Responsibilities 28 | 29 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 30 | 31 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 32 | 33 | ## Scope 34 | 35 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. 36 | 37 | Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 38 | 39 | ## Enforcement 40 | 41 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at me@ircmaxell.com. All 42 | complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. 43 | 44 | Further details of specific enforcement policies may be posted separately. 45 | 46 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 47 | 48 | ## Attribution 49 | 50 | This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 51 | 52 | [homepage](https://www.contributor-covenant.org): https://www.contributor-covenant.org 53 | 54 | For answers to common questions about this code of conduct, see 55 | https://www.contributor-covenant.org/faq 56 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute 2 | 3 | We'd love to accept your patches and contributions to this project. There are just a few small guidelines you need to follow. 4 | 5 | When contributing to this repository, please first discuss that new features be discussed via issue before making a change. 6 | 7 | Please report any bugs to the issues page, due to the fact this project is done in free time, it may take a while to process the issues, but security vulnerabilities will have precedence over feature requests. 8 | 9 | Please note we have a code of conduct, [CODE\_OF\_CONDUCT.md](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. 10 | 11 | # Pull Request Process 12 | 13 | All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult 14 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. 15 | 16 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a build. 17 | 2. Update the [README.md](README.md) with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters (if applicable). 18 | 3. Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). 19 | 4. You may merge the Pull Request in once you have the sign-off of other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Anthony Ferrara 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP Ast Visualizer 2 | 3 | This library will take an AST generated from [Nikita's PHP-Parser](https://github.com/nikic/PHP-Parser) and generate a nice pretty graph representation. 4 | 5 | This isn't really that useful, but maybe you'll find a use for it. 6 | 7 | Check out [`demo.php`](demo.php) for examples. 8 | 9 | ![A demo graphic](demo.png) -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ircmaxell/php-ast-visualizer", 3 | "description": "An AST Visualizer for PHP", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Anthony Ferrara", 8 | "email": "ircmaxell@gmail.com" 9 | } 10 | ], 11 | "require": { 12 | "php": ">=7.0", 13 | "nikic/php-parser": "^4.0", 14 | "phpdocumentor/graphviz": "^1.0.4" 15 | }, 16 | "require-dev": { 17 | "phpunit/phpunit": "^6.0", 18 | "friendsofphp/php-cs-fixer": "*" 19 | }, 20 | "minimum-stability": "dev", 21 | "autoload": { 22 | "psr-4": { 23 | "PHPAstVisualizer\\": "lib/" 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /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#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "05e645f40823e4aa709d48fc81218807", 8 | "packages": [ 9 | { 10 | "name": "nikic/php-parser", 11 | "version": "dev-master", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/nikic/PHP-Parser.git", 15 | "reference": "57b8673ea7373100e80aecdf18fe82c0dddbea28" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/57b8673ea7373100e80aecdf18fe82c0dddbea28", 20 | "reference": "57b8673ea7373100e80aecdf18fe82c0dddbea28", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-tokenizer": "*", 25 | "php": ">=7.0" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "^6.5 || ^7.0" 29 | }, 30 | "bin": [ 31 | "bin/php-parse" 32 | ], 33 | "type": "library", 34 | "extra": { 35 | "branch-alias": { 36 | "dev-master": "4.2-dev" 37 | } 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "PhpParser\\": "lib/PhpParser" 42 | } 43 | }, 44 | "notification-url": "https://packagist.org/downloads/", 45 | "license": [ 46 | "BSD-3-Clause" 47 | ], 48 | "authors": [ 49 | { 50 | "name": "Nikita Popov" 51 | } 52 | ], 53 | "description": "A PHP parser written in PHP", 54 | "keywords": [ 55 | "parser", 56 | "php" 57 | ], 58 | "time": "2019-02-16 20:58:22" 59 | }, 60 | { 61 | "name": "phpdocumentor/graphviz", 62 | "version": "1.0.4", 63 | "source": { 64 | "type": "git", 65 | "url": "https://github.com/phpDocumentor/GraphViz.git", 66 | "reference": "a906a90a9f230535f25ea31caf81b2323956283f" 67 | }, 68 | "dist": { 69 | "type": "zip", 70 | "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", 71 | "reference": "a906a90a9f230535f25ea31caf81b2323956283f", 72 | "shasum": "" 73 | }, 74 | "require": { 75 | "php": ">=5.3.3" 76 | }, 77 | "require-dev": { 78 | "phpunit/phpunit": "~4.0" 79 | }, 80 | "type": "library", 81 | "autoload": { 82 | "psr-0": { 83 | "phpDocumentor": [ 84 | "src/", 85 | "tests/unit" 86 | ] 87 | } 88 | }, 89 | "notification-url": "https://packagist.org/downloads/", 90 | "license": [ 91 | "MIT" 92 | ], 93 | "authors": [ 94 | { 95 | "name": "Mike van Riel", 96 | "email": "mike.vanriel@naenius.com" 97 | } 98 | ], 99 | "time": "2016-02-02T13:00:08+00:00" 100 | } 101 | ], 102 | "packages-dev": [ 103 | { 104 | "name": "composer/semver", 105 | "version": "dev-master", 106 | "source": { 107 | "type": "git", 108 | "url": "https://github.com/composer/semver.git", 109 | "reference": "e97856ee51b93ba42666de1f1d481d142ec62220" 110 | }, 111 | "dist": { 112 | "type": "zip", 113 | "url": "https://api.github.com/repos/composer/semver/zipball/e97856ee51b93ba42666de1f1d481d142ec62220", 114 | "reference": "e97856ee51b93ba42666de1f1d481d142ec62220", 115 | "shasum": "" 116 | }, 117 | "require": { 118 | "php": "^5.3.2 || ^7.0" 119 | }, 120 | "require-dev": { 121 | "phpunit/phpunit": "^4.5 || ^5.0.5", 122 | "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" 123 | }, 124 | "type": "library", 125 | "extra": { 126 | "branch-alias": { 127 | "dev-master": "1.x-dev" 128 | } 129 | }, 130 | "autoload": { 131 | "psr-4": { 132 | "Composer\\Semver\\": "src" 133 | } 134 | }, 135 | "notification-url": "https://packagist.org/downloads/", 136 | "license": [ 137 | "MIT" 138 | ], 139 | "authors": [ 140 | { 141 | "name": "Nils Adermann", 142 | "email": "naderman@naderman.de", 143 | "homepage": "http://www.naderman.de" 144 | }, 145 | { 146 | "name": "Jordi Boggiano", 147 | "email": "j.boggiano@seld.be", 148 | "homepage": "http://seld.be" 149 | }, 150 | { 151 | "name": "Rob Bast", 152 | "email": "rob.bast@gmail.com", 153 | "homepage": "http://robbast.nl" 154 | } 155 | ], 156 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 157 | "keywords": [ 158 | "semantic", 159 | "semver", 160 | "validation", 161 | "versioning" 162 | ], 163 | "time": "2019-01-30T14:33:02+00:00" 164 | }, 165 | { 166 | "name": "composer/xdebug-handler", 167 | "version": "1.3.2", 168 | "source": { 169 | "type": "git", 170 | "url": "https://github.com/composer/xdebug-handler.git", 171 | "reference": "d17708133b6c276d6e42ef887a877866b909d892" 172 | }, 173 | "dist": { 174 | "type": "zip", 175 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/d17708133b6c276d6e42ef887a877866b909d892", 176 | "reference": "d17708133b6c276d6e42ef887a877866b909d892", 177 | "shasum": "" 178 | }, 179 | "require": { 180 | "php": "^5.3.2 || ^7.0", 181 | "psr/log": "^1.0" 182 | }, 183 | "require-dev": { 184 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" 185 | }, 186 | "type": "library", 187 | "autoload": { 188 | "psr-4": { 189 | "Composer\\XdebugHandler\\": "src" 190 | } 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "MIT" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "John Stevenson", 199 | "email": "john-stevenson@blueyonder.co.uk" 200 | } 201 | ], 202 | "description": "Restarts a process without xdebug.", 203 | "keywords": [ 204 | "Xdebug", 205 | "performance" 206 | ], 207 | "time": "2019-01-28T20:25:53+00:00" 208 | }, 209 | { 210 | "name": "doctrine/annotations", 211 | "version": "v1.4.0", 212 | "source": { 213 | "type": "git", 214 | "url": "https://github.com/doctrine/annotations.git", 215 | "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" 216 | }, 217 | "dist": { 218 | "type": "zip", 219 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", 220 | "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", 221 | "shasum": "" 222 | }, 223 | "require": { 224 | "doctrine/lexer": "1.*", 225 | "php": "^5.6 || ^7.0" 226 | }, 227 | "require-dev": { 228 | "doctrine/cache": "1.*", 229 | "phpunit/phpunit": "^5.7" 230 | }, 231 | "type": "library", 232 | "extra": { 233 | "branch-alias": { 234 | "dev-master": "1.4.x-dev" 235 | } 236 | }, 237 | "autoload": { 238 | "psr-4": { 239 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 240 | } 241 | }, 242 | "notification-url": "https://packagist.org/downloads/", 243 | "license": [ 244 | "MIT" 245 | ], 246 | "authors": [ 247 | { 248 | "name": "Roman Borschel", 249 | "email": "roman@code-factory.org" 250 | }, 251 | { 252 | "name": "Benjamin Eberlei", 253 | "email": "kontakt@beberlei.de" 254 | }, 255 | { 256 | "name": "Guilherme Blanco", 257 | "email": "guilhermeblanco@gmail.com" 258 | }, 259 | { 260 | "name": "Jonathan Wage", 261 | "email": "jonwage@gmail.com" 262 | }, 263 | { 264 | "name": "Johannes Schmitt", 265 | "email": "schmittjoh@gmail.com" 266 | } 267 | ], 268 | "description": "Docblock Annotations Parser", 269 | "homepage": "http://www.doctrine-project.org", 270 | "keywords": [ 271 | "annotations", 272 | "docblock", 273 | "parser" 274 | ], 275 | "time": "2017-02-24T16:22:25+00:00" 276 | }, 277 | { 278 | "name": "doctrine/instantiator", 279 | "version": "1.0.x-dev", 280 | "source": { 281 | "type": "git", 282 | "url": "https://github.com/doctrine/instantiator.git", 283 | "reference": "83b5716aee90e1f733512942c635ac350cbd533c" 284 | }, 285 | "dist": { 286 | "type": "zip", 287 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/83b5716aee90e1f733512942c635ac350cbd533c", 288 | "reference": "83b5716aee90e1f733512942c635ac350cbd533c", 289 | "shasum": "" 290 | }, 291 | "require": { 292 | "php": ">=5.3,<8.0-DEV" 293 | }, 294 | "require-dev": { 295 | "athletic/athletic": "~0.1.8", 296 | "ext-pdo": "*", 297 | "ext-phar": "*", 298 | "phpunit/phpunit": "~4.0", 299 | "squizlabs/php_codesniffer": "~2.0" 300 | }, 301 | "type": "library", 302 | "extra": { 303 | "branch-alias": { 304 | "dev-master": "1.0.x-dev" 305 | } 306 | }, 307 | "autoload": { 308 | "psr-4": { 309 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 310 | } 311 | }, 312 | "notification-url": "https://packagist.org/downloads/", 313 | "license": [ 314 | "MIT" 315 | ], 316 | "authors": [ 317 | { 318 | "name": "Marco Pivetta", 319 | "email": "ocramius@gmail.com", 320 | "homepage": "http://ocramius.github.com/" 321 | } 322 | ], 323 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 324 | "homepage": "https://github.com/doctrine/instantiator", 325 | "keywords": [ 326 | "constructor", 327 | "instantiate" 328 | ], 329 | "time": "2018-09-01T02:07:49+00:00" 330 | }, 331 | { 332 | "name": "doctrine/lexer", 333 | "version": "dev-master", 334 | "source": { 335 | "type": "git", 336 | "url": "https://github.com/doctrine/lexer.git", 337 | "reference": "4ab6ea7c838ccb340883fd78915af079949cc64d" 338 | }, 339 | "dist": { 340 | "type": "zip", 341 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/4ab6ea7c838ccb340883fd78915af079949cc64d", 342 | "reference": "4ab6ea7c838ccb340883fd78915af079949cc64d", 343 | "shasum": "" 344 | }, 345 | "require": { 346 | "php": ">=5.3.2" 347 | }, 348 | "require-dev": { 349 | "phpunit/phpunit": "^4.5" 350 | }, 351 | "type": "library", 352 | "extra": { 353 | "branch-alias": { 354 | "dev-master": "1.0.x-dev" 355 | } 356 | }, 357 | "autoload": { 358 | "psr-4": { 359 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 360 | } 361 | }, 362 | "notification-url": "https://packagist.org/downloads/", 363 | "license": [ 364 | "MIT" 365 | ], 366 | "authors": [ 367 | { 368 | "name": "Roman Borschel", 369 | "email": "roman@code-factory.org" 370 | }, 371 | { 372 | "name": "Guilherme Blanco", 373 | "email": "guilhermeblanco@gmail.com" 374 | }, 375 | { 376 | "name": "Johannes Schmitt", 377 | "email": "schmittjoh@gmail.com" 378 | } 379 | ], 380 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 381 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 382 | "keywords": [ 383 | "annotations", 384 | "docblock", 385 | "lexer", 386 | "parser", 387 | "php" 388 | ], 389 | "time": "2018-10-21T19:22:05+00:00" 390 | }, 391 | { 392 | "name": "friendsofphp/php-cs-fixer", 393 | "version": "dev-master", 394 | "source": { 395 | "type": "git", 396 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", 397 | "reference": "51209a633d558ee9f53c1255ff9d06dbe0d7d404" 398 | }, 399 | "dist": { 400 | "type": "zip", 401 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/51209a633d558ee9f53c1255ff9d06dbe0d7d404", 402 | "reference": "51209a633d558ee9f53c1255ff9d06dbe0d7d404", 403 | "shasum": "" 404 | }, 405 | "require": { 406 | "composer/semver": "^1.4", 407 | "composer/xdebug-handler": "^1.2", 408 | "doctrine/annotations": "^1.2", 409 | "ext-json": "*", 410 | "ext-tokenizer": "*", 411 | "php": "^5.6 || ^7.0", 412 | "php-cs-fixer/diff": "^1.3", 413 | "symfony/console": "^3.4.17 || ^4.1.6", 414 | "symfony/event-dispatcher": "^3.0 || ^4.0", 415 | "symfony/filesystem": "^3.0 || ^4.0", 416 | "symfony/finder": "^3.0 || ^4.0", 417 | "symfony/options-resolver": "^3.0 || ^4.0", 418 | "symfony/polyfill-php70": "^1.0", 419 | "symfony/polyfill-php72": "^1.4", 420 | "symfony/process": "^3.0 || ^4.0", 421 | "symfony/stopwatch": "^3.0 || ^4.0" 422 | }, 423 | "require-dev": { 424 | "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", 425 | "justinrainbow/json-schema": "^5.0", 426 | "keradus/cli-executor": "^1.2", 427 | "mikey179/vfsstream": "^1.6", 428 | "php-coveralls/php-coveralls": "^2.1", 429 | "php-cs-fixer/accessible-object": "^1.0", 430 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.0.1", 431 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.0.1", 432 | "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1", 433 | "phpunitgoodpractices/traits": "^1.5.1", 434 | "symfony/phpunit-bridge": "^4.0" 435 | }, 436 | "suggest": { 437 | "ext-mbstring": "For handling non-UTF8 characters in cache signature.", 438 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", 439 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", 440 | "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." 441 | }, 442 | "bin": [ 443 | "php-cs-fixer" 444 | ], 445 | "type": "application", 446 | "extra": { 447 | "branch-alias": { 448 | "dev-master": "2.15-dev" 449 | } 450 | }, 451 | "autoload": { 452 | "psr-4": { 453 | "PhpCsFixer\\": "src/" 454 | }, 455 | "classmap": [ 456 | "tests/Test/AbstractFixerTestCase.php", 457 | "tests/Test/AbstractIntegrationCaseFactory.php", 458 | "tests/Test/AbstractIntegrationTestCase.php", 459 | "tests/Test/Assert/AssertTokensTrait.php", 460 | "tests/Test/IntegrationCase.php", 461 | "tests/Test/IntegrationCaseFactory.php", 462 | "tests/Test/IntegrationCaseFactoryInterface.php", 463 | "tests/Test/InternalIntegrationCaseFactory.php", 464 | "tests/TestCase.php" 465 | ] 466 | }, 467 | "notification-url": "https://packagist.org/downloads/", 468 | "license": [ 469 | "MIT" 470 | ], 471 | "authors": [ 472 | { 473 | "name": "Dariusz Rumiński", 474 | "email": "dariusz.ruminski@gmail.com" 475 | }, 476 | { 477 | "name": "Fabien Potencier", 478 | "email": "fabien@symfony.com" 479 | } 480 | ], 481 | "description": "A tool to automatically fix PHP code style", 482 | "time": "2019-02-17T17:45:07+00:00" 483 | }, 484 | { 485 | "name": "myclabs/deep-copy", 486 | "version": "1.7.0", 487 | "source": { 488 | "type": "git", 489 | "url": "https://github.com/myclabs/DeepCopy.git", 490 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" 491 | }, 492 | "dist": { 493 | "type": "zip", 494 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 495 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 496 | "shasum": "" 497 | }, 498 | "require": { 499 | "php": "^5.6 || ^7.0" 500 | }, 501 | "require-dev": { 502 | "doctrine/collections": "^1.0", 503 | "doctrine/common": "^2.6", 504 | "phpunit/phpunit": "^4.1" 505 | }, 506 | "type": "library", 507 | "autoload": { 508 | "psr-4": { 509 | "DeepCopy\\": "src/DeepCopy/" 510 | }, 511 | "files": [ 512 | "src/DeepCopy/deep_copy.php" 513 | ] 514 | }, 515 | "notification-url": "https://packagist.org/downloads/", 516 | "license": [ 517 | "MIT" 518 | ], 519 | "description": "Create deep copies (clones) of your objects", 520 | "keywords": [ 521 | "clone", 522 | "copy", 523 | "duplicate", 524 | "object", 525 | "object graph" 526 | ], 527 | "time": "2017-10-19T19:58:43+00:00" 528 | }, 529 | { 530 | "name": "paragonie/random_compat", 531 | "version": "v9.99.99.x-dev", 532 | "source": { 533 | "type": "git", 534 | "url": "https://github.com/paragonie/random_compat.git", 535 | "reference": "0947f25b883d4172df340a0d95f1b7cdabc5368a" 536 | }, 537 | "dist": { 538 | "type": "zip", 539 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0947f25b883d4172df340a0d95f1b7cdabc5368a", 540 | "reference": "0947f25b883d4172df340a0d95f1b7cdabc5368a", 541 | "shasum": "" 542 | }, 543 | "require": { 544 | "php": "^7" 545 | }, 546 | "require-dev": { 547 | "phpunit/phpunit": "4.*|5.*", 548 | "vimeo/psalm": "^1" 549 | }, 550 | "type": "library", 551 | "notification-url": "https://packagist.org/downloads/", 552 | "license": [ 553 | "MIT" 554 | ], 555 | "authors": [ 556 | { 557 | "name": "Paragon Initiative Enterprises", 558 | "email": "security@paragonie.com", 559 | "homepage": "https://paragonie.com" 560 | } 561 | ], 562 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 563 | "keywords": [ 564 | "csprng", 565 | "polyfill", 566 | "pseudorandom", 567 | "random" 568 | ], 569 | "time": "2018-08-07T13:07:48+00:00" 570 | }, 571 | { 572 | "name": "phar-io/manifest", 573 | "version": "1.0.1", 574 | "source": { 575 | "type": "git", 576 | "url": "https://github.com/phar-io/manifest.git", 577 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" 578 | }, 579 | "dist": { 580 | "type": "zip", 581 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", 582 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", 583 | "shasum": "" 584 | }, 585 | "require": { 586 | "ext-dom": "*", 587 | "ext-phar": "*", 588 | "phar-io/version": "^1.0.1", 589 | "php": "^5.6 || ^7.0" 590 | }, 591 | "type": "library", 592 | "extra": { 593 | "branch-alias": { 594 | "dev-master": "1.0.x-dev" 595 | } 596 | }, 597 | "autoload": { 598 | "classmap": [ 599 | "src/" 600 | ] 601 | }, 602 | "notification-url": "https://packagist.org/downloads/", 603 | "license": [ 604 | "BSD-3-Clause" 605 | ], 606 | "authors": [ 607 | { 608 | "name": "Arne Blankerts", 609 | "email": "arne@blankerts.de", 610 | "role": "Developer" 611 | }, 612 | { 613 | "name": "Sebastian Heuer", 614 | "email": "sebastian@phpeople.de", 615 | "role": "Developer" 616 | }, 617 | { 618 | "name": "Sebastian Bergmann", 619 | "email": "sebastian@phpunit.de", 620 | "role": "Developer" 621 | } 622 | ], 623 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 624 | "time": "2017-03-05T18:14:27+00:00" 625 | }, 626 | { 627 | "name": "phar-io/version", 628 | "version": "1.0.1", 629 | "source": { 630 | "type": "git", 631 | "url": "https://github.com/phar-io/version.git", 632 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" 633 | }, 634 | "dist": { 635 | "type": "zip", 636 | "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", 637 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", 638 | "shasum": "" 639 | }, 640 | "require": { 641 | "php": "^5.6 || ^7.0" 642 | }, 643 | "type": "library", 644 | "autoload": { 645 | "classmap": [ 646 | "src/" 647 | ] 648 | }, 649 | "notification-url": "https://packagist.org/downloads/", 650 | "license": [ 651 | "BSD-3-Clause" 652 | ], 653 | "authors": [ 654 | { 655 | "name": "Arne Blankerts", 656 | "email": "arne@blankerts.de", 657 | "role": "Developer" 658 | }, 659 | { 660 | "name": "Sebastian Heuer", 661 | "email": "sebastian@phpeople.de", 662 | "role": "Developer" 663 | }, 664 | { 665 | "name": "Sebastian Bergmann", 666 | "email": "sebastian@phpunit.de", 667 | "role": "Developer" 668 | } 669 | ], 670 | "description": "Library for handling version information and constraints", 671 | "time": "2017-03-05T17:38:23+00:00" 672 | }, 673 | { 674 | "name": "php-cs-fixer/diff", 675 | "version": "v1.3.0", 676 | "source": { 677 | "type": "git", 678 | "url": "https://github.com/PHP-CS-Fixer/diff.git", 679 | "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" 680 | }, 681 | "dist": { 682 | "type": "zip", 683 | "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", 684 | "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", 685 | "shasum": "" 686 | }, 687 | "require": { 688 | "php": "^5.6 || ^7.0" 689 | }, 690 | "require-dev": { 691 | "phpunit/phpunit": "^5.7.23 || ^6.4.3", 692 | "symfony/process": "^3.3" 693 | }, 694 | "type": "library", 695 | "autoload": { 696 | "classmap": [ 697 | "src/" 698 | ] 699 | }, 700 | "notification-url": "https://packagist.org/downloads/", 701 | "license": [ 702 | "BSD-3-Clause" 703 | ], 704 | "authors": [ 705 | { 706 | "name": "Kore Nordmann", 707 | "email": "mail@kore-nordmann.de" 708 | }, 709 | { 710 | "name": "Sebastian Bergmann", 711 | "email": "sebastian@phpunit.de" 712 | }, 713 | { 714 | "name": "SpacePossum" 715 | } 716 | ], 717 | "description": "sebastian/diff v2 backport support for PHP5.6", 718 | "homepage": "https://github.com/PHP-CS-Fixer", 719 | "keywords": [ 720 | "diff" 721 | ], 722 | "time": "2018-02-15T16:58:55+00:00" 723 | }, 724 | { 725 | "name": "phpdocumentor/reflection-common", 726 | "version": "1.0.1", 727 | "source": { 728 | "type": "git", 729 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 730 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 731 | }, 732 | "dist": { 733 | "type": "zip", 734 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 735 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 736 | "shasum": "" 737 | }, 738 | "require": { 739 | "php": ">=5.5" 740 | }, 741 | "require-dev": { 742 | "phpunit/phpunit": "^4.6" 743 | }, 744 | "type": "library", 745 | "extra": { 746 | "branch-alias": { 747 | "dev-master": "1.0.x-dev" 748 | } 749 | }, 750 | "autoload": { 751 | "psr-4": { 752 | "phpDocumentor\\Reflection\\": [ 753 | "src" 754 | ] 755 | } 756 | }, 757 | "notification-url": "https://packagist.org/downloads/", 758 | "license": [ 759 | "MIT" 760 | ], 761 | "authors": [ 762 | { 763 | "name": "Jaap van Otterdijk", 764 | "email": "opensource@ijaap.nl" 765 | } 766 | ], 767 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 768 | "homepage": "http://www.phpdoc.org", 769 | "keywords": [ 770 | "FQSEN", 771 | "phpDocumentor", 772 | "phpdoc", 773 | "reflection", 774 | "static analysis" 775 | ], 776 | "time": "2017-09-11T18:02:19+00:00" 777 | }, 778 | { 779 | "name": "phpdocumentor/reflection-docblock", 780 | "version": "4.3.0", 781 | "source": { 782 | "type": "git", 783 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 784 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 785 | }, 786 | "dist": { 787 | "type": "zip", 788 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 789 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 790 | "shasum": "" 791 | }, 792 | "require": { 793 | "php": "^7.0", 794 | "phpdocumentor/reflection-common": "^1.0.0", 795 | "phpdocumentor/type-resolver": "^0.4.0", 796 | "webmozart/assert": "^1.0" 797 | }, 798 | "require-dev": { 799 | "doctrine/instantiator": "~1.0.5", 800 | "mockery/mockery": "^1.0", 801 | "phpunit/phpunit": "^6.4" 802 | }, 803 | "type": "library", 804 | "extra": { 805 | "branch-alias": { 806 | "dev-master": "4.x-dev" 807 | } 808 | }, 809 | "autoload": { 810 | "psr-4": { 811 | "phpDocumentor\\Reflection\\": [ 812 | "src/" 813 | ] 814 | } 815 | }, 816 | "notification-url": "https://packagist.org/downloads/", 817 | "license": [ 818 | "MIT" 819 | ], 820 | "authors": [ 821 | { 822 | "name": "Mike van Riel", 823 | "email": "me@mikevanriel.com" 824 | } 825 | ], 826 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 827 | "time": "2017-11-30T07:14:17+00:00" 828 | }, 829 | { 830 | "name": "phpdocumentor/type-resolver", 831 | "version": "0.4.0", 832 | "source": { 833 | "type": "git", 834 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 835 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 836 | }, 837 | "dist": { 838 | "type": "zip", 839 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 840 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 841 | "shasum": "" 842 | }, 843 | "require": { 844 | "php": "^5.5 || ^7.0", 845 | "phpdocumentor/reflection-common": "^1.0" 846 | }, 847 | "require-dev": { 848 | "mockery/mockery": "^0.9.4", 849 | "phpunit/phpunit": "^5.2||^4.8.24" 850 | }, 851 | "type": "library", 852 | "extra": { 853 | "branch-alias": { 854 | "dev-master": "1.0.x-dev" 855 | } 856 | }, 857 | "autoload": { 858 | "psr-4": { 859 | "phpDocumentor\\Reflection\\": [ 860 | "src/" 861 | ] 862 | } 863 | }, 864 | "notification-url": "https://packagist.org/downloads/", 865 | "license": [ 866 | "MIT" 867 | ], 868 | "authors": [ 869 | { 870 | "name": "Mike van Riel", 871 | "email": "me@mikevanriel.com" 872 | } 873 | ], 874 | "time": "2017-07-14T14:27:02+00:00" 875 | }, 876 | { 877 | "name": "phpspec/prophecy", 878 | "version": "dev-master", 879 | "source": { 880 | "type": "git", 881 | "url": "https://github.com/phpspec/prophecy.git", 882 | "reference": "7e272180527c34a97680de85eb5aba0847a664e0" 883 | }, 884 | "dist": { 885 | "type": "zip", 886 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/7e272180527c34a97680de85eb5aba0847a664e0", 887 | "reference": "7e272180527c34a97680de85eb5aba0847a664e0", 888 | "shasum": "" 889 | }, 890 | "require": { 891 | "doctrine/instantiator": "^1.0.2", 892 | "php": "^5.3|^7.0", 893 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 894 | "sebastian/comparator": "^1.1|^2.0|^3.0", 895 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 896 | }, 897 | "require-dev": { 898 | "phpspec/phpspec": "^2.5|^3.2", 899 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 900 | }, 901 | "type": "library", 902 | "extra": { 903 | "branch-alias": { 904 | "dev-master": "1.8.x-dev" 905 | } 906 | }, 907 | "autoload": { 908 | "psr-4": { 909 | "Prophecy\\": "src/Prophecy" 910 | } 911 | }, 912 | "notification-url": "https://packagist.org/downloads/", 913 | "license": [ 914 | "MIT" 915 | ], 916 | "authors": [ 917 | { 918 | "name": "Konstantin Kudryashov", 919 | "email": "ever.zet@gmail.com", 920 | "homepage": "http://everzet.com" 921 | }, 922 | { 923 | "name": "Marcello Duarte", 924 | "email": "marcello.duarte@gmail.com" 925 | } 926 | ], 927 | "description": "Highly opinionated mocking framework for PHP 5.3+", 928 | "homepage": "https://github.com/phpspec/prophecy", 929 | "keywords": [ 930 | "Double", 931 | "Dummy", 932 | "fake", 933 | "mock", 934 | "spy", 935 | "stub" 936 | ], 937 | "time": "2018-12-18T15:40:51+00:00" 938 | }, 939 | { 940 | "name": "phpunit/php-code-coverage", 941 | "version": "5.3.x-dev", 942 | "source": { 943 | "type": "git", 944 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 945 | "reference": "83f09c29758c52e71bdb81ad2cc9124b85b5a4ef" 946 | }, 947 | "dist": { 948 | "type": "zip", 949 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/83f09c29758c52e71bdb81ad2cc9124b85b5a4ef", 950 | "reference": "83f09c29758c52e71bdb81ad2cc9124b85b5a4ef", 951 | "shasum": "" 952 | }, 953 | "require": { 954 | "ext-dom": "*", 955 | "ext-xmlwriter": "*", 956 | "php": "^7.0", 957 | "phpunit/php-file-iterator": "^1.4.2", 958 | "phpunit/php-text-template": "^1.2.1", 959 | "phpunit/php-token-stream": "^2.0.1", 960 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 961 | "sebastian/environment": "^3.0", 962 | "sebastian/version": "^2.0.1", 963 | "theseer/tokenizer": "^1.1" 964 | }, 965 | "require-dev": { 966 | "phpunit/phpunit": "^6.0" 967 | }, 968 | "suggest": { 969 | "ext-xdebug": "^2.5.5" 970 | }, 971 | "type": "library", 972 | "extra": { 973 | "branch-alias": { 974 | "dev-master": "5.3.x-dev" 975 | } 976 | }, 977 | "autoload": { 978 | "classmap": [ 979 | "src/" 980 | ] 981 | }, 982 | "notification-url": "https://packagist.org/downloads/", 983 | "license": [ 984 | "BSD-3-Clause" 985 | ], 986 | "authors": [ 987 | { 988 | "name": "Sebastian Bergmann", 989 | "email": "sebastian@phpunit.de", 990 | "role": "lead" 991 | } 992 | ], 993 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 994 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 995 | "keywords": [ 996 | "coverage", 997 | "testing", 998 | "xunit" 999 | ], 1000 | "time": "2018-04-07T12:06:18+00:00" 1001 | }, 1002 | { 1003 | "name": "phpunit/php-file-iterator", 1004 | "version": "1.4.x-dev", 1005 | "source": { 1006 | "type": "git", 1007 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1008 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 1009 | }, 1010 | "dist": { 1011 | "type": "zip", 1012 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 1013 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 1014 | "shasum": "" 1015 | }, 1016 | "require": { 1017 | "php": ">=5.3.3" 1018 | }, 1019 | "type": "library", 1020 | "extra": { 1021 | "branch-alias": { 1022 | "dev-master": "1.4.x-dev" 1023 | } 1024 | }, 1025 | "autoload": { 1026 | "classmap": [ 1027 | "src/" 1028 | ] 1029 | }, 1030 | "notification-url": "https://packagist.org/downloads/", 1031 | "license": [ 1032 | "BSD-3-Clause" 1033 | ], 1034 | "authors": [ 1035 | { 1036 | "name": "Sebastian Bergmann", 1037 | "email": "sb@sebastian-bergmann.de", 1038 | "role": "lead" 1039 | } 1040 | ], 1041 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1042 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1043 | "keywords": [ 1044 | "filesystem", 1045 | "iterator" 1046 | ], 1047 | "time": "2017-11-27T13:52:08+00:00" 1048 | }, 1049 | { 1050 | "name": "phpunit/php-text-template", 1051 | "version": "1.2.1", 1052 | "source": { 1053 | "type": "git", 1054 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1055 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 1056 | }, 1057 | "dist": { 1058 | "type": "zip", 1059 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1060 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1061 | "shasum": "" 1062 | }, 1063 | "require": { 1064 | "php": ">=5.3.3" 1065 | }, 1066 | "type": "library", 1067 | "autoload": { 1068 | "classmap": [ 1069 | "src/" 1070 | ] 1071 | }, 1072 | "notification-url": "https://packagist.org/downloads/", 1073 | "license": [ 1074 | "BSD-3-Clause" 1075 | ], 1076 | "authors": [ 1077 | { 1078 | "name": "Sebastian Bergmann", 1079 | "email": "sebastian@phpunit.de", 1080 | "role": "lead" 1081 | } 1082 | ], 1083 | "description": "Simple template engine.", 1084 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1085 | "keywords": [ 1086 | "template" 1087 | ], 1088 | "time": "2015-06-21T13:50:34+00:00" 1089 | }, 1090 | { 1091 | "name": "phpunit/php-timer", 1092 | "version": "1.0.x-dev", 1093 | "source": { 1094 | "type": "git", 1095 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1096 | "reference": "9513098641797ce5f459dbc1de5a54c29b0ec1fb" 1097 | }, 1098 | "dist": { 1099 | "type": "zip", 1100 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/9513098641797ce5f459dbc1de5a54c29b0ec1fb", 1101 | "reference": "9513098641797ce5f459dbc1de5a54c29b0ec1fb", 1102 | "shasum": "" 1103 | }, 1104 | "require": { 1105 | "php": "^5.3.3 || ^7.0" 1106 | }, 1107 | "require-dev": { 1108 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1109 | }, 1110 | "type": "library", 1111 | "extra": { 1112 | "branch-alias": { 1113 | "dev-master": "1.0-dev" 1114 | } 1115 | }, 1116 | "autoload": { 1117 | "classmap": [ 1118 | "src/" 1119 | ] 1120 | }, 1121 | "notification-url": "https://packagist.org/downloads/", 1122 | "license": [ 1123 | "BSD-3-Clause" 1124 | ], 1125 | "authors": [ 1126 | { 1127 | "name": "Sebastian Bergmann", 1128 | "email": "sb@sebastian-bergmann.de", 1129 | "role": "lead" 1130 | } 1131 | ], 1132 | "description": "Utility class for timing", 1133 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1134 | "keywords": [ 1135 | "timer" 1136 | ], 1137 | "time": "2018-01-06T05:27:16+00:00" 1138 | }, 1139 | { 1140 | "name": "phpunit/php-token-stream", 1141 | "version": "2.0.x-dev", 1142 | "source": { 1143 | "type": "git", 1144 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 1145 | "reference": "13eb9aba9626b1a3811c6a492acc9669d24bb85a" 1146 | }, 1147 | "dist": { 1148 | "type": "zip", 1149 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/13eb9aba9626b1a3811c6a492acc9669d24bb85a", 1150 | "reference": "13eb9aba9626b1a3811c6a492acc9669d24bb85a", 1151 | "shasum": "" 1152 | }, 1153 | "require": { 1154 | "ext-tokenizer": "*", 1155 | "php": "^7.0" 1156 | }, 1157 | "require-dev": { 1158 | "phpunit/phpunit": "^6.2.4" 1159 | }, 1160 | "type": "library", 1161 | "extra": { 1162 | "branch-alias": { 1163 | "dev-master": "2.0-dev" 1164 | } 1165 | }, 1166 | "autoload": { 1167 | "classmap": [ 1168 | "src/" 1169 | ] 1170 | }, 1171 | "notification-url": "https://packagist.org/downloads/", 1172 | "license": [ 1173 | "BSD-3-Clause" 1174 | ], 1175 | "authors": [ 1176 | { 1177 | "name": "Sebastian Bergmann", 1178 | "email": "sebastian@phpunit.de" 1179 | } 1180 | ], 1181 | "description": "Wrapper around PHP's tokenizer extension.", 1182 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1183 | "keywords": [ 1184 | "tokenizer" 1185 | ], 1186 | "time": "2017-11-27T08:47:38+00:00" 1187 | }, 1188 | { 1189 | "name": "phpunit/phpunit", 1190 | "version": "6.5.14", 1191 | "source": { 1192 | "type": "git", 1193 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1194 | "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" 1195 | }, 1196 | "dist": { 1197 | "type": "zip", 1198 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", 1199 | "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", 1200 | "shasum": "" 1201 | }, 1202 | "require": { 1203 | "ext-dom": "*", 1204 | "ext-json": "*", 1205 | "ext-libxml": "*", 1206 | "ext-mbstring": "*", 1207 | "ext-xml": "*", 1208 | "myclabs/deep-copy": "^1.6.1", 1209 | "phar-io/manifest": "^1.0.1", 1210 | "phar-io/version": "^1.0", 1211 | "php": "^7.0", 1212 | "phpspec/prophecy": "^1.7", 1213 | "phpunit/php-code-coverage": "^5.3", 1214 | "phpunit/php-file-iterator": "^1.4.3", 1215 | "phpunit/php-text-template": "^1.2.1", 1216 | "phpunit/php-timer": "^1.0.9", 1217 | "phpunit/phpunit-mock-objects": "^5.0.9", 1218 | "sebastian/comparator": "^2.1", 1219 | "sebastian/diff": "^2.0", 1220 | "sebastian/environment": "^3.1", 1221 | "sebastian/exporter": "^3.1", 1222 | "sebastian/global-state": "^2.0", 1223 | "sebastian/object-enumerator": "^3.0.3", 1224 | "sebastian/resource-operations": "^1.0", 1225 | "sebastian/version": "^2.0.1" 1226 | }, 1227 | "conflict": { 1228 | "phpdocumentor/reflection-docblock": "3.0.2", 1229 | "phpunit/dbunit": "<3.0" 1230 | }, 1231 | "require-dev": { 1232 | "ext-pdo": "*" 1233 | }, 1234 | "suggest": { 1235 | "ext-xdebug": "*", 1236 | "phpunit/php-invoker": "^1.1" 1237 | }, 1238 | "bin": [ 1239 | "phpunit" 1240 | ], 1241 | "type": "library", 1242 | "extra": { 1243 | "branch-alias": { 1244 | "dev-master": "6.5.x-dev" 1245 | } 1246 | }, 1247 | "autoload": { 1248 | "classmap": [ 1249 | "src/" 1250 | ] 1251 | }, 1252 | "notification-url": "https://packagist.org/downloads/", 1253 | "license": [ 1254 | "BSD-3-Clause" 1255 | ], 1256 | "authors": [ 1257 | { 1258 | "name": "Sebastian Bergmann", 1259 | "email": "sebastian@phpunit.de", 1260 | "role": "lead" 1261 | } 1262 | ], 1263 | "description": "The PHP Unit Testing framework.", 1264 | "homepage": "https://phpunit.de/", 1265 | "keywords": [ 1266 | "phpunit", 1267 | "testing", 1268 | "xunit" 1269 | ], 1270 | "time": "2019-02-01T05:22:47+00:00" 1271 | }, 1272 | { 1273 | "name": "phpunit/phpunit-mock-objects", 1274 | "version": "5.0.x-dev", 1275 | "source": { 1276 | "type": "git", 1277 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 1278 | "reference": "13862f9c620ffbc8895792abe2a9e473326fb905" 1279 | }, 1280 | "dist": { 1281 | "type": "zip", 1282 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/13862f9c620ffbc8895792abe2a9e473326fb905", 1283 | "reference": "13862f9c620ffbc8895792abe2a9e473326fb905", 1284 | "shasum": "" 1285 | }, 1286 | "require": { 1287 | "doctrine/instantiator": "^1.0.5", 1288 | "php": "^7.0", 1289 | "phpunit/php-text-template": "^1.2.1", 1290 | "sebastian/exporter": "^3.1" 1291 | }, 1292 | "conflict": { 1293 | "phpunit/phpunit": "<6.0" 1294 | }, 1295 | "require-dev": { 1296 | "phpunit/phpunit": "^6.5.11" 1297 | }, 1298 | "suggest": { 1299 | "ext-soap": "*" 1300 | }, 1301 | "type": "library", 1302 | "extra": { 1303 | "branch-alias": { 1304 | "dev-master": "5.0.x-dev" 1305 | } 1306 | }, 1307 | "autoload": { 1308 | "classmap": [ 1309 | "src/" 1310 | ] 1311 | }, 1312 | "notification-url": "https://packagist.org/downloads/", 1313 | "license": [ 1314 | "BSD-3-Clause" 1315 | ], 1316 | "authors": [ 1317 | { 1318 | "name": "Sebastian Bergmann", 1319 | "email": "sebastian@phpunit.de", 1320 | "role": "lead" 1321 | } 1322 | ], 1323 | "description": "Mock Object library for PHPUnit", 1324 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 1325 | "keywords": [ 1326 | "mock", 1327 | "xunit" 1328 | ], 1329 | "abandoned": true, 1330 | "time": "2018-09-09T05:48:43+00:00" 1331 | }, 1332 | { 1333 | "name": "psr/log", 1334 | "version": "dev-master", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/php-fig/log.git", 1338 | "reference": "c4421fcac1edd5a324fda73e589a5cf96e52ffd0" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/php-fig/log/zipball/c4421fcac1edd5a324fda73e589a5cf96e52ffd0", 1343 | "reference": "c4421fcac1edd5a324fda73e589a5cf96e52ffd0", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": ">=5.3.0" 1348 | }, 1349 | "type": "library", 1350 | "extra": { 1351 | "branch-alias": { 1352 | "dev-master": "1.1.x-dev" 1353 | } 1354 | }, 1355 | "autoload": { 1356 | "psr-4": { 1357 | "Psr\\Log\\": "Psr/Log/" 1358 | } 1359 | }, 1360 | "notification-url": "https://packagist.org/downloads/", 1361 | "license": [ 1362 | "MIT" 1363 | ], 1364 | "authors": [ 1365 | { 1366 | "name": "PHP-FIG", 1367 | "homepage": "http://www.php-fig.org/" 1368 | } 1369 | ], 1370 | "description": "Common interface for logging libraries", 1371 | "homepage": "https://github.com/php-fig/log", 1372 | "keywords": [ 1373 | "log", 1374 | "psr", 1375 | "psr-3" 1376 | ], 1377 | "time": "2018-11-21T13:42:00+00:00" 1378 | }, 1379 | { 1380 | "name": "sebastian/code-unit-reverse-lookup", 1381 | "version": "dev-master", 1382 | "source": { 1383 | "type": "git", 1384 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1385 | "reference": "383c44e104c1fd46ecc915f55145bd2831318747" 1386 | }, 1387 | "dist": { 1388 | "type": "zip", 1389 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/383c44e104c1fd46ecc915f55145bd2831318747", 1390 | "reference": "383c44e104c1fd46ecc915f55145bd2831318747", 1391 | "shasum": "" 1392 | }, 1393 | "require": { 1394 | "php": "^5.6 || ^7.0" 1395 | }, 1396 | "require-dev": { 1397 | "phpunit/phpunit": "^5.7 || ^6.0" 1398 | }, 1399 | "type": "library", 1400 | "extra": { 1401 | "branch-alias": { 1402 | "dev-master": "1.0.x-dev" 1403 | } 1404 | }, 1405 | "autoload": { 1406 | "classmap": [ 1407 | "src/" 1408 | ] 1409 | }, 1410 | "notification-url": "https://packagist.org/downloads/", 1411 | "license": [ 1412 | "BSD-3-Clause" 1413 | ], 1414 | "authors": [ 1415 | { 1416 | "name": "Sebastian Bergmann", 1417 | "email": "sebastian@phpunit.de" 1418 | } 1419 | ], 1420 | "description": "Looks up which function or method a line of code belongs to", 1421 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1422 | "time": "2019-02-11T12:48:46+00:00" 1423 | }, 1424 | { 1425 | "name": "sebastian/comparator", 1426 | "version": "2.1.3", 1427 | "source": { 1428 | "type": "git", 1429 | "url": "https://github.com/sebastianbergmann/comparator.git", 1430 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" 1431 | }, 1432 | "dist": { 1433 | "type": "zip", 1434 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", 1435 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", 1436 | "shasum": "" 1437 | }, 1438 | "require": { 1439 | "php": "^7.0", 1440 | "sebastian/diff": "^2.0 || ^3.0", 1441 | "sebastian/exporter": "^3.1" 1442 | }, 1443 | "require-dev": { 1444 | "phpunit/phpunit": "^6.4" 1445 | }, 1446 | "type": "library", 1447 | "extra": { 1448 | "branch-alias": { 1449 | "dev-master": "2.1.x-dev" 1450 | } 1451 | }, 1452 | "autoload": { 1453 | "classmap": [ 1454 | "src/" 1455 | ] 1456 | }, 1457 | "notification-url": "https://packagist.org/downloads/", 1458 | "license": [ 1459 | "BSD-3-Clause" 1460 | ], 1461 | "authors": [ 1462 | { 1463 | "name": "Jeff Welch", 1464 | "email": "whatthejeff@gmail.com" 1465 | }, 1466 | { 1467 | "name": "Volker Dusch", 1468 | "email": "github@wallbash.com" 1469 | }, 1470 | { 1471 | "name": "Bernhard Schussek", 1472 | "email": "bschussek@2bepublished.at" 1473 | }, 1474 | { 1475 | "name": "Sebastian Bergmann", 1476 | "email": "sebastian@phpunit.de" 1477 | } 1478 | ], 1479 | "description": "Provides the functionality to compare PHP values for equality", 1480 | "homepage": "https://github.com/sebastianbergmann/comparator", 1481 | "keywords": [ 1482 | "comparator", 1483 | "compare", 1484 | "equality" 1485 | ], 1486 | "time": "2018-02-01T13:46:46+00:00" 1487 | }, 1488 | { 1489 | "name": "sebastian/diff", 1490 | "version": "2.0.x-dev", 1491 | "source": { 1492 | "type": "git", 1493 | "url": "https://github.com/sebastianbergmann/diff.git", 1494 | "reference": "abcc70409ddfb310a8cb41ef0c2e857425438cf4" 1495 | }, 1496 | "dist": { 1497 | "type": "zip", 1498 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/abcc70409ddfb310a8cb41ef0c2e857425438cf4", 1499 | "reference": "abcc70409ddfb310a8cb41ef0c2e857425438cf4", 1500 | "shasum": "" 1501 | }, 1502 | "require": { 1503 | "php": "^7.0" 1504 | }, 1505 | "require-dev": { 1506 | "phpunit/phpunit": "^6.2" 1507 | }, 1508 | "type": "library", 1509 | "extra": { 1510 | "branch-alias": { 1511 | "dev-master": "2.0-dev" 1512 | } 1513 | }, 1514 | "autoload": { 1515 | "classmap": [ 1516 | "src/" 1517 | ] 1518 | }, 1519 | "notification-url": "https://packagist.org/downloads/", 1520 | "license": [ 1521 | "BSD-3-Clause" 1522 | ], 1523 | "authors": [ 1524 | { 1525 | "name": "Kore Nordmann", 1526 | "email": "mail@kore-nordmann.de" 1527 | }, 1528 | { 1529 | "name": "Sebastian Bergmann", 1530 | "email": "sebastian@phpunit.de" 1531 | } 1532 | ], 1533 | "description": "Diff implementation", 1534 | "homepage": "https://github.com/sebastianbergmann/diff", 1535 | "keywords": [ 1536 | "diff" 1537 | ], 1538 | "time": "2017-12-14T11:32:19+00:00" 1539 | }, 1540 | { 1541 | "name": "sebastian/environment", 1542 | "version": "3.1.0", 1543 | "source": { 1544 | "type": "git", 1545 | "url": "https://github.com/sebastianbergmann/environment.git", 1546 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 1547 | }, 1548 | "dist": { 1549 | "type": "zip", 1550 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 1551 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 1552 | "shasum": "" 1553 | }, 1554 | "require": { 1555 | "php": "^7.0" 1556 | }, 1557 | "require-dev": { 1558 | "phpunit/phpunit": "^6.1" 1559 | }, 1560 | "type": "library", 1561 | "extra": { 1562 | "branch-alias": { 1563 | "dev-master": "3.1.x-dev" 1564 | } 1565 | }, 1566 | "autoload": { 1567 | "classmap": [ 1568 | "src/" 1569 | ] 1570 | }, 1571 | "notification-url": "https://packagist.org/downloads/", 1572 | "license": [ 1573 | "BSD-3-Clause" 1574 | ], 1575 | "authors": [ 1576 | { 1577 | "name": "Sebastian Bergmann", 1578 | "email": "sebastian@phpunit.de" 1579 | } 1580 | ], 1581 | "description": "Provides functionality to handle HHVM/PHP environments", 1582 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1583 | "keywords": [ 1584 | "Xdebug", 1585 | "environment", 1586 | "hhvm" 1587 | ], 1588 | "time": "2017-07-01T08:51:00+00:00" 1589 | }, 1590 | { 1591 | "name": "sebastian/exporter", 1592 | "version": "dev-master", 1593 | "source": { 1594 | "type": "git", 1595 | "url": "https://github.com/sebastianbergmann/exporter.git", 1596 | "reference": "8be786b3b65fbe706733d44a4b4a53d5391a4772" 1597 | }, 1598 | "dist": { 1599 | "type": "zip", 1600 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/8be786b3b65fbe706733d44a4b4a53d5391a4772", 1601 | "reference": "8be786b3b65fbe706733d44a4b4a53d5391a4772", 1602 | "shasum": "" 1603 | }, 1604 | "require": { 1605 | "php": "^7.0", 1606 | "sebastian/recursion-context": "^3.0" 1607 | }, 1608 | "require-dev": { 1609 | "ext-mbstring": "*", 1610 | "phpunit/phpunit": "^6.0" 1611 | }, 1612 | "type": "library", 1613 | "extra": { 1614 | "branch-alias": { 1615 | "dev-master": "3.1.x-dev" 1616 | } 1617 | }, 1618 | "autoload": { 1619 | "classmap": [ 1620 | "src/" 1621 | ] 1622 | }, 1623 | "notification-url": "https://packagist.org/downloads/", 1624 | "license": [ 1625 | "BSD-3-Clause" 1626 | ], 1627 | "authors": [ 1628 | { 1629 | "name": "Jeff Welch", 1630 | "email": "whatthejeff@gmail.com" 1631 | }, 1632 | { 1633 | "name": "Volker Dusch", 1634 | "email": "github@wallbash.com" 1635 | }, 1636 | { 1637 | "name": "Bernhard Schussek", 1638 | "email": "bschussek@2bepublished.at" 1639 | }, 1640 | { 1641 | "name": "Sebastian Bergmann", 1642 | "email": "sebastian@phpunit.de" 1643 | }, 1644 | { 1645 | "name": "Adam Harvey", 1646 | "email": "aharvey@php.net" 1647 | } 1648 | ], 1649 | "description": "Provides the functionality to export PHP variables for visualization", 1650 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1651 | "keywords": [ 1652 | "export", 1653 | "exporter" 1654 | ], 1655 | "time": "2019-02-11T12:49:46+00:00" 1656 | }, 1657 | { 1658 | "name": "sebastian/global-state", 1659 | "version": "2.0.0", 1660 | "source": { 1661 | "type": "git", 1662 | "url": "https://github.com/sebastianbergmann/global-state.git", 1663 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1664 | }, 1665 | "dist": { 1666 | "type": "zip", 1667 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1668 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1669 | "shasum": "" 1670 | }, 1671 | "require": { 1672 | "php": "^7.0" 1673 | }, 1674 | "require-dev": { 1675 | "phpunit/phpunit": "^6.0" 1676 | }, 1677 | "suggest": { 1678 | "ext-uopz": "*" 1679 | }, 1680 | "type": "library", 1681 | "extra": { 1682 | "branch-alias": { 1683 | "dev-master": "2.0-dev" 1684 | } 1685 | }, 1686 | "autoload": { 1687 | "classmap": [ 1688 | "src/" 1689 | ] 1690 | }, 1691 | "notification-url": "https://packagist.org/downloads/", 1692 | "license": [ 1693 | "BSD-3-Clause" 1694 | ], 1695 | "authors": [ 1696 | { 1697 | "name": "Sebastian Bergmann", 1698 | "email": "sebastian@phpunit.de" 1699 | } 1700 | ], 1701 | "description": "Snapshotting of global state", 1702 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1703 | "keywords": [ 1704 | "global state" 1705 | ], 1706 | "time": "2017-04-27T15:39:26+00:00" 1707 | }, 1708 | { 1709 | "name": "sebastian/object-enumerator", 1710 | "version": "dev-master", 1711 | "source": { 1712 | "type": "git", 1713 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1714 | "reference": "41af86e2a7b06e7e364c81a705b1f7caf6110218" 1715 | }, 1716 | "dist": { 1717 | "type": "zip", 1718 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/41af86e2a7b06e7e364c81a705b1f7caf6110218", 1719 | "reference": "41af86e2a7b06e7e364c81a705b1f7caf6110218", 1720 | "shasum": "" 1721 | }, 1722 | "require": { 1723 | "php": "^7.0", 1724 | "sebastian/object-reflector": "^1.1.1", 1725 | "sebastian/recursion-context": "^3.0" 1726 | }, 1727 | "require-dev": { 1728 | "phpunit/phpunit": "^6.0" 1729 | }, 1730 | "type": "library", 1731 | "extra": { 1732 | "branch-alias": { 1733 | "dev-master": "3.0.x-dev" 1734 | } 1735 | }, 1736 | "autoload": { 1737 | "classmap": [ 1738 | "src/" 1739 | ] 1740 | }, 1741 | "notification-url": "https://packagist.org/downloads/", 1742 | "license": [ 1743 | "BSD-3-Clause" 1744 | ], 1745 | "authors": [ 1746 | { 1747 | "name": "Sebastian Bergmann", 1748 | "email": "sebastian@phpunit.de" 1749 | } 1750 | ], 1751 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1752 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1753 | "time": "2019-02-11T12:50:05+00:00" 1754 | }, 1755 | { 1756 | "name": "sebastian/object-reflector", 1757 | "version": "dev-master", 1758 | "source": { 1759 | "type": "git", 1760 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1761 | "reference": "fae17b5d19ab523c9e821e5559d27e4c8a5bdee1" 1762 | }, 1763 | "dist": { 1764 | "type": "zip", 1765 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/fae17b5d19ab523c9e821e5559d27e4c8a5bdee1", 1766 | "reference": "fae17b5d19ab523c9e821e5559d27e4c8a5bdee1", 1767 | "shasum": "" 1768 | }, 1769 | "require": { 1770 | "php": "^7.0" 1771 | }, 1772 | "require-dev": { 1773 | "phpunit/phpunit": "^6.0" 1774 | }, 1775 | "type": "library", 1776 | "extra": { 1777 | "branch-alias": { 1778 | "dev-master": "1.1-dev" 1779 | } 1780 | }, 1781 | "autoload": { 1782 | "classmap": [ 1783 | "src/" 1784 | ] 1785 | }, 1786 | "notification-url": "https://packagist.org/downloads/", 1787 | "license": [ 1788 | "BSD-3-Clause" 1789 | ], 1790 | "authors": [ 1791 | { 1792 | "name": "Sebastian Bergmann", 1793 | "email": "sebastian@phpunit.de" 1794 | } 1795 | ], 1796 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1797 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1798 | "time": "2019-02-11T12:48:12+00:00" 1799 | }, 1800 | { 1801 | "name": "sebastian/recursion-context", 1802 | "version": "dev-master", 1803 | "source": { 1804 | "type": "git", 1805 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1806 | "reference": "87b0893f697db6d75943e26d50bf91c82796a371" 1807 | }, 1808 | "dist": { 1809 | "type": "zip", 1810 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/87b0893f697db6d75943e26d50bf91c82796a371", 1811 | "reference": "87b0893f697db6d75943e26d50bf91c82796a371", 1812 | "shasum": "" 1813 | }, 1814 | "require": { 1815 | "php": "^7.0" 1816 | }, 1817 | "require-dev": { 1818 | "phpunit/phpunit": "^6.0" 1819 | }, 1820 | "type": "library", 1821 | "extra": { 1822 | "branch-alias": { 1823 | "dev-master": "3.0.x-dev" 1824 | } 1825 | }, 1826 | "autoload": { 1827 | "classmap": [ 1828 | "src/" 1829 | ] 1830 | }, 1831 | "notification-url": "https://packagist.org/downloads/", 1832 | "license": [ 1833 | "BSD-3-Clause" 1834 | ], 1835 | "authors": [ 1836 | { 1837 | "name": "Jeff Welch", 1838 | "email": "whatthejeff@gmail.com" 1839 | }, 1840 | { 1841 | "name": "Sebastian Bergmann", 1842 | "email": "sebastian@phpunit.de" 1843 | }, 1844 | { 1845 | "name": "Adam Harvey", 1846 | "email": "aharvey@php.net" 1847 | } 1848 | ], 1849 | "description": "Provides functionality to recursively process PHP variables", 1850 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1851 | "time": "2019-02-11T12:48:28+00:00" 1852 | }, 1853 | { 1854 | "name": "sebastian/resource-operations", 1855 | "version": "1.0.0", 1856 | "source": { 1857 | "type": "git", 1858 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1859 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1860 | }, 1861 | "dist": { 1862 | "type": "zip", 1863 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1864 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1865 | "shasum": "" 1866 | }, 1867 | "require": { 1868 | "php": ">=5.6.0" 1869 | }, 1870 | "type": "library", 1871 | "extra": { 1872 | "branch-alias": { 1873 | "dev-master": "1.0.x-dev" 1874 | } 1875 | }, 1876 | "autoload": { 1877 | "classmap": [ 1878 | "src/" 1879 | ] 1880 | }, 1881 | "notification-url": "https://packagist.org/downloads/", 1882 | "license": [ 1883 | "BSD-3-Clause" 1884 | ], 1885 | "authors": [ 1886 | { 1887 | "name": "Sebastian Bergmann", 1888 | "email": "sebastian@phpunit.de" 1889 | } 1890 | ], 1891 | "description": "Provides a list of PHP built-in functions that operate on resources", 1892 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1893 | "time": "2015-07-28T20:34:47+00:00" 1894 | }, 1895 | { 1896 | "name": "sebastian/version", 1897 | "version": "2.0.1", 1898 | "source": { 1899 | "type": "git", 1900 | "url": "https://github.com/sebastianbergmann/version.git", 1901 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1902 | }, 1903 | "dist": { 1904 | "type": "zip", 1905 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1906 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1907 | "shasum": "" 1908 | }, 1909 | "require": { 1910 | "php": ">=5.6" 1911 | }, 1912 | "type": "library", 1913 | "extra": { 1914 | "branch-alias": { 1915 | "dev-master": "2.0.x-dev" 1916 | } 1917 | }, 1918 | "autoload": { 1919 | "classmap": [ 1920 | "src/" 1921 | ] 1922 | }, 1923 | "notification-url": "https://packagist.org/downloads/", 1924 | "license": [ 1925 | "BSD-3-Clause" 1926 | ], 1927 | "authors": [ 1928 | { 1929 | "name": "Sebastian Bergmann", 1930 | "email": "sebastian@phpunit.de", 1931 | "role": "lead" 1932 | } 1933 | ], 1934 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1935 | "homepage": "https://github.com/sebastianbergmann/version", 1936 | "time": "2016-10-03T07:35:21+00:00" 1937 | }, 1938 | { 1939 | "name": "symfony/console", 1940 | "version": "3.4.x-dev", 1941 | "source": { 1942 | "type": "git", 1943 | "url": "https://github.com/symfony/console.git", 1944 | "reference": "71ce77f37af0c5ffb9590e43cc4f70e426945c5e" 1945 | }, 1946 | "dist": { 1947 | "type": "zip", 1948 | "url": "https://api.github.com/repos/symfony/console/zipball/71ce77f37af0c5ffb9590e43cc4f70e426945c5e", 1949 | "reference": "71ce77f37af0c5ffb9590e43cc4f70e426945c5e", 1950 | "shasum": "" 1951 | }, 1952 | "require": { 1953 | "php": "^5.5.9|>=7.0.8", 1954 | "symfony/debug": "~2.8|~3.0|~4.0", 1955 | "symfony/polyfill-mbstring": "~1.0" 1956 | }, 1957 | "conflict": { 1958 | "symfony/dependency-injection": "<3.4", 1959 | "symfony/process": "<3.3" 1960 | }, 1961 | "provide": { 1962 | "psr/log-implementation": "1.0" 1963 | }, 1964 | "require-dev": { 1965 | "psr/log": "~1.0", 1966 | "symfony/config": "~3.3|~4.0", 1967 | "symfony/dependency-injection": "~3.4|~4.0", 1968 | "symfony/event-dispatcher": "~2.8|~3.0|~4.0", 1969 | "symfony/lock": "~3.4|~4.0", 1970 | "symfony/process": "~3.3|~4.0" 1971 | }, 1972 | "suggest": { 1973 | "psr/log": "For using the console logger", 1974 | "symfony/event-dispatcher": "", 1975 | "symfony/lock": "", 1976 | "symfony/process": "" 1977 | }, 1978 | "type": "library", 1979 | "extra": { 1980 | "branch-alias": { 1981 | "dev-master": "3.4-dev" 1982 | } 1983 | }, 1984 | "autoload": { 1985 | "psr-4": { 1986 | "Symfony\\Component\\Console\\": "" 1987 | }, 1988 | "exclude-from-classmap": [ 1989 | "/Tests/" 1990 | ] 1991 | }, 1992 | "notification-url": "https://packagist.org/downloads/", 1993 | "license": [ 1994 | "MIT" 1995 | ], 1996 | "authors": [ 1997 | { 1998 | "name": "Fabien Potencier", 1999 | "email": "fabien@symfony.com" 2000 | }, 2001 | { 2002 | "name": "Symfony Community", 2003 | "homepage": "https://symfony.com/contributors" 2004 | } 2005 | ], 2006 | "description": "Symfony Console Component", 2007 | "homepage": "https://symfony.com", 2008 | "time": "2019-02-23T15:06:07+00:00" 2009 | }, 2010 | { 2011 | "name": "symfony/debug", 2012 | "version": "3.4.x-dev", 2013 | "source": { 2014 | "type": "git", 2015 | "url": "https://github.com/symfony/debug.git", 2016 | "reference": "a5961253fa20c9770ee58ba2e4f7752e3a41b522" 2017 | }, 2018 | "dist": { 2019 | "type": "zip", 2020 | "url": "https://api.github.com/repos/symfony/debug/zipball/a5961253fa20c9770ee58ba2e4f7752e3a41b522", 2021 | "reference": "a5961253fa20c9770ee58ba2e4f7752e3a41b522", 2022 | "shasum": "" 2023 | }, 2024 | "require": { 2025 | "php": "^5.5.9|>=7.0.8", 2026 | "psr/log": "~1.0" 2027 | }, 2028 | "conflict": { 2029 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 2030 | }, 2031 | "require-dev": { 2032 | "symfony/http-kernel": "~2.8|~3.0|~4.0" 2033 | }, 2034 | "type": "library", 2035 | "extra": { 2036 | "branch-alias": { 2037 | "dev-master": "3.4-dev" 2038 | } 2039 | }, 2040 | "autoload": { 2041 | "psr-4": { 2042 | "Symfony\\Component\\Debug\\": "" 2043 | }, 2044 | "exclude-from-classmap": [ 2045 | "/Tests/" 2046 | ] 2047 | }, 2048 | "notification-url": "https://packagist.org/downloads/", 2049 | "license": [ 2050 | "MIT" 2051 | ], 2052 | "authors": [ 2053 | { 2054 | "name": "Fabien Potencier", 2055 | "email": "fabien@symfony.com" 2056 | }, 2057 | { 2058 | "name": "Symfony Community", 2059 | "homepage": "https://symfony.com/contributors" 2060 | } 2061 | ], 2062 | "description": "Symfony Debug Component", 2063 | "homepage": "https://symfony.com", 2064 | "time": "2019-03-06T14:53:23+00:00" 2065 | }, 2066 | { 2067 | "name": "symfony/event-dispatcher", 2068 | "version": "3.4.x-dev", 2069 | "source": { 2070 | "type": "git", 2071 | "url": "https://github.com/symfony/event-dispatcher.git", 2072 | "reference": "ec625e2fff7f584eeb91754821807317b2e79236" 2073 | }, 2074 | "dist": { 2075 | "type": "zip", 2076 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ec625e2fff7f584eeb91754821807317b2e79236", 2077 | "reference": "ec625e2fff7f584eeb91754821807317b2e79236", 2078 | "shasum": "" 2079 | }, 2080 | "require": { 2081 | "php": "^5.5.9|>=7.0.8" 2082 | }, 2083 | "conflict": { 2084 | "symfony/dependency-injection": "<3.3" 2085 | }, 2086 | "require-dev": { 2087 | "psr/log": "~1.0", 2088 | "symfony/config": "~2.8|~3.0|~4.0", 2089 | "symfony/dependency-injection": "~3.3|~4.0", 2090 | "symfony/expression-language": "~2.8|~3.0|~4.0", 2091 | "symfony/stopwatch": "~2.8|~3.0|~4.0" 2092 | }, 2093 | "suggest": { 2094 | "symfony/dependency-injection": "", 2095 | "symfony/http-kernel": "" 2096 | }, 2097 | "type": "library", 2098 | "extra": { 2099 | "branch-alias": { 2100 | "dev-master": "3.4-dev" 2101 | } 2102 | }, 2103 | "autoload": { 2104 | "psr-4": { 2105 | "Symfony\\Component\\EventDispatcher\\": "" 2106 | }, 2107 | "exclude-from-classmap": [ 2108 | "/Tests/" 2109 | ] 2110 | }, 2111 | "notification-url": "https://packagist.org/downloads/", 2112 | "license": [ 2113 | "MIT" 2114 | ], 2115 | "authors": [ 2116 | { 2117 | "name": "Fabien Potencier", 2118 | "email": "fabien@symfony.com" 2119 | }, 2120 | { 2121 | "name": "Symfony Community", 2122 | "homepage": "https://symfony.com/contributors" 2123 | } 2124 | ], 2125 | "description": "Symfony EventDispatcher Component", 2126 | "homepage": "https://symfony.com", 2127 | "time": "2019-02-23T15:06:07+00:00" 2128 | }, 2129 | { 2130 | "name": "symfony/filesystem", 2131 | "version": "3.4.x-dev", 2132 | "source": { 2133 | "type": "git", 2134 | "url": "https://github.com/symfony/filesystem.git", 2135 | "reference": "acf99758b1df8e9295e6b85aa69f294565c9fedb" 2136 | }, 2137 | "dist": { 2138 | "type": "zip", 2139 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/acf99758b1df8e9295e6b85aa69f294565c9fedb", 2140 | "reference": "acf99758b1df8e9295e6b85aa69f294565c9fedb", 2141 | "shasum": "" 2142 | }, 2143 | "require": { 2144 | "php": "^5.5.9|>=7.0.8", 2145 | "symfony/polyfill-ctype": "~1.8" 2146 | }, 2147 | "type": "library", 2148 | "extra": { 2149 | "branch-alias": { 2150 | "dev-master": "3.4-dev" 2151 | } 2152 | }, 2153 | "autoload": { 2154 | "psr-4": { 2155 | "Symfony\\Component\\Filesystem\\": "" 2156 | }, 2157 | "exclude-from-classmap": [ 2158 | "/Tests/" 2159 | ] 2160 | }, 2161 | "notification-url": "https://packagist.org/downloads/", 2162 | "license": [ 2163 | "MIT" 2164 | ], 2165 | "authors": [ 2166 | { 2167 | "name": "Fabien Potencier", 2168 | "email": "fabien@symfony.com" 2169 | }, 2170 | { 2171 | "name": "Symfony Community", 2172 | "homepage": "https://symfony.com/contributors" 2173 | } 2174 | ], 2175 | "description": "Symfony Filesystem Component", 2176 | "homepage": "https://symfony.com", 2177 | "time": "2019-02-04T21:34:32+00:00" 2178 | }, 2179 | { 2180 | "name": "symfony/finder", 2181 | "version": "3.4.x-dev", 2182 | "source": { 2183 | "type": "git", 2184 | "url": "https://github.com/symfony/finder.git", 2185 | "reference": "fcdde4aa38f48190ce70d782c166f23930084f9b" 2186 | }, 2187 | "dist": { 2188 | "type": "zip", 2189 | "url": "https://api.github.com/repos/symfony/finder/zipball/fcdde4aa38f48190ce70d782c166f23930084f9b", 2190 | "reference": "fcdde4aa38f48190ce70d782c166f23930084f9b", 2191 | "shasum": "" 2192 | }, 2193 | "require": { 2194 | "php": "^5.5.9|>=7.0.8" 2195 | }, 2196 | "type": "library", 2197 | "extra": { 2198 | "branch-alias": { 2199 | "dev-master": "3.4-dev" 2200 | } 2201 | }, 2202 | "autoload": { 2203 | "psr-4": { 2204 | "Symfony\\Component\\Finder\\": "" 2205 | }, 2206 | "exclude-from-classmap": [ 2207 | "/Tests/" 2208 | ] 2209 | }, 2210 | "notification-url": "https://packagist.org/downloads/", 2211 | "license": [ 2212 | "MIT" 2213 | ], 2214 | "authors": [ 2215 | { 2216 | "name": "Fabien Potencier", 2217 | "email": "fabien@symfony.com" 2218 | }, 2219 | { 2220 | "name": "Symfony Community", 2221 | "homepage": "https://symfony.com/contributors" 2222 | } 2223 | ], 2224 | "description": "Symfony Finder Component", 2225 | "homepage": "https://symfony.com", 2226 | "time": "2019-02-22T14:44:53+00:00" 2227 | }, 2228 | { 2229 | "name": "symfony/options-resolver", 2230 | "version": "3.4.x-dev", 2231 | "source": { 2232 | "type": "git", 2233 | "url": "https://github.com/symfony/options-resolver.git", 2234 | "reference": "926e3b797e6bb66c0e4d7da7eff3a174f7378bcf" 2235 | }, 2236 | "dist": { 2237 | "type": "zip", 2238 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/926e3b797e6bb66c0e4d7da7eff3a174f7378bcf", 2239 | "reference": "926e3b797e6bb66c0e4d7da7eff3a174f7378bcf", 2240 | "shasum": "" 2241 | }, 2242 | "require": { 2243 | "php": "^5.5.9|>=7.0.8" 2244 | }, 2245 | "type": "library", 2246 | "extra": { 2247 | "branch-alias": { 2248 | "dev-master": "3.4-dev" 2249 | } 2250 | }, 2251 | "autoload": { 2252 | "psr-4": { 2253 | "Symfony\\Component\\OptionsResolver\\": "" 2254 | }, 2255 | "exclude-from-classmap": [ 2256 | "/Tests/" 2257 | ] 2258 | }, 2259 | "notification-url": "https://packagist.org/downloads/", 2260 | "license": [ 2261 | "MIT" 2262 | ], 2263 | "authors": [ 2264 | { 2265 | "name": "Fabien Potencier", 2266 | "email": "fabien@symfony.com" 2267 | }, 2268 | { 2269 | "name": "Symfony Community", 2270 | "homepage": "https://symfony.com/contributors" 2271 | } 2272 | ], 2273 | "description": "Symfony OptionsResolver Component", 2274 | "homepage": "https://symfony.com", 2275 | "keywords": [ 2276 | "config", 2277 | "configuration", 2278 | "options" 2279 | ], 2280 | "time": "2019-02-23T15:06:07+00:00" 2281 | }, 2282 | { 2283 | "name": "symfony/polyfill-ctype", 2284 | "version": "dev-master", 2285 | "source": { 2286 | "type": "git", 2287 | "url": "https://github.com/symfony/polyfill-ctype.git", 2288 | "reference": "82ebae02209c21113908c229e9883c419720738a" 2289 | }, 2290 | "dist": { 2291 | "type": "zip", 2292 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", 2293 | "reference": "82ebae02209c21113908c229e9883c419720738a", 2294 | "shasum": "" 2295 | }, 2296 | "require": { 2297 | "php": ">=5.3.3" 2298 | }, 2299 | "suggest": { 2300 | "ext-ctype": "For best performance" 2301 | }, 2302 | "type": "library", 2303 | "extra": { 2304 | "branch-alias": { 2305 | "dev-master": "1.11-dev" 2306 | } 2307 | }, 2308 | "autoload": { 2309 | "psr-4": { 2310 | "Symfony\\Polyfill\\Ctype\\": "" 2311 | }, 2312 | "files": [ 2313 | "bootstrap.php" 2314 | ] 2315 | }, 2316 | "notification-url": "https://packagist.org/downloads/", 2317 | "license": [ 2318 | "MIT" 2319 | ], 2320 | "authors": [ 2321 | { 2322 | "name": "Symfony Community", 2323 | "homepage": "https://symfony.com/contributors" 2324 | }, 2325 | { 2326 | "name": "Gert de Pagter", 2327 | "email": "backendtea@gmail.com" 2328 | } 2329 | ], 2330 | "description": "Symfony polyfill for ctype functions", 2331 | "homepage": "https://symfony.com", 2332 | "keywords": [ 2333 | "compatibility", 2334 | "ctype", 2335 | "polyfill", 2336 | "portable" 2337 | ], 2338 | "time": "2019-02-06T07:57:58+00:00" 2339 | }, 2340 | { 2341 | "name": "symfony/polyfill-mbstring", 2342 | "version": "dev-master", 2343 | "source": { 2344 | "type": "git", 2345 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2346 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" 2347 | }, 2348 | "dist": { 2349 | "type": "zip", 2350 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", 2351 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", 2352 | "shasum": "" 2353 | }, 2354 | "require": { 2355 | "php": ">=5.3.3" 2356 | }, 2357 | "suggest": { 2358 | "ext-mbstring": "For best performance" 2359 | }, 2360 | "type": "library", 2361 | "extra": { 2362 | "branch-alias": { 2363 | "dev-master": "1.11-dev" 2364 | } 2365 | }, 2366 | "autoload": { 2367 | "psr-4": { 2368 | "Symfony\\Polyfill\\Mbstring\\": "" 2369 | }, 2370 | "files": [ 2371 | "bootstrap.php" 2372 | ] 2373 | }, 2374 | "notification-url": "https://packagist.org/downloads/", 2375 | "license": [ 2376 | "MIT" 2377 | ], 2378 | "authors": [ 2379 | { 2380 | "name": "Nicolas Grekas", 2381 | "email": "p@tchwork.com" 2382 | }, 2383 | { 2384 | "name": "Symfony Community", 2385 | "homepage": "https://symfony.com/contributors" 2386 | } 2387 | ], 2388 | "description": "Symfony polyfill for the Mbstring extension", 2389 | "homepage": "https://symfony.com", 2390 | "keywords": [ 2391 | "compatibility", 2392 | "mbstring", 2393 | "polyfill", 2394 | "portable", 2395 | "shim" 2396 | ], 2397 | "time": "2019-02-06T07:57:58+00:00" 2398 | }, 2399 | { 2400 | "name": "symfony/polyfill-php70", 2401 | "version": "dev-master", 2402 | "source": { 2403 | "type": "git", 2404 | "url": "https://github.com/symfony/polyfill-php70.git", 2405 | "reference": "bc4858fb611bda58719124ca079baff854149c89" 2406 | }, 2407 | "dist": { 2408 | "type": "zip", 2409 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89", 2410 | "reference": "bc4858fb611bda58719124ca079baff854149c89", 2411 | "shasum": "" 2412 | }, 2413 | "require": { 2414 | "paragonie/random_compat": "~1.0|~2.0|~9.99", 2415 | "php": ">=5.3.3" 2416 | }, 2417 | "type": "library", 2418 | "extra": { 2419 | "branch-alias": { 2420 | "dev-master": "1.11-dev" 2421 | } 2422 | }, 2423 | "autoload": { 2424 | "psr-4": { 2425 | "Symfony\\Polyfill\\Php70\\": "" 2426 | }, 2427 | "files": [ 2428 | "bootstrap.php" 2429 | ], 2430 | "classmap": [ 2431 | "Resources/stubs" 2432 | ] 2433 | }, 2434 | "notification-url": "https://packagist.org/downloads/", 2435 | "license": [ 2436 | "MIT" 2437 | ], 2438 | "authors": [ 2439 | { 2440 | "name": "Nicolas Grekas", 2441 | "email": "p@tchwork.com" 2442 | }, 2443 | { 2444 | "name": "Symfony Community", 2445 | "homepage": "https://symfony.com/contributors" 2446 | } 2447 | ], 2448 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 2449 | "homepage": "https://symfony.com", 2450 | "keywords": [ 2451 | "compatibility", 2452 | "polyfill", 2453 | "portable", 2454 | "shim" 2455 | ], 2456 | "time": "2019-02-06T07:57:58+00:00" 2457 | }, 2458 | { 2459 | "name": "symfony/polyfill-php72", 2460 | "version": "dev-master", 2461 | "source": { 2462 | "type": "git", 2463 | "url": "https://github.com/symfony/polyfill-php72.git", 2464 | "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" 2465 | }, 2466 | "dist": { 2467 | "type": "zip", 2468 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", 2469 | "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", 2470 | "shasum": "" 2471 | }, 2472 | "require": { 2473 | "php": ">=5.3.3" 2474 | }, 2475 | "type": "library", 2476 | "extra": { 2477 | "branch-alias": { 2478 | "dev-master": "1.11-dev" 2479 | } 2480 | }, 2481 | "autoload": { 2482 | "psr-4": { 2483 | "Symfony\\Polyfill\\Php72\\": "" 2484 | }, 2485 | "files": [ 2486 | "bootstrap.php" 2487 | ] 2488 | }, 2489 | "notification-url": "https://packagist.org/downloads/", 2490 | "license": [ 2491 | "MIT" 2492 | ], 2493 | "authors": [ 2494 | { 2495 | "name": "Nicolas Grekas", 2496 | "email": "p@tchwork.com" 2497 | }, 2498 | { 2499 | "name": "Symfony Community", 2500 | "homepage": "https://symfony.com/contributors" 2501 | } 2502 | ], 2503 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 2504 | "homepage": "https://symfony.com", 2505 | "keywords": [ 2506 | "compatibility", 2507 | "polyfill", 2508 | "portable", 2509 | "shim" 2510 | ], 2511 | "time": "2019-02-06T07:57:58+00:00" 2512 | }, 2513 | { 2514 | "name": "symfony/process", 2515 | "version": "3.4.x-dev", 2516 | "source": { 2517 | "type": "git", 2518 | "url": "https://github.com/symfony/process.git", 2519 | "reference": "009f8dda80930e89e8344a4e310b08f9ff07dd2e" 2520 | }, 2521 | "dist": { 2522 | "type": "zip", 2523 | "url": "https://api.github.com/repos/symfony/process/zipball/009f8dda80930e89e8344a4e310b08f9ff07dd2e", 2524 | "reference": "009f8dda80930e89e8344a4e310b08f9ff07dd2e", 2525 | "shasum": "" 2526 | }, 2527 | "require": { 2528 | "php": "^5.5.9|>=7.0.8" 2529 | }, 2530 | "type": "library", 2531 | "extra": { 2532 | "branch-alias": { 2533 | "dev-master": "3.4-dev" 2534 | } 2535 | }, 2536 | "autoload": { 2537 | "psr-4": { 2538 | "Symfony\\Component\\Process\\": "" 2539 | }, 2540 | "exclude-from-classmap": [ 2541 | "/Tests/" 2542 | ] 2543 | }, 2544 | "notification-url": "https://packagist.org/downloads/", 2545 | "license": [ 2546 | "MIT" 2547 | ], 2548 | "authors": [ 2549 | { 2550 | "name": "Fabien Potencier", 2551 | "email": "fabien@symfony.com" 2552 | }, 2553 | { 2554 | "name": "Symfony Community", 2555 | "homepage": "https://symfony.com/contributors" 2556 | } 2557 | ], 2558 | "description": "Symfony Process Component", 2559 | "homepage": "https://symfony.com", 2560 | "time": "2019-01-16T13:27:11+00:00" 2561 | }, 2562 | { 2563 | "name": "symfony/stopwatch", 2564 | "version": "3.4.x-dev", 2565 | "source": { 2566 | "type": "git", 2567 | "url": "https://github.com/symfony/stopwatch.git", 2568 | "reference": "2a651c2645c10bbedd21170771f122d935e0dd58" 2569 | }, 2570 | "dist": { 2571 | "type": "zip", 2572 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2a651c2645c10bbedd21170771f122d935e0dd58", 2573 | "reference": "2a651c2645c10bbedd21170771f122d935e0dd58", 2574 | "shasum": "" 2575 | }, 2576 | "require": { 2577 | "php": "^5.5.9|>=7.0.8" 2578 | }, 2579 | "type": "library", 2580 | "extra": { 2581 | "branch-alias": { 2582 | "dev-master": "3.4-dev" 2583 | } 2584 | }, 2585 | "autoload": { 2586 | "psr-4": { 2587 | "Symfony\\Component\\Stopwatch\\": "" 2588 | }, 2589 | "exclude-from-classmap": [ 2590 | "/Tests/" 2591 | ] 2592 | }, 2593 | "notification-url": "https://packagist.org/downloads/", 2594 | "license": [ 2595 | "MIT" 2596 | ], 2597 | "authors": [ 2598 | { 2599 | "name": "Fabien Potencier", 2600 | "email": "fabien@symfony.com" 2601 | }, 2602 | { 2603 | "name": "Symfony Community", 2604 | "homepage": "https://symfony.com/contributors" 2605 | } 2606 | ], 2607 | "description": "Symfony Stopwatch Component", 2608 | "homepage": "https://symfony.com", 2609 | "time": "2019-01-16T09:39:14+00:00" 2610 | }, 2611 | { 2612 | "name": "theseer/tokenizer", 2613 | "version": "1.1.0", 2614 | "source": { 2615 | "type": "git", 2616 | "url": "https://github.com/theseer/tokenizer.git", 2617 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 2618 | }, 2619 | "dist": { 2620 | "type": "zip", 2621 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 2622 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 2623 | "shasum": "" 2624 | }, 2625 | "require": { 2626 | "ext-dom": "*", 2627 | "ext-tokenizer": "*", 2628 | "ext-xmlwriter": "*", 2629 | "php": "^7.0" 2630 | }, 2631 | "type": "library", 2632 | "autoload": { 2633 | "classmap": [ 2634 | "src/" 2635 | ] 2636 | }, 2637 | "notification-url": "https://packagist.org/downloads/", 2638 | "license": [ 2639 | "BSD-3-Clause" 2640 | ], 2641 | "authors": [ 2642 | { 2643 | "name": "Arne Blankerts", 2644 | "email": "arne@blankerts.de", 2645 | "role": "Developer" 2646 | } 2647 | ], 2648 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2649 | "time": "2017-04-07T12:08:54+00:00" 2650 | }, 2651 | { 2652 | "name": "webmozart/assert", 2653 | "version": "1.4.0", 2654 | "source": { 2655 | "type": "git", 2656 | "url": "https://github.com/webmozart/assert.git", 2657 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" 2658 | }, 2659 | "dist": { 2660 | "type": "zip", 2661 | "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", 2662 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", 2663 | "shasum": "" 2664 | }, 2665 | "require": { 2666 | "php": "^5.3.3 || ^7.0", 2667 | "symfony/polyfill-ctype": "^1.8" 2668 | }, 2669 | "require-dev": { 2670 | "phpunit/phpunit": "^4.6", 2671 | "sebastian/version": "^1.0.1" 2672 | }, 2673 | "type": "library", 2674 | "extra": { 2675 | "branch-alias": { 2676 | "dev-master": "1.3-dev" 2677 | } 2678 | }, 2679 | "autoload": { 2680 | "psr-4": { 2681 | "Webmozart\\Assert\\": "src/" 2682 | } 2683 | }, 2684 | "notification-url": "https://packagist.org/downloads/", 2685 | "license": [ 2686 | "MIT" 2687 | ], 2688 | "authors": [ 2689 | { 2690 | "name": "Bernhard Schussek", 2691 | "email": "bschussek@gmail.com" 2692 | } 2693 | ], 2694 | "description": "Assertions to validate method input/output with nice error messages.", 2695 | "keywords": [ 2696 | "assert", 2697 | "check", 2698 | "validate" 2699 | ], 2700 | "time": "2018-12-25T11:19:39+00:00" 2701 | } 2702 | ], 2703 | "aliases": [], 2704 | "minimum-stability": "dev", 2705 | "stability-flags": [], 2706 | "prefer-stable": false, 2707 | "prefer-lowest": false, 2708 | "platform": { 2709 | "php": ">=7.0" 2710 | }, 2711 | "platform-dev": [] 2712 | } 2713 | -------------------------------------------------------------------------------- /demo.php: -------------------------------------------------------------------------------- 1 | create(ParserFactory::PREFER_PHP7); 7 | 8 | try { 9 | $ast = $parser->parse(file_get_contents(__FILE__)); 10 | } catch (Error $error) { 11 | echo "Parse error: {$error->getMessage()}\n"; 12 | return; 13 | } 14 | 15 | $printer = new PHPAstVisualizer\Printer; 16 | 17 | $graph = $printer->print($ast); 18 | 19 | echo (string) $graph; 20 | $graph->export('png', 'demo.png'); 21 | 22 | function foo(string $a, int $b): void { 23 | echo $a; 24 | echo $b; 25 | echo 3; 26 | } -------------------------------------------------------------------------------- /demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ircmaxell/php-ast-visualizer/5d6cb0ee54a12d23a04a2a2aa60d84f47c8bb61b/demo.png -------------------------------------------------------------------------------- /lib/Graph.php: -------------------------------------------------------------------------------- 1 | setName($name) 16 | ->setType($directional ? 'digraph' : 'graph'); 17 | return $graph; 18 | } 19 | 20 | public function addRanking(string $type, array $nodes) { 21 | $rank = '{ rank=' . $type; 22 | foreach ($nodes as $node) { 23 | $rank .= ' ' . $node->getName(); 24 | } 25 | $rank .= ' }'; 26 | $this->rankings[] = $rank; 27 | } 28 | 29 | public function __toString(): string 30 | { 31 | $elements = array_merge( 32 | $this->graphs, 33 | $this->attributes, 34 | $this->edges, 35 | $this->nodes, 36 | $this->rankings 37 | ); 38 | $attributes = []; 39 | foreach ($elements as $value) { 40 | $attributes[] = (string) $value; 41 | } 42 | $attributes = implode(PHP_EOL, $attributes); 43 | $strict = ($this->isStrict() ? 'strict ' : ''); 44 | return <<getType()} "{$this->getName()}" { 46 | ${attributes} 47 | } 48 | DOT; 49 | } 50 | } -------------------------------------------------------------------------------- /lib/Options.php: -------------------------------------------------------------------------------- 1 | [], 12 | 'node' => ['shape' => 'rect'], 13 | 'edge' => [], 14 | 'childEdge' => ['style' => 'dashed','arrowhead' => 'empty'], 15 | ]; 16 | private $name; 17 | 18 | 19 | public function __construct(string $name, array $options = []) { 20 | $this->name = $name; 21 | $this->graphOptions = array_merge($this->options, $options); 22 | } 23 | 24 | public function getName(): string { 25 | return $this->name; 26 | } 27 | 28 | public function graph(Graph $graph) { 29 | foreach ($this->options['graph'] as $name => $value) { 30 | $graph->{'set' . $name}($value); 31 | } 32 | } 33 | 34 | public function node(GraphNode $node) { 35 | foreach ($this->options['node'] as $name => $value) { 36 | $node->{'set' . $name}($value); 37 | } 38 | } 39 | 40 | public function childEdge(GraphEdge $edge) { 41 | $this->edge($edge); 42 | foreach ($this->options['childEdge'] as $name => $value) { 43 | $edge->{'set' . $name}($value); 44 | } 45 | } 46 | 47 | public function edge(GraphEdge $edge) { 48 | foreach ($this->options['edge'] as $name => $value) { 49 | $edge->{'set' . $name}($value); 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /lib/Printer.php: -------------------------------------------------------------------------------- 1 | nodeMap = new \SplObjectStorage; 17 | } 18 | 19 | public function print(array $ast, Options $options = null): Graph { 20 | $this->options = $options ?? new Options('ast'); 21 | $this->graph = Graph::create($this->options->getName()); 22 | $start = new GraphNode('start', 'start'); 23 | $this->options->node($start); 24 | $this->graph->setNode($start); 25 | $this->parseArray($start, $ast, ''); 26 | return $this->graph; 27 | } 28 | 29 | public function printNode(Node $node, Options $options = null): Graph { 30 | $this->options = $options ?? new Options('ast'); 31 | $this->graph = Graph::create($this->options->getName()); 32 | $this->parseNode($node); 33 | return $graph; 34 | } 35 | 36 | private function parseArray(GraphNode $parent, array $nodes, string $name, int $minlen = 1) { 37 | $sameRank = []; 38 | foreach ($nodes as $node) { 39 | if (!$node instanceof Node) { 40 | continue; 41 | } 42 | $child = $this->parseNode($node); 43 | $sameRank[] = $child; 44 | $this->createEdge($parent, $child, $name, $minlen); 45 | $parent = $child; 46 | $name = 'next'; 47 | } 48 | if (count($sameRank) > 1) { 49 | $this->graph->addRanking('same', $sameRank); 50 | } 51 | } 52 | 53 | private function parseNode(Node $node): GraphNode { 54 | if (!isset($this->nodeMap[$node])) { 55 | $this->nodeMap[$node] = new GraphNode( 56 | 'node_' . count($this->nodeMap), 57 | $this->exportNode($node) 58 | ); 59 | $this->options->node($this->nodeMap[$node]); 60 | $this->graph->setNode($this->nodeMap[$node]); 61 | $names = $node->getSubNodeNames(); 62 | foreach ($names as $name) { 63 | $subNode = $node->$name; 64 | if (is_object($subNode) && $subNode instanceof Node) { 65 | $this->createEdge($this->nodeMap[$node], $this->parseNode($subNode), $name); 66 | } elseif (is_array($subNode)) { 67 | $this->parseArray($this->nodeMap[$node], $subNode, $name, count($names) === 1 ? 1 : 2); 68 | } 69 | } 70 | } 71 | return $this->nodeMap[$node]; 72 | } 73 | 74 | private function createEdge(GraphNode $from, GraphNode $to, string $label, int $minlen = 1) { 75 | $edge = new GraphEdge($from, $to); 76 | $this->options->edge($edge); 77 | $edge->setlabel($label); 78 | $edge->setminlen($minlen); 79 | $this->graph->link($edge); 80 | } 81 | 82 | protected function exportNode(Node $node): string { 83 | if ($node instanceof Node\Scalar\EncapsedStringPart) { 84 | return $this->printNodeValue($node, '"' . $node->value . '"'); 85 | } elseif ($node instanceof Node\Scalar\String_) { 86 | return $this->printNodeValue($node, '"' . $node->value . '"'); 87 | } 88 | $result = []; 89 | foreach ($node->getSubNodeNames() as $name) { 90 | if (is_bool($node->$name)) { 91 | $result[] = "{$name}: " . ($node->$name ? 'true' : 'false'); 92 | } elseif (is_scalar($node->$name)) { 93 | $result[] = "{$name}: {$node->$name}"; 94 | } elseif($node instanceof Name) { 95 | $fullName = implode('\\', $node->parts); 96 | $result[] = "name: $fullName"; 97 | } 98 | } 99 | return $this->printNodeValue($node, ...$result); 100 | } 101 | 102 | private function printNodeValue(Node $node, string ... $parts): string { 103 | return $node->getType() . '\\l' . implode('\\l', $parts); 104 | } 105 | 106 | } 107 | --------------------------------------------------------------------------------