├── .gitignore ├── tests ├── bootstrap.php ├── IpUtilsTest.php └── RewriteTest.php ├── phpunit.xml.dist ├── .github └── workflows │ └── semgrep.yml ├── composer.json ├── readme.md ├── src └── CloudFlare │ ├── IpRewrite.php │ └── IpUtils.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/* 2 | coverage/* 3 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ./tests/ 7 | 8 | 9 | 10 | 11 | 12 | ./src 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/workflows/semgrep.yml: -------------------------------------------------------------------------------- 1 | on: 2 | pull_request: {} 3 | workflow_dispatch: {} 4 | push: 5 | branches: 6 | - main 7 | - master 8 | schedule: 9 | - cron: '0 0 * * *' 10 | name: Semgrep config 11 | jobs: 12 | semgrep: 13 | name: semgrep/ci 14 | runs-on: ubuntu-latest 15 | env: 16 | SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} 17 | SEMGREP_URL: https://cloudflare.semgrep.dev 18 | SEMGREP_APP_URL: https://cloudflare.semgrep.dev 19 | SEMGREP_VERSION_CHECK_URL: https://cloudflare.semgrep.dev/api/check-version 20 | container: 21 | image: semgrep/semgrep 22 | steps: 23 | - uses: actions/checkout@v4 24 | - run: semgrep ci 25 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudflare/cf-ip-rewrite", 3 | "description": "Library to rewrite CloudFlare IP Addresses to the end-user IP address", 4 | "version": "1.0.4", 5 | "homepage": "https://github.com/cloudflare/cf-ip-rewrite", 6 | "keywords": [ 7 | "ip rewrite", 8 | "cloudflare" 9 | ], 10 | "authors": [ 11 | { 12 | "name": "CloudFlare", 13 | "homepage": "http://www.cloudflare.com/" 14 | } 15 | ], 16 | "license": "MIT", 17 | "type": "library", 18 | "scripts": { 19 | "test": "vendor/bin/phpunit -c phpunit.xml.dist", 20 | "format": "vendor/bin/phpcs -n --standard=PSR2 --extensions=php,live.php src/" 21 | }, 22 | "require": { 23 | "php": ">=5.3.0" 24 | }, 25 | "autoload": { 26 | "psr-0": { 27 | "CloudFlare\\": "src/" 28 | } 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": "^4.8", 32 | "squizlabs/php_codesniffer": "2.*" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tests/IpUtilsTest.php: -------------------------------------------------------------------------------- 1 | assertTrue(IpUtils::checkIp($addr, '192.168.1.1')); 12 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.1/1')); 13 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.0/24')); 14 | $this->assertFalse(IpUtils::checkIp($addr, '1.2.3.4/1')); 15 | $this->assertFalse(IpUtils::checkIp($addr, '192.168.1.1/33')); // invalid subnet 16 | $this->assertTrue(IpUtils::checkIp($addr, array('1.2.3.4/1', '192.168.1.0/24'))); 17 | $this->assertTrue(IpUtils::checkIp($addr, array('192.168.1.0/24', '1.2.3.4/1'))); 18 | $this->assertFalse(IpUtils::checkIp($addr, array('1.2.3.4/1', '4.3.2.1/1'))); 19 | $this->assertTrue(IpUtils::checkIp($addr, '0.0.0.0/0')); 20 | $this->assertTrue(IpUtils::checkIp($addr, '192.168.1.0/0')); 21 | $this->assertFalse(IpUtils::checkIp($addr, '256.256.256/0')); // invalid CIDR notation 22 | } 23 | 24 | public function testIpv6() 25 | { 26 | if (!defined('AF_INET6')) { 27 | $this->markTestSkipped('Only works when PHP is compiled without the option "disable-ipv6".'); 28 | } 29 | 30 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65')); 31 | $this->assertFalse(IpUtils::checkIp('2a00:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65')); 32 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '::1')); 33 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('::1', '2a01:198:603:0::/65'))); 34 | $this->assertTrue(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('2a01:198:603:0::/65', '::1'))); 35 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', array('::1', '1a01:198:603:0::/65'))); 36 | $this->assertFalse(IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', 'unknown')); 37 | $this->assertTrue(IpUtils::checkIp('0:0:0:0:0:0:0:1', '::1')); 38 | $this->assertFalse(IpUtils::checkIp('0:0:603:0:396e:4789:8e99:0001', '::1')); 39 | $this->assertFalse(IpUtils::checkIp('}__test|O:21:"JDatabaseDriverMysqli":3:{s:2', '::1')); 40 | IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Cloudflare PHP IP Rewriting 2 | 3 | This module makes it easy for developers to add rewrite Cloudflare IP Addresses for actual end-user IP Addresses at the application layer. It is recommended to either install mod_cloudflare for Apache or use nginx rewrite rules () if possible. 4 | 5 | For those cases, where the IP can not be guaranteed to be rewritten by one of these alternate means, this module can be used to rewrite the IP address. 6 | 7 | ### How it works 8 | ```php 9 | $ipRewrite = new CloudFlare\IpRewrite(); 10 | $is_cf = $ipRewrite->isCloudFlare(); 11 | $rewritten_ip = $ipRewrite->getRewrittenIP(); 12 | $original_ip = $ipRewrite->getOriginalIP(); 13 | ``` 14 | The class exposes three methods for interaction and a constructor. 15 | 16 | Initializing `IpRewrite()` object will try to rewrite the IP. If the IP is rewritten, `$_SERVER["REMOTE_ADDR"]` will be updated to reflect the end-user's IP address. 17 | 18 | `isCloudFlare();` returns `true` if the `CF_CONNECTING_IP` header is present in the request and the request originates from a Cloudflare IP. 19 | 20 | `getRewrittenIP()` Returns the rewritten ip address if a rewrite occurs, otherwise it will return `null`. 21 | 22 | `getOriginalIP()` returns the saved original ip address from `$_SERVER["REMOTE_ADDR"]`. 23 | 24 | ### Best Pratice 25 | 26 | ```php 27 | // Initialize object to rewrite the headers 28 | try { 29 | $ipRewrite = new CloudFlare\IpRewrite(); 30 | } catch (RuntimeException $e) { 31 | // PHP configurations does not support IPv6 32 | } 33 | 34 | // Check if the request is from Cloudflare 35 | $is_cf = $ipRewrite->isCloudFlare(); 36 | if ($is_cf) { 37 | // Get original or rewritten ip 38 | // Order does not matter 39 | ... 40 | $rewritten_ip = $ipRewrite->getRewrittenIP(); 41 | ... 42 | $original_ip = $ipRewrite->getOriginalIP(); 43 | ... 44 | } 45 | ``` 46 | 47 | #### Caution 48 | 49 | Rewrite action is triggered only once in constructor. If `getRewrittenIP()` or `getOriginalIP()` is called multiple times it'll return the first result regardless if a change happened after the first call. Since rewrite action was not triggered. 50 | 51 | To get the newest changes a new `IpRewrite` object should be used. 52 | 53 | ### Testing this module 54 | 55 | This module comes with a set of tests that can be run using phpunit. To run the tests, run `composer install` on the package and then one of the following commands: 56 | 57 | #### Basic Tests 58 | 59 | composer test 60 | 61 | #### With code coverage report in `coverage` folder 62 | 63 | vendor/bin/phpunit -c phpunit.xml.dist --coverage-html coverage 64 | -------------------------------------------------------------------------------- /src/CloudFlare/IpRewrite.php: -------------------------------------------------------------------------------- 1 | rewrite(); 42 | } 43 | 44 | /** 45 | * Is a request from CloudFlare? 46 | * @return bool 47 | */ 48 | public function isCloudFlare() 49 | { 50 | if (!isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { 51 | return false; 52 | } else { 53 | // Check if original ip has already been restored, e.g. by nginx - assume it was from cloudflare then 54 | if ($_SERVER['REMOTE_ADDR'] === $_SERVER['HTTP_CF_CONNECTING_IP']) { 55 | return true; 56 | } 57 | } 58 | 59 | return $this->isCloudFlareIP(); 60 | } 61 | 62 | /** 63 | * Check if a request comes from a CloudFlare IP. 64 | * @return bool 65 | */ 66 | public function isCloudFlareIP() 67 | { 68 | // Store original remote address in $original_ip 69 | $this->original_ip = $this->getOriginalIP(); 70 | if (!isset($this->original_ip)) { 71 | return false; 72 | } 73 | 74 | // Process original_ip if on cloudflare 75 | $ip_ranges = $this->cf_ipv4; 76 | if (IpUtils::isIpv6($this->original_ip)) { 77 | $ip_ranges = $this->cf_ipv6; 78 | } 79 | 80 | foreach ($ip_ranges as $range) { 81 | if (IpUtils::checkIp($this->original_ip, $range)) { 82 | return true; 83 | } 84 | } 85 | 86 | return false; 87 | } 88 | 89 | /** 90 | * Get the original IP Address of a given request. 91 | * @return IP Address or null on error 92 | */ 93 | public function getOriginalIP() 94 | { 95 | // If $original_ip is not set, return the REMOTE_ADDR 96 | if (!isset($this->original_ip)) { 97 | $this->original_ip = $_SERVER['REMOTE_ADDR']; 98 | } 99 | 100 | return $this->original_ip; 101 | } 102 | 103 | /** 104 | * Gets the re-written IP after rewrite() is run. 105 | * @return IP Address or null on error 106 | */ 107 | public function getRewrittenIP() 108 | { 109 | return $this->rewritten_ip; 110 | } 111 | 112 | /** 113 | * Handle the rewriting of CloudFlare IP Addresses to end-user IP Addresses. 114 | * NOTE: This function will ultimately rewrite $_SERVER["REMOTE_ADDR"] if the site is on CloudFlare 115 | * @return bool 116 | * @ 117 | */ 118 | public function rewrite() 119 | { 120 | // only should be run once per page load 121 | if ($this->is_loaded) { 122 | return false; 123 | } 124 | $this->is_loaded = true; 125 | 126 | $is_cf = $this->isCloudFlare(); 127 | if (!$is_cf) { 128 | return false; 129 | } 130 | 131 | $this->rewritten_ip = $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP']; 132 | return true; 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/CloudFlare/IpUtils.php: -------------------------------------------------------------------------------- 1 | 1) { 48 | return false; 49 | } 50 | 51 | return true; 52 | } 53 | 54 | /** 55 | * Checks if the ip is v6. 56 | * 57 | * @param string $ip IP to check 58 | * 59 | * @return bool return true if ipv6 60 | */ 61 | public static function isIpv6($ip) 62 | { 63 | return !self::isIpv4($ip); 64 | } 65 | 66 | /** 67 | * Compares two IPv4 addresses. 68 | * In case a subnet is given, it checks if it contains the request IP. 69 | * 70 | * @param string $requestIp IPv4 address to check 71 | * @param string $ip IPv4 address or subnet in CIDR notation 72 | * 73 | * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet. 74 | */ 75 | public static function checkIp4($requestIp, $ip) 76 | { 77 | if (false !== strpos($ip, '/')) { 78 | list($address, $netmask) = explode('/', $ip, 2); 79 | 80 | if ($netmask === '0') { 81 | // Ensure IP is valid - using ip2long below implicitly validates, but we need to do it manually here 82 | return filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); 83 | } 84 | 85 | if ($netmask < 0 || $netmask > 32) { 86 | return false; 87 | } 88 | } else { 89 | $address = $ip; 90 | $netmask = 32; 91 | } 92 | 93 | return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask); 94 | } 95 | 96 | /** 97 | * Compares two IPv6 addresses. 98 | * In case a subnet is given, it checks if it contains the request IP. 99 | * 100 | * @author David Soria Parra 101 | * 102 | * @see https://github.com/dsp/v6tools 103 | * 104 | * @param string $requestIp IPv6 address to check 105 | * @param string $ip IPv6 address or subnet in CIDR notation 106 | * 107 | * @return bool Whether the IP is valid 108 | * 109 | * @throws \RuntimeException When IPV6 support is not enabled 110 | */ 111 | public static function checkIp6($requestIp, $ip) 112 | { 113 | if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) { 114 | throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".'); 115 | } 116 | 117 | if (false !== strpos($ip, '/')) { 118 | list($address, $netmask) = explode('/', $ip, 2); 119 | 120 | if ($netmask < 1 || $netmask > 128) { 121 | return false; 122 | } 123 | } else { 124 | $address = $ip; 125 | $netmask = 128; 126 | } 127 | 128 | $bytesAddr = unpack('n*', @inet_pton($address)); 129 | $bytesTest = unpack('n*', @inet_pton($requestIp)); 130 | 131 | if (!$bytesAddr || !$bytesTest) { 132 | return false; 133 | } 134 | 135 | for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) { 136 | $left = $netmask - 16 * ($i - 1); 137 | $left = ($left <= 16) ? $left : 16; 138 | $mask = ~(0xffff >> $left) & 0xffff; 139 | if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) { 140 | return false; 141 | } 142 | } 143 | 144 | return true; 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /tests/RewriteTest.php: -------------------------------------------------------------------------------- 1 | ipRewrite = new IpRewrite(); 24 | 25 | $this->assertTrue($this->ipRewrite->isCloudFlare()); 26 | $this->assertTrue($this->ipRewrite->isCloudFlareIP()); 27 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip); 28 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 29 | } 30 | 31 | 32 | public function testRequestFromCloudFlareNoConnectingIPHeader() 33 | { 34 | $remote_addr = '103.21.244.2'; 35 | 36 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 37 | 38 | $this->ipRewrite = new IpRewrite(); 39 | 40 | $this->assertFalse($this->ipRewrite->isCloudFlare()); 41 | $this->assertTrue($this->ipRewrite->isCloudFlareIP()); 42 | $this->assertNull($this->ipRewrite->getRewrittenIP()); 43 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 44 | } 45 | 46 | public function testOffCloudFlareIPv4() 47 | { 48 | $remote_addr = '8.8.8.8'; 49 | 50 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 51 | 52 | $this->ipRewrite = new IpRewrite(); 53 | 54 | $this->assertFalse($this->ipRewrite->isCloudFlare()); 55 | $this->assertFalse($this->ipRewrite->isCloudFlareIP()); 56 | $this->assertNull($this->ipRewrite->getRewrittenIP()); 57 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 58 | } 59 | 60 | public function testOffCloudFlareIPv4FakeModCloudflare() 61 | { 62 | $remote_addr = '8.8.8.8'; 63 | $connecting_ip = '8.8.4.4'; 64 | 65 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 66 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip; 67 | 68 | $this->ipRewrite = new IpRewrite(); 69 | 70 | $this->assertFalse($this->ipRewrite->isCloudFlare()); 71 | $this->assertFalse($this->ipRewrite->isCloudFlareIP()); 72 | $this->assertNull($this->ipRewrite->getRewrittenIP()); 73 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 74 | } 75 | 76 | public function testOnlyProcessOnce() 77 | { 78 | $remote_addr = '108.162.192.2'; 79 | $connecting_ip = '8.8.8.8'; 80 | 81 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 82 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip; 83 | 84 | $this->ipRewrite = new IpRewrite(); 85 | 86 | $this->assertTrue($this->ipRewrite->isCloudFlare()); 87 | $this->assertTrue($this->ipRewrite->isCloudFlareIP()); 88 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip); 89 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 90 | 91 | // swap values and expect the original still, since it only allows one run per load 92 | $remote_addr2 = '103.21.244.2'; 93 | $connecting_ip2 = '8.8.4.4'; 94 | 95 | $_SERVER['REMOTE_ADDR'] = $remote_addr2; 96 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip2; 97 | 98 | $this->assertTrue($this->ipRewrite->isCloudFlare()); 99 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip); 100 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 101 | } 102 | 103 | public function testOnCloudFlareIPv6() 104 | { 105 | $remote_addr = '2803:f800::23'; 106 | $connecting_ip = '2001:4860:4860::8888'; 107 | 108 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 109 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip; 110 | 111 | $this->ipRewrite = new IpRewrite(); 112 | 113 | $this->assertTrue($this->ipRewrite->isCloudFlare()); 114 | $this->assertTrue($this->ipRewrite->isCloudFlareIP()); 115 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip); 116 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 117 | } 118 | 119 | public function testOffCloudFlareIPv6() 120 | { 121 | $remote_addr = '2001:4860:4860::8888'; 122 | 123 | $_SERVER['REMOTE_ADDR'] = $remote_addr; 124 | 125 | $this->ipRewrite = new IpRewrite(); 126 | 127 | $this->assertFalse($this->ipRewrite->isCloudFlare()); 128 | $this->assertFalse($this->ipRewrite->isCloudFlare()); 129 | $this->assertNull($this->ipRewrite->getRewrittenIP()); 130 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $remote_addr); 131 | } 132 | 133 | public function testRequestFromCloudflareNginxRealIp() 134 | { 135 | $connecting_ip = '8.8.8.8'; 136 | 137 | // REMOTE_ADDR already rewritten by Nginx 138 | $_SERVER['REMOTE_ADDR'] = $connecting_ip; 139 | $_SERVER['HTTP_CF_CONNECTING_IP'] = $connecting_ip; 140 | 141 | $this->ipRewrite = new IpRewrite(); 142 | 143 | $this->assertTrue($this->ipRewrite->isCloudFlare()); 144 | $this->assertEquals($this->ipRewrite->getRewrittenIP(), $connecting_ip); 145 | $this->assertEquals($this->ipRewrite->getOriginalIP(), $connecting_ip); 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /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": "e9a6fb32abac8d89674cef520b820139", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "1.0.5", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 21 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.3,<8.0-DEV" 26 | }, 27 | "require-dev": { 28 | "athletic/athletic": "~0.1.8", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpunit/phpunit": "~4.0", 32 | "squizlabs/php_codesniffer": "~2.0" 33 | }, 34 | "type": "library", 35 | "extra": { 36 | "branch-alias": { 37 | "dev-master": "1.0.x-dev" 38 | } 39 | }, 40 | "autoload": { 41 | "psr-4": { 42 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 43 | } 44 | }, 45 | "notification-url": "https://packagist.org/downloads/", 46 | "license": [ 47 | "MIT" 48 | ], 49 | "authors": [ 50 | { 51 | "name": "Marco Pivetta", 52 | "email": "ocramius@gmail.com", 53 | "homepage": "http://ocramius.github.com/" 54 | } 55 | ], 56 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 57 | "homepage": "https://github.com/doctrine/instantiator", 58 | "keywords": [ 59 | "constructor", 60 | "instantiate" 61 | ], 62 | "time": "2015-06-14T21:17:01+00:00" 63 | }, 64 | { 65 | "name": "phpdocumentor/reflection-common", 66 | "version": "1.0.1", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 70 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 75 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "php": ">=5.5" 80 | }, 81 | "require-dev": { 82 | "phpunit/phpunit": "^4.6" 83 | }, 84 | "type": "library", 85 | "extra": { 86 | "branch-alias": { 87 | "dev-master": "1.0.x-dev" 88 | } 89 | }, 90 | "autoload": { 91 | "psr-4": { 92 | "phpDocumentor\\Reflection\\": [ 93 | "src" 94 | ] 95 | } 96 | }, 97 | "notification-url": "https://packagist.org/downloads/", 98 | "license": [ 99 | "MIT" 100 | ], 101 | "authors": [ 102 | { 103 | "name": "Jaap van Otterdijk", 104 | "email": "opensource@ijaap.nl" 105 | } 106 | ], 107 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 108 | "homepage": "http://www.phpdoc.org", 109 | "keywords": [ 110 | "FQSEN", 111 | "phpDocumentor", 112 | "phpdoc", 113 | "reflection", 114 | "static analysis" 115 | ], 116 | "time": "2017-09-11T18:02:19+00:00" 117 | }, 118 | { 119 | "name": "phpdocumentor/reflection-docblock", 120 | "version": "4.1.1", 121 | "source": { 122 | "type": "git", 123 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 124 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2" 125 | }, 126 | "dist": { 127 | "type": "zip", 128 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2", 129 | "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2", 130 | "shasum": "" 131 | }, 132 | "require": { 133 | "php": "^7.0", 134 | "phpdocumentor/reflection-common": "^1.0@dev", 135 | "phpdocumentor/type-resolver": "^0.4.0", 136 | "webmozart/assert": "^1.0" 137 | }, 138 | "require-dev": { 139 | "mockery/mockery": "^0.9.4", 140 | "phpunit/phpunit": "^4.4" 141 | }, 142 | "type": "library", 143 | "autoload": { 144 | "psr-4": { 145 | "phpDocumentor\\Reflection\\": [ 146 | "src/" 147 | ] 148 | } 149 | }, 150 | "notification-url": "https://packagist.org/downloads/", 151 | "license": [ 152 | "MIT" 153 | ], 154 | "authors": [ 155 | { 156 | "name": "Mike van Riel", 157 | "email": "me@mikevanriel.com" 158 | } 159 | ], 160 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 161 | "time": "2017-08-30T18:51:59+00:00" 162 | }, 163 | { 164 | "name": "phpdocumentor/type-resolver", 165 | "version": "0.4.0", 166 | "source": { 167 | "type": "git", 168 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 169 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 170 | }, 171 | "dist": { 172 | "type": "zip", 173 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 174 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 175 | "shasum": "" 176 | }, 177 | "require": { 178 | "php": "^5.5 || ^7.0", 179 | "phpdocumentor/reflection-common": "^1.0" 180 | }, 181 | "require-dev": { 182 | "mockery/mockery": "^0.9.4", 183 | "phpunit/phpunit": "^5.2||^4.8.24" 184 | }, 185 | "type": "library", 186 | "extra": { 187 | "branch-alias": { 188 | "dev-master": "1.0.x-dev" 189 | } 190 | }, 191 | "autoload": { 192 | "psr-4": { 193 | "phpDocumentor\\Reflection\\": [ 194 | "src/" 195 | ] 196 | } 197 | }, 198 | "notification-url": "https://packagist.org/downloads/", 199 | "license": [ 200 | "MIT" 201 | ], 202 | "authors": [ 203 | { 204 | "name": "Mike van Riel", 205 | "email": "me@mikevanriel.com" 206 | } 207 | ], 208 | "time": "2017-07-14T14:27:02+00:00" 209 | }, 210 | { 211 | "name": "phpspec/prophecy", 212 | "version": "v1.7.2", 213 | "source": { 214 | "type": "git", 215 | "url": "https://github.com/phpspec/prophecy.git", 216 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" 217 | }, 218 | "dist": { 219 | "type": "zip", 220 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", 221 | "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", 222 | "shasum": "" 223 | }, 224 | "require": { 225 | "doctrine/instantiator": "^1.0.2", 226 | "php": "^5.3|^7.0", 227 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 228 | "sebastian/comparator": "^1.1|^2.0", 229 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 230 | }, 231 | "require-dev": { 232 | "phpspec/phpspec": "^2.5|^3.2", 233 | "phpunit/phpunit": "^4.8 || ^5.6.5" 234 | }, 235 | "type": "library", 236 | "extra": { 237 | "branch-alias": { 238 | "dev-master": "1.7.x-dev" 239 | } 240 | }, 241 | "autoload": { 242 | "psr-0": { 243 | "Prophecy\\": "src/" 244 | } 245 | }, 246 | "notification-url": "https://packagist.org/downloads/", 247 | "license": [ 248 | "MIT" 249 | ], 250 | "authors": [ 251 | { 252 | "name": "Konstantin Kudryashov", 253 | "email": "ever.zet@gmail.com", 254 | "homepage": "http://everzet.com" 255 | }, 256 | { 257 | "name": "Marcello Duarte", 258 | "email": "marcello.duarte@gmail.com" 259 | } 260 | ], 261 | "description": "Highly opinionated mocking framework for PHP 5.3+", 262 | "homepage": "https://github.com/phpspec/prophecy", 263 | "keywords": [ 264 | "Double", 265 | "Dummy", 266 | "fake", 267 | "mock", 268 | "spy", 269 | "stub" 270 | ], 271 | "time": "2017-09-04T11:05:03+00:00" 272 | }, 273 | { 274 | "name": "phpunit/php-code-coverage", 275 | "version": "2.2.4", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 279 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", 284 | "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": ">=5.3.3", 289 | "phpunit/php-file-iterator": "~1.3", 290 | "phpunit/php-text-template": "~1.2", 291 | "phpunit/php-token-stream": "~1.3", 292 | "sebastian/environment": "^1.3.2", 293 | "sebastian/version": "~1.0" 294 | }, 295 | "require-dev": { 296 | "ext-xdebug": ">=2.1.4", 297 | "phpunit/phpunit": "~4" 298 | }, 299 | "suggest": { 300 | "ext-dom": "*", 301 | "ext-xdebug": ">=2.2.1", 302 | "ext-xmlwriter": "*" 303 | }, 304 | "type": "library", 305 | "extra": { 306 | "branch-alias": { 307 | "dev-master": "2.2.x-dev" 308 | } 309 | }, 310 | "autoload": { 311 | "classmap": [ 312 | "src/" 313 | ] 314 | }, 315 | "notification-url": "https://packagist.org/downloads/", 316 | "license": [ 317 | "BSD-3-Clause" 318 | ], 319 | "authors": [ 320 | { 321 | "name": "Sebastian Bergmann", 322 | "email": "sb@sebastian-bergmann.de", 323 | "role": "lead" 324 | } 325 | ], 326 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 327 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 328 | "keywords": [ 329 | "coverage", 330 | "testing", 331 | "xunit" 332 | ], 333 | "time": "2015-10-06T15:47:00+00:00" 334 | }, 335 | { 336 | "name": "phpunit/php-file-iterator", 337 | "version": "1.4.2", 338 | "source": { 339 | "type": "git", 340 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 341 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 342 | }, 343 | "dist": { 344 | "type": "zip", 345 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 346 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 347 | "shasum": "" 348 | }, 349 | "require": { 350 | "php": ">=5.3.3" 351 | }, 352 | "type": "library", 353 | "extra": { 354 | "branch-alias": { 355 | "dev-master": "1.4.x-dev" 356 | } 357 | }, 358 | "autoload": { 359 | "classmap": [ 360 | "src/" 361 | ] 362 | }, 363 | "notification-url": "https://packagist.org/downloads/", 364 | "license": [ 365 | "BSD-3-Clause" 366 | ], 367 | "authors": [ 368 | { 369 | "name": "Sebastian Bergmann", 370 | "email": "sb@sebastian-bergmann.de", 371 | "role": "lead" 372 | } 373 | ], 374 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 375 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 376 | "keywords": [ 377 | "filesystem", 378 | "iterator" 379 | ], 380 | "time": "2016-10-03T07:40:28+00:00" 381 | }, 382 | { 383 | "name": "phpunit/php-text-template", 384 | "version": "1.2.1", 385 | "source": { 386 | "type": "git", 387 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 388 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 389 | }, 390 | "dist": { 391 | "type": "zip", 392 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 393 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 394 | "shasum": "" 395 | }, 396 | "require": { 397 | "php": ">=5.3.3" 398 | }, 399 | "type": "library", 400 | "autoload": { 401 | "classmap": [ 402 | "src/" 403 | ] 404 | }, 405 | "notification-url": "https://packagist.org/downloads/", 406 | "license": [ 407 | "BSD-3-Clause" 408 | ], 409 | "authors": [ 410 | { 411 | "name": "Sebastian Bergmann", 412 | "email": "sebastian@phpunit.de", 413 | "role": "lead" 414 | } 415 | ], 416 | "description": "Simple template engine.", 417 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 418 | "keywords": [ 419 | "template" 420 | ], 421 | "time": "2015-06-21T13:50:34+00:00" 422 | }, 423 | { 424 | "name": "phpunit/php-timer", 425 | "version": "1.0.9", 426 | "source": { 427 | "type": "git", 428 | "url": "https://github.com/sebastianbergmann/php-timer.git", 429 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 430 | }, 431 | "dist": { 432 | "type": "zip", 433 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 434 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 435 | "shasum": "" 436 | }, 437 | "require": { 438 | "php": "^5.3.3 || ^7.0" 439 | }, 440 | "require-dev": { 441 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 442 | }, 443 | "type": "library", 444 | "extra": { 445 | "branch-alias": { 446 | "dev-master": "1.0-dev" 447 | } 448 | }, 449 | "autoload": { 450 | "classmap": [ 451 | "src/" 452 | ] 453 | }, 454 | "notification-url": "https://packagist.org/downloads/", 455 | "license": [ 456 | "BSD-3-Clause" 457 | ], 458 | "authors": [ 459 | { 460 | "name": "Sebastian Bergmann", 461 | "email": "sb@sebastian-bergmann.de", 462 | "role": "lead" 463 | } 464 | ], 465 | "description": "Utility class for timing", 466 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 467 | "keywords": [ 468 | "timer" 469 | ], 470 | "time": "2017-02-26T11:10:40+00:00" 471 | }, 472 | { 473 | "name": "phpunit/php-token-stream", 474 | "version": "1.4.11", 475 | "source": { 476 | "type": "git", 477 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 478 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" 479 | }, 480 | "dist": { 481 | "type": "zip", 482 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", 483 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", 484 | "shasum": "" 485 | }, 486 | "require": { 487 | "ext-tokenizer": "*", 488 | "php": ">=5.3.3" 489 | }, 490 | "require-dev": { 491 | "phpunit/phpunit": "~4.2" 492 | }, 493 | "type": "library", 494 | "extra": { 495 | "branch-alias": { 496 | "dev-master": "1.4-dev" 497 | } 498 | }, 499 | "autoload": { 500 | "classmap": [ 501 | "src/" 502 | ] 503 | }, 504 | "notification-url": "https://packagist.org/downloads/", 505 | "license": [ 506 | "BSD-3-Clause" 507 | ], 508 | "authors": [ 509 | { 510 | "name": "Sebastian Bergmann", 511 | "email": "sebastian@phpunit.de" 512 | } 513 | ], 514 | "description": "Wrapper around PHP's tokenizer extension.", 515 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 516 | "keywords": [ 517 | "tokenizer" 518 | ], 519 | "time": "2017-02-27T10:12:30+00:00" 520 | }, 521 | { 522 | "name": "phpunit/phpunit", 523 | "version": "4.8.36", 524 | "source": { 525 | "type": "git", 526 | "url": "https://github.com/sebastianbergmann/phpunit.git", 527 | "reference": "46023de9a91eec7dfb06cc56cb4e260017298517" 528 | }, 529 | "dist": { 530 | "type": "zip", 531 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517", 532 | "reference": "46023de9a91eec7dfb06cc56cb4e260017298517", 533 | "shasum": "" 534 | }, 535 | "require": { 536 | "ext-dom": "*", 537 | "ext-json": "*", 538 | "ext-pcre": "*", 539 | "ext-reflection": "*", 540 | "ext-spl": "*", 541 | "php": ">=5.3.3", 542 | "phpspec/prophecy": "^1.3.1", 543 | "phpunit/php-code-coverage": "~2.1", 544 | "phpunit/php-file-iterator": "~1.4", 545 | "phpunit/php-text-template": "~1.2", 546 | "phpunit/php-timer": "^1.0.6", 547 | "phpunit/phpunit-mock-objects": "~2.3", 548 | "sebastian/comparator": "~1.2.2", 549 | "sebastian/diff": "~1.2", 550 | "sebastian/environment": "~1.3", 551 | "sebastian/exporter": "~1.2", 552 | "sebastian/global-state": "~1.0", 553 | "sebastian/version": "~1.0", 554 | "symfony/yaml": "~2.1|~3.0" 555 | }, 556 | "suggest": { 557 | "phpunit/php-invoker": "~1.1" 558 | }, 559 | "bin": [ 560 | "phpunit" 561 | ], 562 | "type": "library", 563 | "extra": { 564 | "branch-alias": { 565 | "dev-master": "4.8.x-dev" 566 | } 567 | }, 568 | "autoload": { 569 | "classmap": [ 570 | "src/" 571 | ] 572 | }, 573 | "notification-url": "https://packagist.org/downloads/", 574 | "license": [ 575 | "BSD-3-Clause" 576 | ], 577 | "authors": [ 578 | { 579 | "name": "Sebastian Bergmann", 580 | "email": "sebastian@phpunit.de", 581 | "role": "lead" 582 | } 583 | ], 584 | "description": "The PHP Unit Testing framework.", 585 | "homepage": "https://phpunit.de/", 586 | "keywords": [ 587 | "phpunit", 588 | "testing", 589 | "xunit" 590 | ], 591 | "time": "2017-06-21T08:07:12+00:00" 592 | }, 593 | { 594 | "name": "phpunit/phpunit-mock-objects", 595 | "version": "2.3.8", 596 | "source": { 597 | "type": "git", 598 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 599 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" 600 | }, 601 | "dist": { 602 | "type": "zip", 603 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", 604 | "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", 605 | "shasum": "" 606 | }, 607 | "require": { 608 | "doctrine/instantiator": "^1.0.2", 609 | "php": ">=5.3.3", 610 | "phpunit/php-text-template": "~1.2", 611 | "sebastian/exporter": "~1.2" 612 | }, 613 | "require-dev": { 614 | "phpunit/phpunit": "~4.4" 615 | }, 616 | "suggest": { 617 | "ext-soap": "*" 618 | }, 619 | "type": "library", 620 | "extra": { 621 | "branch-alias": { 622 | "dev-master": "2.3.x-dev" 623 | } 624 | }, 625 | "autoload": { 626 | "classmap": [ 627 | "src/" 628 | ] 629 | }, 630 | "notification-url": "https://packagist.org/downloads/", 631 | "license": [ 632 | "BSD-3-Clause" 633 | ], 634 | "authors": [ 635 | { 636 | "name": "Sebastian Bergmann", 637 | "email": "sb@sebastian-bergmann.de", 638 | "role": "lead" 639 | } 640 | ], 641 | "description": "Mock Object library for PHPUnit", 642 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 643 | "keywords": [ 644 | "mock", 645 | "xunit" 646 | ], 647 | "time": "2015-10-02T06:51:40+00:00" 648 | }, 649 | { 650 | "name": "sebastian/comparator", 651 | "version": "1.2.4", 652 | "source": { 653 | "type": "git", 654 | "url": "https://github.com/sebastianbergmann/comparator.git", 655 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 656 | }, 657 | "dist": { 658 | "type": "zip", 659 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 660 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 661 | "shasum": "" 662 | }, 663 | "require": { 664 | "php": ">=5.3.3", 665 | "sebastian/diff": "~1.2", 666 | "sebastian/exporter": "~1.2 || ~2.0" 667 | }, 668 | "require-dev": { 669 | "phpunit/phpunit": "~4.4" 670 | }, 671 | "type": "library", 672 | "extra": { 673 | "branch-alias": { 674 | "dev-master": "1.2.x-dev" 675 | } 676 | }, 677 | "autoload": { 678 | "classmap": [ 679 | "src/" 680 | ] 681 | }, 682 | "notification-url": "https://packagist.org/downloads/", 683 | "license": [ 684 | "BSD-3-Clause" 685 | ], 686 | "authors": [ 687 | { 688 | "name": "Jeff Welch", 689 | "email": "whatthejeff@gmail.com" 690 | }, 691 | { 692 | "name": "Volker Dusch", 693 | "email": "github@wallbash.com" 694 | }, 695 | { 696 | "name": "Bernhard Schussek", 697 | "email": "bschussek@2bepublished.at" 698 | }, 699 | { 700 | "name": "Sebastian Bergmann", 701 | "email": "sebastian@phpunit.de" 702 | } 703 | ], 704 | "description": "Provides the functionality to compare PHP values for equality", 705 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 706 | "keywords": [ 707 | "comparator", 708 | "compare", 709 | "equality" 710 | ], 711 | "time": "2017-01-29T09:50:25+00:00" 712 | }, 713 | { 714 | "name": "sebastian/diff", 715 | "version": "1.4.3", 716 | "source": { 717 | "type": "git", 718 | "url": "https://github.com/sebastianbergmann/diff.git", 719 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" 720 | }, 721 | "dist": { 722 | "type": "zip", 723 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", 724 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", 725 | "shasum": "" 726 | }, 727 | "require": { 728 | "php": "^5.3.3 || ^7.0" 729 | }, 730 | "require-dev": { 731 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 732 | }, 733 | "type": "library", 734 | "extra": { 735 | "branch-alias": { 736 | "dev-master": "1.4-dev" 737 | } 738 | }, 739 | "autoload": { 740 | "classmap": [ 741 | "src/" 742 | ] 743 | }, 744 | "notification-url": "https://packagist.org/downloads/", 745 | "license": [ 746 | "BSD-3-Clause" 747 | ], 748 | "authors": [ 749 | { 750 | "name": "Kore Nordmann", 751 | "email": "mail@kore-nordmann.de" 752 | }, 753 | { 754 | "name": "Sebastian Bergmann", 755 | "email": "sebastian@phpunit.de" 756 | } 757 | ], 758 | "description": "Diff implementation", 759 | "homepage": "https://github.com/sebastianbergmann/diff", 760 | "keywords": [ 761 | "diff" 762 | ], 763 | "time": "2017-05-22T07:24:03+00:00" 764 | }, 765 | { 766 | "name": "sebastian/environment", 767 | "version": "1.3.8", 768 | "source": { 769 | "type": "git", 770 | "url": "https://github.com/sebastianbergmann/environment.git", 771 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" 772 | }, 773 | "dist": { 774 | "type": "zip", 775 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", 776 | "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", 777 | "shasum": "" 778 | }, 779 | "require": { 780 | "php": "^5.3.3 || ^7.0" 781 | }, 782 | "require-dev": { 783 | "phpunit/phpunit": "^4.8 || ^5.0" 784 | }, 785 | "type": "library", 786 | "extra": { 787 | "branch-alias": { 788 | "dev-master": "1.3.x-dev" 789 | } 790 | }, 791 | "autoload": { 792 | "classmap": [ 793 | "src/" 794 | ] 795 | }, 796 | "notification-url": "https://packagist.org/downloads/", 797 | "license": [ 798 | "BSD-3-Clause" 799 | ], 800 | "authors": [ 801 | { 802 | "name": "Sebastian Bergmann", 803 | "email": "sebastian@phpunit.de" 804 | } 805 | ], 806 | "description": "Provides functionality to handle HHVM/PHP environments", 807 | "homepage": "http://www.github.com/sebastianbergmann/environment", 808 | "keywords": [ 809 | "Xdebug", 810 | "environment", 811 | "hhvm" 812 | ], 813 | "time": "2016-08-18T05:49:44+00:00" 814 | }, 815 | { 816 | "name": "sebastian/exporter", 817 | "version": "1.2.2", 818 | "source": { 819 | "type": "git", 820 | "url": "https://github.com/sebastianbergmann/exporter.git", 821 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" 822 | }, 823 | "dist": { 824 | "type": "zip", 825 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", 826 | "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", 827 | "shasum": "" 828 | }, 829 | "require": { 830 | "php": ">=5.3.3", 831 | "sebastian/recursion-context": "~1.0" 832 | }, 833 | "require-dev": { 834 | "ext-mbstring": "*", 835 | "phpunit/phpunit": "~4.4" 836 | }, 837 | "type": "library", 838 | "extra": { 839 | "branch-alias": { 840 | "dev-master": "1.3.x-dev" 841 | } 842 | }, 843 | "autoload": { 844 | "classmap": [ 845 | "src/" 846 | ] 847 | }, 848 | "notification-url": "https://packagist.org/downloads/", 849 | "license": [ 850 | "BSD-3-Clause" 851 | ], 852 | "authors": [ 853 | { 854 | "name": "Jeff Welch", 855 | "email": "whatthejeff@gmail.com" 856 | }, 857 | { 858 | "name": "Volker Dusch", 859 | "email": "github@wallbash.com" 860 | }, 861 | { 862 | "name": "Bernhard Schussek", 863 | "email": "bschussek@2bepublished.at" 864 | }, 865 | { 866 | "name": "Sebastian Bergmann", 867 | "email": "sebastian@phpunit.de" 868 | }, 869 | { 870 | "name": "Adam Harvey", 871 | "email": "aharvey@php.net" 872 | } 873 | ], 874 | "description": "Provides the functionality to export PHP variables for visualization", 875 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 876 | "keywords": [ 877 | "export", 878 | "exporter" 879 | ], 880 | "time": "2016-06-17T09:04:28+00:00" 881 | }, 882 | { 883 | "name": "sebastian/global-state", 884 | "version": "1.1.1", 885 | "source": { 886 | "type": "git", 887 | "url": "https://github.com/sebastianbergmann/global-state.git", 888 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 889 | }, 890 | "dist": { 891 | "type": "zip", 892 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 893 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 894 | "shasum": "" 895 | }, 896 | "require": { 897 | "php": ">=5.3.3" 898 | }, 899 | "require-dev": { 900 | "phpunit/phpunit": "~4.2" 901 | }, 902 | "suggest": { 903 | "ext-uopz": "*" 904 | }, 905 | "type": "library", 906 | "extra": { 907 | "branch-alias": { 908 | "dev-master": "1.0-dev" 909 | } 910 | }, 911 | "autoload": { 912 | "classmap": [ 913 | "src/" 914 | ] 915 | }, 916 | "notification-url": "https://packagist.org/downloads/", 917 | "license": [ 918 | "BSD-3-Clause" 919 | ], 920 | "authors": [ 921 | { 922 | "name": "Sebastian Bergmann", 923 | "email": "sebastian@phpunit.de" 924 | } 925 | ], 926 | "description": "Snapshotting of global state", 927 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 928 | "keywords": [ 929 | "global state" 930 | ], 931 | "time": "2015-10-12T03:26:01+00:00" 932 | }, 933 | { 934 | "name": "sebastian/recursion-context", 935 | "version": "1.0.5", 936 | "source": { 937 | "type": "git", 938 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 939 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" 940 | }, 941 | "dist": { 942 | "type": "zip", 943 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", 944 | "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", 945 | "shasum": "" 946 | }, 947 | "require": { 948 | "php": ">=5.3.3" 949 | }, 950 | "require-dev": { 951 | "phpunit/phpunit": "~4.4" 952 | }, 953 | "type": "library", 954 | "extra": { 955 | "branch-alias": { 956 | "dev-master": "1.0.x-dev" 957 | } 958 | }, 959 | "autoload": { 960 | "classmap": [ 961 | "src/" 962 | ] 963 | }, 964 | "notification-url": "https://packagist.org/downloads/", 965 | "license": [ 966 | "BSD-3-Clause" 967 | ], 968 | "authors": [ 969 | { 970 | "name": "Jeff Welch", 971 | "email": "whatthejeff@gmail.com" 972 | }, 973 | { 974 | "name": "Sebastian Bergmann", 975 | "email": "sebastian@phpunit.de" 976 | }, 977 | { 978 | "name": "Adam Harvey", 979 | "email": "aharvey@php.net" 980 | } 981 | ], 982 | "description": "Provides functionality to recursively process PHP variables", 983 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 984 | "time": "2016-10-03T07:41:43+00:00" 985 | }, 986 | { 987 | "name": "sebastian/version", 988 | "version": "1.0.6", 989 | "source": { 990 | "type": "git", 991 | "url": "https://github.com/sebastianbergmann/version.git", 992 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" 993 | }, 994 | "dist": { 995 | "type": "zip", 996 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 997 | "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", 998 | "shasum": "" 999 | }, 1000 | "type": "library", 1001 | "autoload": { 1002 | "classmap": [ 1003 | "src/" 1004 | ] 1005 | }, 1006 | "notification-url": "https://packagist.org/downloads/", 1007 | "license": [ 1008 | "BSD-3-Clause" 1009 | ], 1010 | "authors": [ 1011 | { 1012 | "name": "Sebastian Bergmann", 1013 | "email": "sebastian@phpunit.de", 1014 | "role": "lead" 1015 | } 1016 | ], 1017 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1018 | "homepage": "https://github.com/sebastianbergmann/version", 1019 | "time": "2015-06-21T13:59:46+00:00" 1020 | }, 1021 | { 1022 | "name": "squizlabs/php_codesniffer", 1023 | "version": "2.9.1", 1024 | "source": { 1025 | "type": "git", 1026 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 1027 | "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" 1028 | }, 1029 | "dist": { 1030 | "type": "zip", 1031 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", 1032 | "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", 1033 | "shasum": "" 1034 | }, 1035 | "require": { 1036 | "ext-simplexml": "*", 1037 | "ext-tokenizer": "*", 1038 | "ext-xmlwriter": "*", 1039 | "php": ">=5.1.2" 1040 | }, 1041 | "require-dev": { 1042 | "phpunit/phpunit": "~4.0" 1043 | }, 1044 | "bin": [ 1045 | "scripts/phpcs", 1046 | "scripts/phpcbf" 1047 | ], 1048 | "type": "library", 1049 | "extra": { 1050 | "branch-alias": { 1051 | "dev-master": "2.x-dev" 1052 | } 1053 | }, 1054 | "autoload": { 1055 | "classmap": [ 1056 | "CodeSniffer.php", 1057 | "CodeSniffer/CLI.php", 1058 | "CodeSniffer/Exception.php", 1059 | "CodeSniffer/File.php", 1060 | "CodeSniffer/Fixer.php", 1061 | "CodeSniffer/Report.php", 1062 | "CodeSniffer/Reporting.php", 1063 | "CodeSniffer/Sniff.php", 1064 | "CodeSniffer/Tokens.php", 1065 | "CodeSniffer/Reports/", 1066 | "CodeSniffer/Tokenizers/", 1067 | "CodeSniffer/DocGenerators/", 1068 | "CodeSniffer/Standards/AbstractPatternSniff.php", 1069 | "CodeSniffer/Standards/AbstractScopeSniff.php", 1070 | "CodeSniffer/Standards/AbstractVariableSniff.php", 1071 | "CodeSniffer/Standards/IncorrectPatternException.php", 1072 | "CodeSniffer/Standards/Generic/Sniffs/", 1073 | "CodeSniffer/Standards/MySource/Sniffs/", 1074 | "CodeSniffer/Standards/PEAR/Sniffs/", 1075 | "CodeSniffer/Standards/PSR1/Sniffs/", 1076 | "CodeSniffer/Standards/PSR2/Sniffs/", 1077 | "CodeSniffer/Standards/Squiz/Sniffs/", 1078 | "CodeSniffer/Standards/Zend/Sniffs/" 1079 | ] 1080 | }, 1081 | "notification-url": "https://packagist.org/downloads/", 1082 | "license": [ 1083 | "BSD-3-Clause" 1084 | ], 1085 | "authors": [ 1086 | { 1087 | "name": "Greg Sherwood", 1088 | "role": "lead" 1089 | } 1090 | ], 1091 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1092 | "homepage": "http://www.squizlabs.com/php-codesniffer", 1093 | "keywords": [ 1094 | "phpcs", 1095 | "standards" 1096 | ], 1097 | "time": "2017-05-22T02:43:20+00:00" 1098 | }, 1099 | { 1100 | "name": "symfony/yaml", 1101 | "version": "v3.3.10", 1102 | "source": { 1103 | "type": "git", 1104 | "url": "https://github.com/symfony/yaml.git", 1105 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46" 1106 | }, 1107 | "dist": { 1108 | "type": "zip", 1109 | "url": "https://api.github.com/repos/symfony/yaml/zipball/8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", 1110 | "reference": "8c7bf1e7d5d6b05a690b715729cb4cd0c0a99c46", 1111 | "shasum": "" 1112 | }, 1113 | "require": { 1114 | "php": "^5.5.9|>=7.0.8" 1115 | }, 1116 | "require-dev": { 1117 | "symfony/console": "~2.8|~3.0" 1118 | }, 1119 | "suggest": { 1120 | "symfony/console": "For validating YAML files using the lint command" 1121 | }, 1122 | "type": "library", 1123 | "extra": { 1124 | "branch-alias": { 1125 | "dev-master": "3.3-dev" 1126 | } 1127 | }, 1128 | "autoload": { 1129 | "psr-4": { 1130 | "Symfony\\Component\\Yaml\\": "" 1131 | }, 1132 | "exclude-from-classmap": [ 1133 | "/Tests/" 1134 | ] 1135 | }, 1136 | "notification-url": "https://packagist.org/downloads/", 1137 | "license": [ 1138 | "MIT" 1139 | ], 1140 | "authors": [ 1141 | { 1142 | "name": "Fabien Potencier", 1143 | "email": "fabien@symfony.com" 1144 | }, 1145 | { 1146 | "name": "Symfony Community", 1147 | "homepage": "https://symfony.com/contributors" 1148 | } 1149 | ], 1150 | "description": "Symfony Yaml Component", 1151 | "homepage": "https://symfony.com", 1152 | "time": "2017-10-05T14:43:42+00:00" 1153 | }, 1154 | { 1155 | "name": "webmozart/assert", 1156 | "version": "1.2.0", 1157 | "source": { 1158 | "type": "git", 1159 | "url": "https://github.com/webmozart/assert.git", 1160 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 1161 | }, 1162 | "dist": { 1163 | "type": "zip", 1164 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 1165 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 1166 | "shasum": "" 1167 | }, 1168 | "require": { 1169 | "php": "^5.3.3 || ^7.0" 1170 | }, 1171 | "require-dev": { 1172 | "phpunit/phpunit": "^4.6", 1173 | "sebastian/version": "^1.0.1" 1174 | }, 1175 | "type": "library", 1176 | "extra": { 1177 | "branch-alias": { 1178 | "dev-master": "1.3-dev" 1179 | } 1180 | }, 1181 | "autoload": { 1182 | "psr-4": { 1183 | "Webmozart\\Assert\\": "src/" 1184 | } 1185 | }, 1186 | "notification-url": "https://packagist.org/downloads/", 1187 | "license": [ 1188 | "MIT" 1189 | ], 1190 | "authors": [ 1191 | { 1192 | "name": "Bernhard Schussek", 1193 | "email": "bschussek@gmail.com" 1194 | } 1195 | ], 1196 | "description": "Assertions to validate method input/output with nice error messages.", 1197 | "keywords": [ 1198 | "assert", 1199 | "check", 1200 | "validate" 1201 | ], 1202 | "time": "2016-11-23T20:04:58+00:00" 1203 | } 1204 | ], 1205 | "aliases": [], 1206 | "minimum-stability": "stable", 1207 | "stability-flags": [], 1208 | "prefer-stable": false, 1209 | "prefer-lowest": false, 1210 | "platform": { 1211 | "php": ">=5.3.0" 1212 | }, 1213 | "platform-dev": [] 1214 | } 1215 | --------------------------------------------------------------------------------