├── .gitignore ├── .travis.yml ├── tests ├── TraitTest.php ├── CardTest.php ├── UrlTest.php ├── EmailTest.php ├── PhoneTest.php ├── IPTest.php ├── RequiredTest.php ├── EmailMxTest.php ├── AphaNumericTest.php ├── LengthTest.php ├── ExtendTest.php └── MiscTest.php ├── composer.json ├── LICENSE ├── README.md ├── lib └── validate.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | composer.phar 2 | /vendor/ 3 | /.idea/ 4 | *.iml 5 | 6 | # Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control 7 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file 8 | # composer.lock -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | php: 3 | - '7.1' 4 | cache: 5 | directories: 6 | - $HOME/.composer/cache 7 | before_script: 8 | - travis_retry composer self-update 9 | - travis_retry composer install --no-interaction --prefer-source --dev 10 | script: 11 | - ./vendor/bin/phpunit --bootstrap vendor/autoload.php --testdox tests -------------------------------------------------------------------------------- /tests/TraitTest.php: -------------------------------------------------------------------------------- 1 | "phone" 12 | ]; 13 | } 14 | } 15 | 16 | class TraitTest extends \PHPUnit\Framework\TestCase 17 | { 18 | 19 | public function testAssertValidTrait() 20 | { 21 | $mockTrait = new MockTraitTest(); 22 | $this->assertTrue(is_callable(array($mockTrait, 'addValidator'))); 23 | } 24 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geofmureithi/f3-validate", 3 | "description": "A validation lib for Fat Free Framework", 4 | "type": "library", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Geof Mureithi", 9 | "email": "mureithinjuguna@gmail.com" 10 | } 11 | ], 12 | "autoload": { 13 | "classmap": ["lib/"] 14 | }, 15 | "require": { 16 | "bcosca/fatfree": "^3.5" 17 | }, 18 | "require-dev": { 19 | "phpunit/phpunit": "^7.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/CardTest.php: -------------------------------------------------------------------------------- 1 | "card" 11 | ]; 12 | } 13 | } 14 | 15 | class CardTest extends \PHPUnit\Framework\TestCase 16 | { 17 | 18 | public function testAssertValidCard() 19 | { 20 | $input = [ 21 | "ccard" => "343760667618602" 22 | ]; 23 | $mockCard = new MockCardTest(); 24 | $this->assertEquals(true, $mockCard->check($input)); 25 | } 26 | 27 | public function testRejectInvalidCard() 28 | { 29 | $input = [ 30 | "ccard" => "test" 31 | ]; 32 | $mockCard = new MockCardTest(); 33 | $this->assertContains("The value of ccard must be a valid credit card", $mockCard->check($input)); 34 | } 35 | } -------------------------------------------------------------------------------- /tests/UrlTest.php: -------------------------------------------------------------------------------- 1 | "url" 12 | ]; 13 | } 14 | } 15 | 16 | class UrlTest extends \PHPUnit\Framework\TestCase 17 | { 18 | 19 | public function testAcceptOnValidUrl() 20 | { 21 | $input = [ 22 | "website" => "http://fatfreeframework.com" 23 | ]; 24 | $mock = new MockUrlTest(); 25 | $this->assertEquals(true, $mock->check($input)); 26 | } 27 | 28 | public function testRejectWhenUrlInvalid() 29 | { 30 | $input = [ 31 | "website" => "test" 32 | ]; 33 | $mock = new MockUrlTest(); 34 | $this->assertContains("The value of website must be a valid url", $mock->check($input)); 35 | } 36 | } -------------------------------------------------------------------------------- /tests/EmailTest.php: -------------------------------------------------------------------------------- 1 | "email" 11 | ]; 12 | } 13 | } 14 | 15 | class EmailTest extends \PHPUnit\Framework\TestCase 16 | { 17 | 18 | public function testAssertValidEmail() 19 | { 20 | $input = [ 21 | "email" => "test@email.com" 22 | ]; 23 | $mockEmail = new MockEmailTest(); 24 | $this->assertEquals(true, $mockEmail->check($input)); 25 | } 26 | 27 | public function testRejectInvalidEmail() 28 | { 29 | $input = [ 30 | "email" => "test" 31 | ]; 32 | $mockEmail = new MockEmailTest(); 33 | $this->assertContains("The value of email must be a valid email", $mockEmail->check($input)); 34 | } 35 | } -------------------------------------------------------------------------------- /tests/PhoneTest.php: -------------------------------------------------------------------------------- 1 | "phone" 11 | ]; 12 | } 13 | } 14 | 15 | class PhoneTest extends \PHPUnit\Framework\TestCase 16 | { 17 | 18 | public function testAssertValidPhone() 19 | { 20 | $input = [ 21 | "phone" => "1-234-567-8901" 22 | ]; 23 | $mockPhone = new MockPhoneTest(); 24 | $this->assertEquals(true, $mockPhone->check($input)); 25 | } 26 | 27 | public function testRejectInvalidPhone() 28 | { 29 | $input = [ 30 | "phone" => "1-234" 31 | ]; 32 | $mockPhone = new MockPhoneTest(); 33 | $this->assertContains("The value of phone must be a valid phone number", $mockPhone->check($input)); 34 | } 35 | } -------------------------------------------------------------------------------- /tests/IPTest.php: -------------------------------------------------------------------------------- 1 | "ipv4", 11 | "ip2" => "ipv6", 12 | ]; 13 | } 14 | } 15 | 16 | class IPTest extends \PHPUnit\Framework\TestCase 17 | { 18 | 19 | public function testAssertValidIps() 20 | { 21 | $input = [ 22 | "ip1" => "178.7.35.202", 23 | "ip2" => "2001:db8::1428:57ab" 24 | ]; 25 | $mockIp = new MockIPTest(); 26 | $this->assertEquals(true, $mockIp->check($input)); 27 | } 28 | 29 | public function testRejectInvalidIps() 30 | { 31 | $input = [ 32 | "ip1" => "locallost", 33 | "ip2" => "10000.1.1.0.1" 34 | ]; 35 | $mockIp = new MockIPTest(); 36 | $this->assertContains("The value of ip1 must be a valid ipv4 address", $mockIp->check($input)); 37 | $this->assertContains("The value of ip2 must be a valid ipv6 address", $mockIp->check($input)); 38 | } 39 | } -------------------------------------------------------------------------------- /tests/RequiredTest.php: -------------------------------------------------------------------------------- 1 | "required" 11 | ]; 12 | } 13 | } 14 | 15 | class RequiredTest extends \PHPUnit\Framework\TestCase 16 | { 17 | 18 | public function testAcceptWhenExists() 19 | { 20 | $input = [ 21 | "email" => "test@email.com" 22 | ]; 23 | $mock = new MockRequiredTest(); 24 | $this->assertEquals(true, $mock->check($input)); 25 | } 26 | 27 | public function testRejectWhenEmpty() 28 | { 29 | $input = [ 30 | "email" => "" 31 | ]; 32 | $mock = new MockRequiredTest(); 33 | $this->assertContains("The value of email is required", $mock->check($input)); 34 | } 35 | 36 | public function testRejectWhenNonExistent() 37 | { 38 | $input = [ 39 | "website" => "google.com" 40 | ]; 41 | $mock = new MockRequiredTest(); 42 | $this->assertContains("The value of email is required", $mock->check($input)); 43 | } 44 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Geoffrey Mureithi 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 all 13 | 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 THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /tests/EmailMxTest.php: -------------------------------------------------------------------------------- 1 | "email,true" 11 | ]; 12 | } 13 | } 14 | 15 | class EmailMxTest extends \PHPUnit\Framework\TestCase 16 | { 17 | 18 | public function testAssertValidEmail() 19 | { 20 | $input = [ 21 | "email" => "test@gmail.com" 22 | ]; 23 | $mockEmail = new MockEmailTest(); 24 | $this->assertEquals(true, $mockEmail->check($input)); 25 | } 26 | 27 | public function testRejectValidEmailWithIncorrectMx() 28 | { 29 | $input = [ 30 | "email" => "test@email.lq" 31 | ]; 32 | $mockEmail = new MockEmailMxTest(); 33 | $this->assertContains("The value of email must be a valid email", $mockEmail->check($input)); 34 | } 35 | 36 | public function testRejectInvalidEmailWithMx() 37 | { 38 | $input = [ 39 | "email" => "test" 40 | ]; 41 | $mockEmail = new MockEmailMxTest(); 42 | $this->assertContains("The value of email must be a valid email", $mockEmail->check($input)); 43 | } 44 | } -------------------------------------------------------------------------------- /tests/AphaNumericTest.php: -------------------------------------------------------------------------------- 1 | "alphanumeric", 11 | "alpha" => "alpha", 12 | "numeric" => "numeric", 13 | ]; 14 | } 15 | } 16 | 17 | class AphaNumericTest extends \PHPUnit\Framework\TestCase 18 | { 19 | 20 | public function testAcceptWhenValid() 21 | { 22 | $input = [ 23 | "alphanumeric" => "alphanumeric1235", 24 | "alpha" => "alphakzzz", 25 | "numeric" => "13.05", 26 | ]; 27 | $mock = new MockAphaNumericTest(); 28 | $this->assertEquals(true, $mock->check($input)); 29 | } 30 | 31 | public function testRejectWhenInvalid() 32 | { 33 | $input = [ 34 | "alphanumeric" => "! @ # & ( ) – [ { } ] : ; ', ? / *", 35 | "alpha" => "12345", 36 | "numeric" => "numeric", 37 | ]; 38 | $mock = new MockAphaNumericTest(); 39 | $result = $mock->check($input); 40 | $this->assertContains("The value of alphanumeric can only contain alphanumerics", $result); 41 | $this->assertContains("The value of alpha can only contain alphabet letters", $result); 42 | $this->assertContains("The value of numeric can only contain numbers", $result); 43 | } 44 | } -------------------------------------------------------------------------------- /tests/LengthTest.php: -------------------------------------------------------------------------------- 1 | "max_length,10", 11 | "min_length" => "min_length,10", 12 | "exact_length" => "exact_length,10" 13 | ]; 14 | } 15 | } 16 | 17 | class LengthTest extends \PHPUnit\Framework\TestCase 18 | { 19 | 20 | public function testAcceptWhenValid() 21 | { 22 | $input = [ 23 | "max_length" => "below 10", 24 | "min_length" => "greater than ten", 25 | "exact_length" => "exactlyten" 26 | ]; 27 | $mock = new MockLengthTest(); 28 | $this->assertEquals(true, $mock->check($input)); 29 | } 30 | 31 | public function testRejectWhenInvalid() 32 | { 33 | $input = [ 34 | "max_length" => "greater than ten", 35 | "min_length" => "below 10", 36 | "exact_length" => "no exactly ten" 37 | ]; 38 | $mock = new MockLengthTest(); 39 | $result = $mock->check($input); 40 | $this->assertContains("The length of max_length can not be greater than 10", $result); 41 | $this->assertContains("The length of min_length can not be less than 10", $result); 42 | $this->assertContains("The length of exact_length must be exactly 10", $result); 43 | } 44 | } -------------------------------------------------------------------------------- /tests/ExtendTest.php: -------------------------------------------------------------------------------- 1 | "contains,(apples&bananas)" 11 | ]; 12 | } 13 | } 14 | 15 | class ExtendTest extends \PHPUnit\Framework\TestCase 16 | { 17 | public function testAssertValidExtend() 18 | { 19 | $input = [ 20 | "fruits" => "berries,apples,bananas,mangoes" 21 | ]; 22 | $mockExtend = new MockExtendTest(); 23 | $this->assertEquals(true, $mockExtend->check($input)); 24 | } 25 | 26 | public function testRejectInvalidExtend() 27 | { 28 | $input = [ 29 | "fruits" => "1-234" 30 | ]; 31 | $mockExtend = new MockExtendTest(); 32 | $this->assertContains("The value of fruits must include each of these items : (apples&bananas)", $mockExtend->check($input)); 33 | } 34 | 35 | protected function setUp() 36 | { 37 | //You must do this somewhere in your code before validating 38 | $message = "The value of {0} must include each of these items : {1}"; 39 | Validate::addValidator("contains", function ($value, $ruleConfigs) { 40 | $required = explode("&", substr($ruleConfigs[0], 1, -1)); 41 | $diff = array_diff($required, explode(",", $value)); 42 | return empty($diff); 43 | }, $message); 44 | } 45 | } -------------------------------------------------------------------------------- /tests/MiscTest.php: -------------------------------------------------------------------------------- 1 | "boolean", 12 | "password" => "matches,repeat_password", 13 | "regex" => "regex,/(\\d+)/" 14 | ]; 15 | } 16 | } 17 | 18 | class MiscTest extends \PHPUnit\Framework\TestCase 19 | { 20 | 21 | public function testAcceptOnValidBoolean() 22 | { 23 | $input = [ 24 | "boolean" => "on" 25 | ]; 26 | $mock = new MockMiscTest(); 27 | $this->assertEquals(true, $mock->check($input)); 28 | } 29 | 30 | public function testRejectWhenBooleanInvalid() 31 | { 32 | $input = [ 33 | "boolean" => "nada" 34 | ]; 35 | $mock = new MockMiscTest(); 36 | $this->assertContains("The value of boolean can only contain boolean values", $mock->check($input)); 37 | } 38 | 39 | public function testAcceptOnValidMatches() 40 | { 41 | $input = [ 42 | "password" => "&s#Nk;SJn", 43 | "repeat_password" => "&s#Nk;SJn", 44 | ]; 45 | $mock = new MockMiscTest(); 46 | $this->assertEquals(true, $mock->check($input)); 47 | } 48 | 49 | public function testRejectOnMismatches() 50 | { 51 | $input = [ 52 | "password" => "&s#Nk;SJn", 53 | "repeat_password" => "123456", 54 | ]; 55 | $mock = new MockMiscTest(); 56 | $this->assertContains("The value of password should match that of repeat_password", $mock->check($input)); 57 | } 58 | 59 | public function testAcceptOnValidRegexMatch() 60 | { 61 | $input = [ 62 | "regex" => "100" 63 | ]; 64 | $mock = new MockMiscTest(); 65 | $this->assertEquals(true, $mock->check($input)); 66 | } 67 | 68 | public function testRejectWhenRegexMatchFailed() 69 | { 70 | $input = [ 71 | "regex" => "nada" 72 | ]; 73 | $mock = new MockMiscTest(); 74 | $this->assertContains("The value of regex must match the regex /(\\d+)/", $mock->check($input)); 75 | } 76 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fat Free Framework Validator 2 | 3 | An easy to use and strait to the point validation trait for Fat Free Framework 4 | 5 | 6 | [![Build Status](https://travis-ci.org/geofmureithi/f3-validate.svg?branch=master)](https://travis-ci.org/geofmureithi/f3-validate) 7 | ## Installation 8 | 9 | ##### Using Composer 10 | ```bash 11 | composer require geofmureithi/f3-validate 12 | ``` 13 | ##### Manually 14 | Copy the `lib\validate.php` file to the lib folder or any root of an auto included folder. 15 | 16 | **Remember it requires at least php 5.4 to use traits** 17 | ## Getting Started 18 | 19 | ```php 20 | class Profile 21 | { 22 | use Validate; //<--- Trait 23 | 24 | public function getRules() 25 | { 26 | return [ 27 | "email" => "reqired|email" 28 | ]; 29 | } 30 | 31 | public function save() 32 | { 33 | //..... 34 | } 35 | } 36 | 37 | $data = $f3->get('POST') 38 | $profile = new Profile(); 39 | $result = $profile->check($data); 40 | if( $result != true) return $result; //errors 41 | $profile->save(); 42 | ``` 43 | Available Validators 44 | -------------------- 45 | * required `Ensures the specified key value exists and is not empty` 46 | * email `Checks for a valid email address` 47 | * max_length,n `Checks key value length, makes sure it's not longer than the specified length. n = length parameter.` 48 | * min_length,n `Checks key value length, makes sure it's not shorter than the specified length. n = length parameter.` 49 | * exact_length,n `Ensures that the key value length precisely matches the specified length. n = length parameter.` 50 | * alpha `Ensure only alpha characters are present in the key value (a-z, A-Z)` 51 | * alpha_numeric `Ensure only alpha-numeric characters are present in the key value (a-z, A-Z, 0-9)` 52 | * numeric `Ensure only numeric key values` 53 | * boolean `Checks for PHP accepted boolean values, returns TRUE for "1", "true", "on" and "yes"` 54 | * url `Check for valid URL or subdomain` 55 | * ipv4 `Check for valid IPv4 address` 56 | * ipv6 `Check for valid IPv6 address` 57 | * card `Check for a valid credit card number (Uses the MOD10 Checksum Algorithm)` 58 | * phone `Validate phone numbers that match the following examples: 555-555-5555 , 5555425555, 555 555 5555, 1(519) 555-4444, 1 (519) 555-4422, 1-555-555-5555` 59 | * regex `You can pass a custom regex using the following format: 'regex,/your-regex/'` 60 | 61 | 62 | Adding custom validators and filters is made easy by using callback functions. 63 | 64 | ```php 65 | $message = "The value of {0} must include each of these items : {1}"; 66 | Validate::addValidator("contains", function ($value, $ruleConfigs) { 67 | $required = explode("&", substr($ruleConfigs[0], 1, -1)); 68 | $diff = array_diff($required, explode(",", $value)); 69 | return empty($diff); 70 | }, $message); 71 | 72 | //Or 73 | Validate::addValidator("custom", "SampleClass::testCustom", "Custom Error"); 74 | ``` 75 | ## RoadMap 76 | 77 | - [x] Add Tests and Travis 78 | - [x] Convert to Trait 79 | - [x] Use Audit and make Lib more lightweight 80 | - [x] Allow Translations 81 | - [x] Add Composer 82 | - [ ] Add detailed Examples 83 | 84 | ## Development 85 | Tests are run using PHPUnit 86 | ```bash 87 | ./vendor/bin/phpunit --bootstrap vendor/autoload.php --testdox tests 88 | ``` 89 | 90 | ## Examples 91 | 92 | See the tests folder for now 93 | 94 | ## Contributing 95 | 96 | Feel free to Create a PR 97 | 98 | 99 | -------------------------------------------------------------------------------- /lib/validate.php: -------------------------------------------------------------------------------- 1 | errors = []; 43 | $f3 = Base::instance(); 44 | $configValidators = $f3->exists("VALIDATE.validators") ? $f3->get('VALIDATE.validators') : []; 45 | $configErrorMessages = $f3->exists("VALIDATE.errors") ? $f3->get('VALIDATE.errors') : []; 46 | $rules = $this->getRules(); 47 | $validators = array_merge(static::getDefaultValidators(), $configValidators, Validate::$extendedValidators); 48 | $errorMessages = array_merge(static::getDefaultErrorMessages(), $configErrorMessages, Validate::$extendedErrorMessages); 49 | $validateMapper = function ($field, $value, $rule, $input) use ($f3, $validators, $errorMessages) { 50 | $innerRules = explode('|', $rule); 51 | if (!$innerRules) return true; 52 | foreach ($innerRules as $currentRule) { 53 | $ruleConfigs = $f3->split($currentRule, false); 54 | $mainRule = $ruleConfigs[0]; 55 | $callable = $validators[$mainRule]; 56 | if (!$callable) throw new Exception("Validation for $mainRule is missing"); 57 | array_shift($ruleConfigs); 58 | if ($f3->call($callable, [$value, $ruleConfigs, $input])) continue; 59 | $error = $errorMessages[$mainRule] ? $errorMessages[$mainRule] : Validate::$defaultErrorMessage; 60 | return $f3->format($error, $field, implode(' , ', $ruleConfigs)); 61 | } 62 | return true; 63 | }; 64 | foreach ($rules as $field => $rule) { 65 | /* 66 | * The line below ensures that if no input and the field is not required then no need validation 67 | * For example, A user doesn't need to enter their website during profile creation, but if they enter, it has to be valid 68 | * Hence remember to add required rule. 69 | * [Possible Bug] Additionally, avoid rules with the string "required" unless the field is required. 70 | * TODO: find a better fix for the above scenario 71 | */ 72 | if (!$input[$field] && !preg_match('/required/', $rule)) continue; 73 | $result = $validateMapper($field, $input[$field], $rule, $input); 74 | if ($result !== true) 75 | $this->errors[$field] = $result; 76 | } 77 | return $this->errors ? $this->errors : true; 78 | } 79 | 80 | /** 81 | * getDefaultValidators: Gets the inbult validators 82 | * @return array 83 | */ 84 | protected function getDefaultValidators() 85 | { 86 | return [ 87 | "required" => function ($str) { 88 | return !!strlen($str); 89 | }, 90 | "email" => function ($str, $configs = []) { 91 | return Audit::instance()->email($str, $configs[0]); 92 | }, 93 | "url" => function ($str) { 94 | return Audit::instance()->url($str); 95 | }, 96 | "card" => function ($str) { 97 | return Audit::instance()->card($str); 98 | }, 99 | "ipv4" => function ($str) { 100 | return Audit::instance()->ipv4($str); 101 | }, 102 | "ipv6" => function ($str) { 103 | return Audit::instance()->ipv6($str); 104 | }, 105 | "max_length" => function ($str, $rule = []) { 106 | return extension_loaded('mbstring') ? mb_strlen($str) <= (int)$rule[0] : strlen($str) <= (int)$rule[0]; 107 | }, 108 | "min_length" => function ($str, $rule = []) { 109 | return extension_loaded('mbstring') ? mb_strlen($str) >= (int)$rule[0] : strlen($str) >= (int)$rule[0]; 110 | }, 111 | "exact_length" => function ($str, $rule = []) { 112 | return strlen($str) === (int)$rule[0]; 113 | }, 114 | "alphanumeric" => function ($str) { 115 | return ctype_alnum($str); 116 | }, 117 | "alpha" => function ($str) { 118 | return ctype_alpha($str); 119 | }, 120 | "matches" => function ($str, $rule, $input) { 121 | return $str === $input[$rule[0]]; 122 | }, 123 | "numeric" => function ($str) { 124 | return is_numeric($str); 125 | }, 126 | "boolean" => function ($str) { 127 | return in_array($str, [true, "true", 1, "on", "yes", false, "false", "off", "no"], true); 128 | }, 129 | "phone" => function ($str) { 130 | return preg_match($this->phoneRegex, $str); 131 | }, 132 | "regex" => function ($str, $rule = []) { 133 | return preg_match($rule[0], $str); 134 | } 135 | 136 | ]; 137 | } 138 | 139 | /** 140 | * getDefaultErrorMessages: returns inbuilt error messages for default rules 141 | * @return array 142 | */ 143 | protected function getDefaultErrorMessages() 144 | { 145 | return [ 146 | "required" => "The value of {0} is required", 147 | "email" => "The value of {0} must be a valid email", 148 | "url" => "The value of {0} must be a valid url", 149 | "card" => "The value of {0} must be a valid credit card", 150 | "ipv4" => "The value of {0} must be a valid ipv4 address", 151 | "ipv6" => "The value of {0} must be a valid ipv6 address", 152 | "max_length" => "The length of {0} can not be greater than {1}", 153 | "min_length" => "The length of {0} can not be less than {1}", 154 | "exact_length" => "The length of {0} must be exactly {1}", 155 | "alphanumeric" => "The value of {0} can only contain alphanumerics", 156 | "alpha" => "The value of {0} can only contain alphabet letters", 157 | "numeric" => "The value of {0} can only contain numbers", 158 | "matches" => "The value of {0} should match that of {1}", 159 | "boolean" => "The value of {0} can only contain boolean values", 160 | "phone" => "The value of {0} must be a valid phone number", 161 | "regex" => "The value of {0} must match the regex {1}" 162 | ]; 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /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": "8ba53026abbd8f237fbef7cf1b6e1163", 8 | "packages": [ 9 | { 10 | "name": "bcosca/fatfree", 11 | "version": "3.6.4", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/bcosca/fatfree.git", 15 | "reference": "dee4d73918a42076d5ac7db64d6d39706c7f328a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/bcosca/fatfree/zipball/dee4d73918a42076d5ac7db64d6d39706c7f328a", 20 | "reference": "dee4d73918a42076d5ac7db64d6d39706c7f328a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.4" 25 | }, 26 | "type": "library", 27 | "autoload": { 28 | "files": [ 29 | "lib/base.php" 30 | ] 31 | }, 32 | "notification-url": "https://packagist.org/downloads/", 33 | "license": [ 34 | "GPL-3.0" 35 | ], 36 | "description": "A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast!", 37 | "homepage": "http://fatfreeframework.com/", 38 | "time": "2018-04-19T17:23:25+00:00" 39 | } 40 | ], 41 | "packages-dev": [ 42 | { 43 | "name": "doctrine/instantiator", 44 | "version": "1.1.0", 45 | "source": { 46 | "type": "git", 47 | "url": "https://github.com/doctrine/instantiator.git", 48 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 49 | }, 50 | "dist": { 51 | "type": "zip", 52 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 53 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 54 | "shasum": "" 55 | }, 56 | "require": { 57 | "php": "^7.1" 58 | }, 59 | "require-dev": { 60 | "athletic/athletic": "~0.1.8", 61 | "ext-pdo": "*", 62 | "ext-phar": "*", 63 | "phpunit/phpunit": "^6.2.3", 64 | "squizlabs/php_codesniffer": "^3.0.2" 65 | }, 66 | "type": "library", 67 | "extra": { 68 | "branch-alias": { 69 | "dev-master": "1.2.x-dev" 70 | } 71 | }, 72 | "autoload": { 73 | "psr-4": { 74 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 75 | } 76 | }, 77 | "notification-url": "https://packagist.org/downloads/", 78 | "license": [ 79 | "MIT" 80 | ], 81 | "authors": [ 82 | { 83 | "name": "Marco Pivetta", 84 | "email": "ocramius@gmail.com", 85 | "homepage": "http://ocramius.github.com/" 86 | } 87 | ], 88 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 89 | "homepage": "https://github.com/doctrine/instantiator", 90 | "keywords": [ 91 | "constructor", 92 | "instantiate" 93 | ], 94 | "time": "2017-07-22T11:58:36+00:00" 95 | }, 96 | { 97 | "name": "myclabs/deep-copy", 98 | "version": "1.8.1", 99 | "source": { 100 | "type": "git", 101 | "url": "https://github.com/myclabs/DeepCopy.git", 102 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" 103 | }, 104 | "dist": { 105 | "type": "zip", 106 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 107 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 108 | "shasum": "" 109 | }, 110 | "require": { 111 | "php": "^7.1" 112 | }, 113 | "replace": { 114 | "myclabs/deep-copy": "self.version" 115 | }, 116 | "require-dev": { 117 | "doctrine/collections": "^1.0", 118 | "doctrine/common": "^2.6", 119 | "phpunit/phpunit": "^7.1" 120 | }, 121 | "type": "library", 122 | "autoload": { 123 | "psr-4": { 124 | "DeepCopy\\": "src/DeepCopy/" 125 | }, 126 | "files": [ 127 | "src/DeepCopy/deep_copy.php" 128 | ] 129 | }, 130 | "notification-url": "https://packagist.org/downloads/", 131 | "license": [ 132 | "MIT" 133 | ], 134 | "description": "Create deep copies (clones) of your objects", 135 | "keywords": [ 136 | "clone", 137 | "copy", 138 | "duplicate", 139 | "object", 140 | "object graph" 141 | ], 142 | "time": "2018-06-11T23:09:50+00:00" 143 | }, 144 | { 145 | "name": "phar-io/manifest", 146 | "version": "1.0.3", 147 | "source": { 148 | "type": "git", 149 | "url": "https://github.com/phar-io/manifest.git", 150 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 151 | }, 152 | "dist": { 153 | "type": "zip", 154 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 155 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 156 | "shasum": "" 157 | }, 158 | "require": { 159 | "ext-dom": "*", 160 | "ext-phar": "*", 161 | "phar-io/version": "^2.0", 162 | "php": "^5.6 || ^7.0" 163 | }, 164 | "type": "library", 165 | "extra": { 166 | "branch-alias": { 167 | "dev-master": "1.0.x-dev" 168 | } 169 | }, 170 | "autoload": { 171 | "classmap": [ 172 | "src/" 173 | ] 174 | }, 175 | "notification-url": "https://packagist.org/downloads/", 176 | "license": [ 177 | "BSD-3-Clause" 178 | ], 179 | "authors": [ 180 | { 181 | "name": "Arne Blankerts", 182 | "email": "arne@blankerts.de", 183 | "role": "Developer" 184 | }, 185 | { 186 | "name": "Sebastian Heuer", 187 | "email": "sebastian@phpeople.de", 188 | "role": "Developer" 189 | }, 190 | { 191 | "name": "Sebastian Bergmann", 192 | "email": "sebastian@phpunit.de", 193 | "role": "Developer" 194 | } 195 | ], 196 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 197 | "time": "2018-07-08T19:23:20+00:00" 198 | }, 199 | { 200 | "name": "phar-io/version", 201 | "version": "2.0.1", 202 | "source": { 203 | "type": "git", 204 | "url": "https://github.com/phar-io/version.git", 205 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 206 | }, 207 | "dist": { 208 | "type": "zip", 209 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 210 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 211 | "shasum": "" 212 | }, 213 | "require": { 214 | "php": "^5.6 || ^7.0" 215 | }, 216 | "type": "library", 217 | "autoload": { 218 | "classmap": [ 219 | "src/" 220 | ] 221 | }, 222 | "notification-url": "https://packagist.org/downloads/", 223 | "license": [ 224 | "BSD-3-Clause" 225 | ], 226 | "authors": [ 227 | { 228 | "name": "Arne Blankerts", 229 | "email": "arne@blankerts.de", 230 | "role": "Developer" 231 | }, 232 | { 233 | "name": "Sebastian Heuer", 234 | "email": "sebastian@phpeople.de", 235 | "role": "Developer" 236 | }, 237 | { 238 | "name": "Sebastian Bergmann", 239 | "email": "sebastian@phpunit.de", 240 | "role": "Developer" 241 | } 242 | ], 243 | "description": "Library for handling version information and constraints", 244 | "time": "2018-07-08T19:19:57+00:00" 245 | }, 246 | { 247 | "name": "phpdocumentor/reflection-common", 248 | "version": "1.0.1", 249 | "source": { 250 | "type": "git", 251 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 252 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 253 | }, 254 | "dist": { 255 | "type": "zip", 256 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 257 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 258 | "shasum": "" 259 | }, 260 | "require": { 261 | "php": ">=5.5" 262 | }, 263 | "require-dev": { 264 | "phpunit/phpunit": "^4.6" 265 | }, 266 | "type": "library", 267 | "extra": { 268 | "branch-alias": { 269 | "dev-master": "1.0.x-dev" 270 | } 271 | }, 272 | "autoload": { 273 | "psr-4": { 274 | "phpDocumentor\\Reflection\\": [ 275 | "src" 276 | ] 277 | } 278 | }, 279 | "notification-url": "https://packagist.org/downloads/", 280 | "license": [ 281 | "MIT" 282 | ], 283 | "authors": [ 284 | { 285 | "name": "Jaap van Otterdijk", 286 | "email": "opensource@ijaap.nl" 287 | } 288 | ], 289 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 290 | "homepage": "http://www.phpdoc.org", 291 | "keywords": [ 292 | "FQSEN", 293 | "phpDocumentor", 294 | "phpdoc", 295 | "reflection", 296 | "static analysis" 297 | ], 298 | "time": "2017-09-11T18:02:19+00:00" 299 | }, 300 | { 301 | "name": "phpdocumentor/reflection-docblock", 302 | "version": "4.3.0", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 306 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 311 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "php": "^7.0", 316 | "phpdocumentor/reflection-common": "^1.0.0", 317 | "phpdocumentor/type-resolver": "^0.4.0", 318 | "webmozart/assert": "^1.0" 319 | }, 320 | "require-dev": { 321 | "doctrine/instantiator": "~1.0.5", 322 | "mockery/mockery": "^1.0", 323 | "phpunit/phpunit": "^6.4" 324 | }, 325 | "type": "library", 326 | "extra": { 327 | "branch-alias": { 328 | "dev-master": "4.x-dev" 329 | } 330 | }, 331 | "autoload": { 332 | "psr-4": { 333 | "phpDocumentor\\Reflection\\": [ 334 | "src/" 335 | ] 336 | } 337 | }, 338 | "notification-url": "https://packagist.org/downloads/", 339 | "license": [ 340 | "MIT" 341 | ], 342 | "authors": [ 343 | { 344 | "name": "Mike van Riel", 345 | "email": "me@mikevanriel.com" 346 | } 347 | ], 348 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 349 | "time": "2017-11-30T07:14:17+00:00" 350 | }, 351 | { 352 | "name": "phpdocumentor/type-resolver", 353 | "version": "0.4.0", 354 | "source": { 355 | "type": "git", 356 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 357 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 358 | }, 359 | "dist": { 360 | "type": "zip", 361 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 362 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 363 | "shasum": "" 364 | }, 365 | "require": { 366 | "php": "^5.5 || ^7.0", 367 | "phpdocumentor/reflection-common": "^1.0" 368 | }, 369 | "require-dev": { 370 | "mockery/mockery": "^0.9.4", 371 | "phpunit/phpunit": "^5.2||^4.8.24" 372 | }, 373 | "type": "library", 374 | "extra": { 375 | "branch-alias": { 376 | "dev-master": "1.0.x-dev" 377 | } 378 | }, 379 | "autoload": { 380 | "psr-4": { 381 | "phpDocumentor\\Reflection\\": [ 382 | "src/" 383 | ] 384 | } 385 | }, 386 | "notification-url": "https://packagist.org/downloads/", 387 | "license": [ 388 | "MIT" 389 | ], 390 | "authors": [ 391 | { 392 | "name": "Mike van Riel", 393 | "email": "me@mikevanriel.com" 394 | } 395 | ], 396 | "time": "2017-07-14T14:27:02+00:00" 397 | }, 398 | { 399 | "name": "phpspec/prophecy", 400 | "version": "1.8.0", 401 | "source": { 402 | "type": "git", 403 | "url": "https://github.com/phpspec/prophecy.git", 404 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 405 | }, 406 | "dist": { 407 | "type": "zip", 408 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 409 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 410 | "shasum": "" 411 | }, 412 | "require": { 413 | "doctrine/instantiator": "^1.0.2", 414 | "php": "^5.3|^7.0", 415 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 416 | "sebastian/comparator": "^1.1|^2.0|^3.0", 417 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 418 | }, 419 | "require-dev": { 420 | "phpspec/phpspec": "^2.5|^3.2", 421 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 422 | }, 423 | "type": "library", 424 | "extra": { 425 | "branch-alias": { 426 | "dev-master": "1.8.x-dev" 427 | } 428 | }, 429 | "autoload": { 430 | "psr-0": { 431 | "Prophecy\\": "src/" 432 | } 433 | }, 434 | "notification-url": "https://packagist.org/downloads/", 435 | "license": [ 436 | "MIT" 437 | ], 438 | "authors": [ 439 | { 440 | "name": "Konstantin Kudryashov", 441 | "email": "ever.zet@gmail.com", 442 | "homepage": "http://everzet.com" 443 | }, 444 | { 445 | "name": "Marcello Duarte", 446 | "email": "marcello.duarte@gmail.com" 447 | } 448 | ], 449 | "description": "Highly opinionated mocking framework for PHP 5.3+", 450 | "homepage": "https://github.com/phpspec/prophecy", 451 | "keywords": [ 452 | "Double", 453 | "Dummy", 454 | "fake", 455 | "mock", 456 | "spy", 457 | "stub" 458 | ], 459 | "time": "2018-08-05T17:53:17+00:00" 460 | }, 461 | { 462 | "name": "phpunit/php-code-coverage", 463 | "version": "6.0.7", 464 | "source": { 465 | "type": "git", 466 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 467 | "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" 468 | }, 469 | "dist": { 470 | "type": "zip", 471 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", 472 | "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", 473 | "shasum": "" 474 | }, 475 | "require": { 476 | "ext-dom": "*", 477 | "ext-xmlwriter": "*", 478 | "php": "^7.1", 479 | "phpunit/php-file-iterator": "^2.0", 480 | "phpunit/php-text-template": "^1.2.1", 481 | "phpunit/php-token-stream": "^3.0", 482 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 483 | "sebastian/environment": "^3.1", 484 | "sebastian/version": "^2.0.1", 485 | "theseer/tokenizer": "^1.1" 486 | }, 487 | "require-dev": { 488 | "phpunit/phpunit": "^7.0" 489 | }, 490 | "suggest": { 491 | "ext-xdebug": "^2.6.0" 492 | }, 493 | "type": "library", 494 | "extra": { 495 | "branch-alias": { 496 | "dev-master": "6.0-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 | "role": "lead" 513 | } 514 | ], 515 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 516 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 517 | "keywords": [ 518 | "coverage", 519 | "testing", 520 | "xunit" 521 | ], 522 | "time": "2018-06-01T07:51:50+00:00" 523 | }, 524 | { 525 | "name": "phpunit/php-file-iterator", 526 | "version": "2.0.1", 527 | "source": { 528 | "type": "git", 529 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 530 | "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c" 531 | }, 532 | "dist": { 533 | "type": "zip", 534 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c", 535 | "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c", 536 | "shasum": "" 537 | }, 538 | "require": { 539 | "php": "^7.1" 540 | }, 541 | "type": "library", 542 | "extra": { 543 | "branch-alias": { 544 | "dev-master": "2.0.x-dev" 545 | } 546 | }, 547 | "autoload": { 548 | "classmap": [ 549 | "src/" 550 | ] 551 | }, 552 | "notification-url": "https://packagist.org/downloads/", 553 | "license": [ 554 | "BSD-3-Clause" 555 | ], 556 | "authors": [ 557 | { 558 | "name": "Sebastian Bergmann", 559 | "email": "sebastian@phpunit.de", 560 | "role": "lead" 561 | } 562 | ], 563 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 564 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 565 | "keywords": [ 566 | "filesystem", 567 | "iterator" 568 | ], 569 | "time": "2018-06-11T11:44:00+00:00" 570 | }, 571 | { 572 | "name": "phpunit/php-text-template", 573 | "version": "1.2.1", 574 | "source": { 575 | "type": "git", 576 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 577 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 578 | }, 579 | "dist": { 580 | "type": "zip", 581 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 582 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 583 | "shasum": "" 584 | }, 585 | "require": { 586 | "php": ">=5.3.3" 587 | }, 588 | "type": "library", 589 | "autoload": { 590 | "classmap": [ 591 | "src/" 592 | ] 593 | }, 594 | "notification-url": "https://packagist.org/downloads/", 595 | "license": [ 596 | "BSD-3-Clause" 597 | ], 598 | "authors": [ 599 | { 600 | "name": "Sebastian Bergmann", 601 | "email": "sebastian@phpunit.de", 602 | "role": "lead" 603 | } 604 | ], 605 | "description": "Simple template engine.", 606 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 607 | "keywords": [ 608 | "template" 609 | ], 610 | "time": "2015-06-21T13:50:34+00:00" 611 | }, 612 | { 613 | "name": "phpunit/php-timer", 614 | "version": "2.0.0", 615 | "source": { 616 | "type": "git", 617 | "url": "https://github.com/sebastianbergmann/php-timer.git", 618 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" 619 | }, 620 | "dist": { 621 | "type": "zip", 622 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", 623 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", 624 | "shasum": "" 625 | }, 626 | "require": { 627 | "php": "^7.1" 628 | }, 629 | "require-dev": { 630 | "phpunit/phpunit": "^7.0" 631 | }, 632 | "type": "library", 633 | "extra": { 634 | "branch-alias": { 635 | "dev-master": "2.0-dev" 636 | } 637 | }, 638 | "autoload": { 639 | "classmap": [ 640 | "src/" 641 | ] 642 | }, 643 | "notification-url": "https://packagist.org/downloads/", 644 | "license": [ 645 | "BSD-3-Clause" 646 | ], 647 | "authors": [ 648 | { 649 | "name": "Sebastian Bergmann", 650 | "email": "sebastian@phpunit.de", 651 | "role": "lead" 652 | } 653 | ], 654 | "description": "Utility class for timing", 655 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 656 | "keywords": [ 657 | "timer" 658 | ], 659 | "time": "2018-02-01T13:07:23+00:00" 660 | }, 661 | { 662 | "name": "phpunit/php-token-stream", 663 | "version": "3.0.0", 664 | "source": { 665 | "type": "git", 666 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 667 | "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" 668 | }, 669 | "dist": { 670 | "type": "zip", 671 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", 672 | "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", 673 | "shasum": "" 674 | }, 675 | "require": { 676 | "ext-tokenizer": "*", 677 | "php": "^7.1" 678 | }, 679 | "require-dev": { 680 | "phpunit/phpunit": "^7.0" 681 | }, 682 | "type": "library", 683 | "extra": { 684 | "branch-alias": { 685 | "dev-master": "3.0-dev" 686 | } 687 | }, 688 | "autoload": { 689 | "classmap": [ 690 | "src/" 691 | ] 692 | }, 693 | "notification-url": "https://packagist.org/downloads/", 694 | "license": [ 695 | "BSD-3-Clause" 696 | ], 697 | "authors": [ 698 | { 699 | "name": "Sebastian Bergmann", 700 | "email": "sebastian@phpunit.de" 701 | } 702 | ], 703 | "description": "Wrapper around PHP's tokenizer extension.", 704 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 705 | "keywords": [ 706 | "tokenizer" 707 | ], 708 | "time": "2018-02-01T13:16:43+00:00" 709 | }, 710 | { 711 | "name": "phpunit/phpunit", 712 | "version": "7.3.5", 713 | "source": { 714 | "type": "git", 715 | "url": "https://github.com/sebastianbergmann/phpunit.git", 716 | "reference": "7b331efabbb628c518c408fdfcaf571156775de2" 717 | }, 718 | "dist": { 719 | "type": "zip", 720 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b331efabbb628c518c408fdfcaf571156775de2", 721 | "reference": "7b331efabbb628c518c408fdfcaf571156775de2", 722 | "shasum": "" 723 | }, 724 | "require": { 725 | "doctrine/instantiator": "^1.1", 726 | "ext-dom": "*", 727 | "ext-json": "*", 728 | "ext-libxml": "*", 729 | "ext-mbstring": "*", 730 | "ext-xml": "*", 731 | "myclabs/deep-copy": "^1.7", 732 | "phar-io/manifest": "^1.0.2", 733 | "phar-io/version": "^2.0", 734 | "php": "^7.1", 735 | "phpspec/prophecy": "^1.7", 736 | "phpunit/php-code-coverage": "^6.0.7", 737 | "phpunit/php-file-iterator": "^2.0.1", 738 | "phpunit/php-text-template": "^1.2.1", 739 | "phpunit/php-timer": "^2.0", 740 | "sebastian/comparator": "^3.0", 741 | "sebastian/diff": "^3.0", 742 | "sebastian/environment": "^3.1", 743 | "sebastian/exporter": "^3.1", 744 | "sebastian/global-state": "^2.0", 745 | "sebastian/object-enumerator": "^3.0.3", 746 | "sebastian/resource-operations": "^1.0", 747 | "sebastian/version": "^2.0.1" 748 | }, 749 | "conflict": { 750 | "phpunit/phpunit-mock-objects": "*" 751 | }, 752 | "require-dev": { 753 | "ext-pdo": "*" 754 | }, 755 | "suggest": { 756 | "ext-soap": "*", 757 | "ext-xdebug": "*", 758 | "phpunit/php-invoker": "^2.0" 759 | }, 760 | "bin": [ 761 | "phpunit" 762 | ], 763 | "type": "library", 764 | "extra": { 765 | "branch-alias": { 766 | "dev-master": "7.3-dev" 767 | } 768 | }, 769 | "autoload": { 770 | "classmap": [ 771 | "src/" 772 | ] 773 | }, 774 | "notification-url": "https://packagist.org/downloads/", 775 | "license": [ 776 | "BSD-3-Clause" 777 | ], 778 | "authors": [ 779 | { 780 | "name": "Sebastian Bergmann", 781 | "email": "sebastian@phpunit.de", 782 | "role": "lead" 783 | } 784 | ], 785 | "description": "The PHP Unit Testing framework.", 786 | "homepage": "https://phpunit.de/", 787 | "keywords": [ 788 | "phpunit", 789 | "testing", 790 | "xunit" 791 | ], 792 | "time": "2018-09-08T15:14:29+00:00" 793 | }, 794 | { 795 | "name": "sebastian/code-unit-reverse-lookup", 796 | "version": "1.0.1", 797 | "source": { 798 | "type": "git", 799 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 800 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 801 | }, 802 | "dist": { 803 | "type": "zip", 804 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 805 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 806 | "shasum": "" 807 | }, 808 | "require": { 809 | "php": "^5.6 || ^7.0" 810 | }, 811 | "require-dev": { 812 | "phpunit/phpunit": "^5.7 || ^6.0" 813 | }, 814 | "type": "library", 815 | "extra": { 816 | "branch-alias": { 817 | "dev-master": "1.0.x-dev" 818 | } 819 | }, 820 | "autoload": { 821 | "classmap": [ 822 | "src/" 823 | ] 824 | }, 825 | "notification-url": "https://packagist.org/downloads/", 826 | "license": [ 827 | "BSD-3-Clause" 828 | ], 829 | "authors": [ 830 | { 831 | "name": "Sebastian Bergmann", 832 | "email": "sebastian@phpunit.de" 833 | } 834 | ], 835 | "description": "Looks up which function or method a line of code belongs to", 836 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 837 | "time": "2017-03-04T06:30:41+00:00" 838 | }, 839 | { 840 | "name": "sebastian/comparator", 841 | "version": "3.0.2", 842 | "source": { 843 | "type": "git", 844 | "url": "https://github.com/sebastianbergmann/comparator.git", 845 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 846 | }, 847 | "dist": { 848 | "type": "zip", 849 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 850 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 851 | "shasum": "" 852 | }, 853 | "require": { 854 | "php": "^7.1", 855 | "sebastian/diff": "^3.0", 856 | "sebastian/exporter": "^3.1" 857 | }, 858 | "require-dev": { 859 | "phpunit/phpunit": "^7.1" 860 | }, 861 | "type": "library", 862 | "extra": { 863 | "branch-alias": { 864 | "dev-master": "3.0-dev" 865 | } 866 | }, 867 | "autoload": { 868 | "classmap": [ 869 | "src/" 870 | ] 871 | }, 872 | "notification-url": "https://packagist.org/downloads/", 873 | "license": [ 874 | "BSD-3-Clause" 875 | ], 876 | "authors": [ 877 | { 878 | "name": "Jeff Welch", 879 | "email": "whatthejeff@gmail.com" 880 | }, 881 | { 882 | "name": "Volker Dusch", 883 | "email": "github@wallbash.com" 884 | }, 885 | { 886 | "name": "Bernhard Schussek", 887 | "email": "bschussek@2bepublished.at" 888 | }, 889 | { 890 | "name": "Sebastian Bergmann", 891 | "email": "sebastian@phpunit.de" 892 | } 893 | ], 894 | "description": "Provides the functionality to compare PHP values for equality", 895 | "homepage": "https://github.com/sebastianbergmann/comparator", 896 | "keywords": [ 897 | "comparator", 898 | "compare", 899 | "equality" 900 | ], 901 | "time": "2018-07-12T15:12:46+00:00" 902 | }, 903 | { 904 | "name": "sebastian/diff", 905 | "version": "3.0.1", 906 | "source": { 907 | "type": "git", 908 | "url": "https://github.com/sebastianbergmann/diff.git", 909 | "reference": "366541b989927187c4ca70490a35615d3fef2dce" 910 | }, 911 | "dist": { 912 | "type": "zip", 913 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", 914 | "reference": "366541b989927187c4ca70490a35615d3fef2dce", 915 | "shasum": "" 916 | }, 917 | "require": { 918 | "php": "^7.1" 919 | }, 920 | "require-dev": { 921 | "phpunit/phpunit": "^7.0", 922 | "symfony/process": "^2 || ^3.3 || ^4" 923 | }, 924 | "type": "library", 925 | "extra": { 926 | "branch-alias": { 927 | "dev-master": "3.0-dev" 928 | } 929 | }, 930 | "autoload": { 931 | "classmap": [ 932 | "src/" 933 | ] 934 | }, 935 | "notification-url": "https://packagist.org/downloads/", 936 | "license": [ 937 | "BSD-3-Clause" 938 | ], 939 | "authors": [ 940 | { 941 | "name": "Kore Nordmann", 942 | "email": "mail@kore-nordmann.de" 943 | }, 944 | { 945 | "name": "Sebastian Bergmann", 946 | "email": "sebastian@phpunit.de" 947 | } 948 | ], 949 | "description": "Diff implementation", 950 | "homepage": "https://github.com/sebastianbergmann/diff", 951 | "keywords": [ 952 | "diff", 953 | "udiff", 954 | "unidiff", 955 | "unified diff" 956 | ], 957 | "time": "2018-06-10T07:54:39+00:00" 958 | }, 959 | { 960 | "name": "sebastian/environment", 961 | "version": "3.1.0", 962 | "source": { 963 | "type": "git", 964 | "url": "https://github.com/sebastianbergmann/environment.git", 965 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 966 | }, 967 | "dist": { 968 | "type": "zip", 969 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 970 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 971 | "shasum": "" 972 | }, 973 | "require": { 974 | "php": "^7.0" 975 | }, 976 | "require-dev": { 977 | "phpunit/phpunit": "^6.1" 978 | }, 979 | "type": "library", 980 | "extra": { 981 | "branch-alias": { 982 | "dev-master": "3.1.x-dev" 983 | } 984 | }, 985 | "autoload": { 986 | "classmap": [ 987 | "src/" 988 | ] 989 | }, 990 | "notification-url": "https://packagist.org/downloads/", 991 | "license": [ 992 | "BSD-3-Clause" 993 | ], 994 | "authors": [ 995 | { 996 | "name": "Sebastian Bergmann", 997 | "email": "sebastian@phpunit.de" 998 | } 999 | ], 1000 | "description": "Provides functionality to handle HHVM/PHP environments", 1001 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1002 | "keywords": [ 1003 | "Xdebug", 1004 | "environment", 1005 | "hhvm" 1006 | ], 1007 | "time": "2017-07-01T08:51:00+00:00" 1008 | }, 1009 | { 1010 | "name": "sebastian/exporter", 1011 | "version": "3.1.0", 1012 | "source": { 1013 | "type": "git", 1014 | "url": "https://github.com/sebastianbergmann/exporter.git", 1015 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 1016 | }, 1017 | "dist": { 1018 | "type": "zip", 1019 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 1020 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 1021 | "shasum": "" 1022 | }, 1023 | "require": { 1024 | "php": "^7.0", 1025 | "sebastian/recursion-context": "^3.0" 1026 | }, 1027 | "require-dev": { 1028 | "ext-mbstring": "*", 1029 | "phpunit/phpunit": "^6.0" 1030 | }, 1031 | "type": "library", 1032 | "extra": { 1033 | "branch-alias": { 1034 | "dev-master": "3.1.x-dev" 1035 | } 1036 | }, 1037 | "autoload": { 1038 | "classmap": [ 1039 | "src/" 1040 | ] 1041 | }, 1042 | "notification-url": "https://packagist.org/downloads/", 1043 | "license": [ 1044 | "BSD-3-Clause" 1045 | ], 1046 | "authors": [ 1047 | { 1048 | "name": "Jeff Welch", 1049 | "email": "whatthejeff@gmail.com" 1050 | }, 1051 | { 1052 | "name": "Volker Dusch", 1053 | "email": "github@wallbash.com" 1054 | }, 1055 | { 1056 | "name": "Bernhard Schussek", 1057 | "email": "bschussek@2bepublished.at" 1058 | }, 1059 | { 1060 | "name": "Sebastian Bergmann", 1061 | "email": "sebastian@phpunit.de" 1062 | }, 1063 | { 1064 | "name": "Adam Harvey", 1065 | "email": "aharvey@php.net" 1066 | } 1067 | ], 1068 | "description": "Provides the functionality to export PHP variables for visualization", 1069 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1070 | "keywords": [ 1071 | "export", 1072 | "exporter" 1073 | ], 1074 | "time": "2017-04-03T13:19:02+00:00" 1075 | }, 1076 | { 1077 | "name": "sebastian/global-state", 1078 | "version": "2.0.0", 1079 | "source": { 1080 | "type": "git", 1081 | "url": "https://github.com/sebastianbergmann/global-state.git", 1082 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1083 | }, 1084 | "dist": { 1085 | "type": "zip", 1086 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1087 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1088 | "shasum": "" 1089 | }, 1090 | "require": { 1091 | "php": "^7.0" 1092 | }, 1093 | "require-dev": { 1094 | "phpunit/phpunit": "^6.0" 1095 | }, 1096 | "suggest": { 1097 | "ext-uopz": "*" 1098 | }, 1099 | "type": "library", 1100 | "extra": { 1101 | "branch-alias": { 1102 | "dev-master": "2.0-dev" 1103 | } 1104 | }, 1105 | "autoload": { 1106 | "classmap": [ 1107 | "src/" 1108 | ] 1109 | }, 1110 | "notification-url": "https://packagist.org/downloads/", 1111 | "license": [ 1112 | "BSD-3-Clause" 1113 | ], 1114 | "authors": [ 1115 | { 1116 | "name": "Sebastian Bergmann", 1117 | "email": "sebastian@phpunit.de" 1118 | } 1119 | ], 1120 | "description": "Snapshotting of global state", 1121 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1122 | "keywords": [ 1123 | "global state" 1124 | ], 1125 | "time": "2017-04-27T15:39:26+00:00" 1126 | }, 1127 | { 1128 | "name": "sebastian/object-enumerator", 1129 | "version": "3.0.3", 1130 | "source": { 1131 | "type": "git", 1132 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1133 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1134 | }, 1135 | "dist": { 1136 | "type": "zip", 1137 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1138 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1139 | "shasum": "" 1140 | }, 1141 | "require": { 1142 | "php": "^7.0", 1143 | "sebastian/object-reflector": "^1.1.1", 1144 | "sebastian/recursion-context": "^3.0" 1145 | }, 1146 | "require-dev": { 1147 | "phpunit/phpunit": "^6.0" 1148 | }, 1149 | "type": "library", 1150 | "extra": { 1151 | "branch-alias": { 1152 | "dev-master": "3.0.x-dev" 1153 | } 1154 | }, 1155 | "autoload": { 1156 | "classmap": [ 1157 | "src/" 1158 | ] 1159 | }, 1160 | "notification-url": "https://packagist.org/downloads/", 1161 | "license": [ 1162 | "BSD-3-Clause" 1163 | ], 1164 | "authors": [ 1165 | { 1166 | "name": "Sebastian Bergmann", 1167 | "email": "sebastian@phpunit.de" 1168 | } 1169 | ], 1170 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1171 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1172 | "time": "2017-08-03T12:35:26+00:00" 1173 | }, 1174 | { 1175 | "name": "sebastian/object-reflector", 1176 | "version": "1.1.1", 1177 | "source": { 1178 | "type": "git", 1179 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1180 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1181 | }, 1182 | "dist": { 1183 | "type": "zip", 1184 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1185 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1186 | "shasum": "" 1187 | }, 1188 | "require": { 1189 | "php": "^7.0" 1190 | }, 1191 | "require-dev": { 1192 | "phpunit/phpunit": "^6.0" 1193 | }, 1194 | "type": "library", 1195 | "extra": { 1196 | "branch-alias": { 1197 | "dev-master": "1.1-dev" 1198 | } 1199 | }, 1200 | "autoload": { 1201 | "classmap": [ 1202 | "src/" 1203 | ] 1204 | }, 1205 | "notification-url": "https://packagist.org/downloads/", 1206 | "license": [ 1207 | "BSD-3-Clause" 1208 | ], 1209 | "authors": [ 1210 | { 1211 | "name": "Sebastian Bergmann", 1212 | "email": "sebastian@phpunit.de" 1213 | } 1214 | ], 1215 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1216 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1217 | "time": "2017-03-29T09:07:27+00:00" 1218 | }, 1219 | { 1220 | "name": "sebastian/recursion-context", 1221 | "version": "3.0.0", 1222 | "source": { 1223 | "type": "git", 1224 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1225 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1226 | }, 1227 | "dist": { 1228 | "type": "zip", 1229 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1230 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1231 | "shasum": "" 1232 | }, 1233 | "require": { 1234 | "php": "^7.0" 1235 | }, 1236 | "require-dev": { 1237 | "phpunit/phpunit": "^6.0" 1238 | }, 1239 | "type": "library", 1240 | "extra": { 1241 | "branch-alias": { 1242 | "dev-master": "3.0.x-dev" 1243 | } 1244 | }, 1245 | "autoload": { 1246 | "classmap": [ 1247 | "src/" 1248 | ] 1249 | }, 1250 | "notification-url": "https://packagist.org/downloads/", 1251 | "license": [ 1252 | "BSD-3-Clause" 1253 | ], 1254 | "authors": [ 1255 | { 1256 | "name": "Jeff Welch", 1257 | "email": "whatthejeff@gmail.com" 1258 | }, 1259 | { 1260 | "name": "Sebastian Bergmann", 1261 | "email": "sebastian@phpunit.de" 1262 | }, 1263 | { 1264 | "name": "Adam Harvey", 1265 | "email": "aharvey@php.net" 1266 | } 1267 | ], 1268 | "description": "Provides functionality to recursively process PHP variables", 1269 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1270 | "time": "2017-03-03T06:23:57+00:00" 1271 | }, 1272 | { 1273 | "name": "sebastian/resource-operations", 1274 | "version": "1.0.0", 1275 | "source": { 1276 | "type": "git", 1277 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1278 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1279 | }, 1280 | "dist": { 1281 | "type": "zip", 1282 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1283 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1284 | "shasum": "" 1285 | }, 1286 | "require": { 1287 | "php": ">=5.6.0" 1288 | }, 1289 | "type": "library", 1290 | "extra": { 1291 | "branch-alias": { 1292 | "dev-master": "1.0.x-dev" 1293 | } 1294 | }, 1295 | "autoload": { 1296 | "classmap": [ 1297 | "src/" 1298 | ] 1299 | }, 1300 | "notification-url": "https://packagist.org/downloads/", 1301 | "license": [ 1302 | "BSD-3-Clause" 1303 | ], 1304 | "authors": [ 1305 | { 1306 | "name": "Sebastian Bergmann", 1307 | "email": "sebastian@phpunit.de" 1308 | } 1309 | ], 1310 | "description": "Provides a list of PHP built-in functions that operate on resources", 1311 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1312 | "time": "2015-07-28T20:34:47+00:00" 1313 | }, 1314 | { 1315 | "name": "sebastian/version", 1316 | "version": "2.0.1", 1317 | "source": { 1318 | "type": "git", 1319 | "url": "https://github.com/sebastianbergmann/version.git", 1320 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1321 | }, 1322 | "dist": { 1323 | "type": "zip", 1324 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1325 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1326 | "shasum": "" 1327 | }, 1328 | "require": { 1329 | "php": ">=5.6" 1330 | }, 1331 | "type": "library", 1332 | "extra": { 1333 | "branch-alias": { 1334 | "dev-master": "2.0.x-dev" 1335 | } 1336 | }, 1337 | "autoload": { 1338 | "classmap": [ 1339 | "src/" 1340 | ] 1341 | }, 1342 | "notification-url": "https://packagist.org/downloads/", 1343 | "license": [ 1344 | "BSD-3-Clause" 1345 | ], 1346 | "authors": [ 1347 | { 1348 | "name": "Sebastian Bergmann", 1349 | "email": "sebastian@phpunit.de", 1350 | "role": "lead" 1351 | } 1352 | ], 1353 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1354 | "homepage": "https://github.com/sebastianbergmann/version", 1355 | "time": "2016-10-03T07:35:21+00:00" 1356 | }, 1357 | { 1358 | "name": "theseer/tokenizer", 1359 | "version": "1.1.0", 1360 | "source": { 1361 | "type": "git", 1362 | "url": "https://github.com/theseer/tokenizer.git", 1363 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 1364 | }, 1365 | "dist": { 1366 | "type": "zip", 1367 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1368 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1369 | "shasum": "" 1370 | }, 1371 | "require": { 1372 | "ext-dom": "*", 1373 | "ext-tokenizer": "*", 1374 | "ext-xmlwriter": "*", 1375 | "php": "^7.0" 1376 | }, 1377 | "type": "library", 1378 | "autoload": { 1379 | "classmap": [ 1380 | "src/" 1381 | ] 1382 | }, 1383 | "notification-url": "https://packagist.org/downloads/", 1384 | "license": [ 1385 | "BSD-3-Clause" 1386 | ], 1387 | "authors": [ 1388 | { 1389 | "name": "Arne Blankerts", 1390 | "email": "arne@blankerts.de", 1391 | "role": "Developer" 1392 | } 1393 | ], 1394 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1395 | "time": "2017-04-07T12:08:54+00:00" 1396 | }, 1397 | { 1398 | "name": "webmozart/assert", 1399 | "version": "1.3.0", 1400 | "source": { 1401 | "type": "git", 1402 | "url": "https://github.com/webmozart/assert.git", 1403 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a" 1404 | }, 1405 | "dist": { 1406 | "type": "zip", 1407 | "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", 1408 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a", 1409 | "shasum": "" 1410 | }, 1411 | "require": { 1412 | "php": "^5.3.3 || ^7.0" 1413 | }, 1414 | "require-dev": { 1415 | "phpunit/phpunit": "^4.6", 1416 | "sebastian/version": "^1.0.1" 1417 | }, 1418 | "type": "library", 1419 | "extra": { 1420 | "branch-alias": { 1421 | "dev-master": "1.3-dev" 1422 | } 1423 | }, 1424 | "autoload": { 1425 | "psr-4": { 1426 | "Webmozart\\Assert\\": "src/" 1427 | } 1428 | }, 1429 | "notification-url": "https://packagist.org/downloads/", 1430 | "license": [ 1431 | "MIT" 1432 | ], 1433 | "authors": [ 1434 | { 1435 | "name": "Bernhard Schussek", 1436 | "email": "bschussek@gmail.com" 1437 | } 1438 | ], 1439 | "description": "Assertions to validate method input/output with nice error messages.", 1440 | "keywords": [ 1441 | "assert", 1442 | "check", 1443 | "validate" 1444 | ], 1445 | "time": "2018-01-29T19:49:41+00:00" 1446 | } 1447 | ], 1448 | "aliases": [], 1449 | "minimum-stability": "stable", 1450 | "stability-flags": [], 1451 | "prefer-stable": false, 1452 | "prefer-lowest": false, 1453 | "platform": [], 1454 | "platform-dev": [] 1455 | } 1456 | --------------------------------------------------------------------------------