├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── config └── database-hashing.php ├── phpunit.xml ├── src ├── HashingFacade.php ├── HashingHelper.php ├── HashingServiceProvider.php └── traits │ └── HasHashedAttributes.php └── tests ├── TestCase.php ├── hashing ├── HashedAttributesTraitTest.php ├── HashingFacadeTest.php ├── HashingHelperTest.php └── fixtures │ └── HashingTestModel.php └── migrations └── 2019_03_03_000000_create_test_model_table.php /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | /.idea 7 | /.vscode 8 | /.vagrant 9 | Homestead.json 10 | Homestead.yaml 11 | npm-debug.log 12 | yarn-error.log 13 | .env 14 | .ide_helper.php 15 | .DS_Store 16 | .phpunit.result.cache -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | matrix: 4 | include: 5 | - php: 7.2 6 | env: LARAVEL=55 7 | - php: 7.2 8 | env: LARAVEL=56 9 | - php: 7.2 10 | env: LARAVEL=57 11 | - php: 7.2 12 | env: LARAVEL=58 13 | - php: 7.3 14 | env: LARAVEL=55 15 | - php: 7.3 16 | env: LARAVEL=56 17 | - php: 7.3 18 | env: LARAVEL=57 19 | - php: 7.3 20 | env: LARAVEL=58 21 | 22 | before_script: 23 | - composer install 24 | 25 | script: 26 | # Packages: Laravel 5.5.x 27 | - if [ "$LARAVEL" = "55" ] ; then composer require "phpunit/phpunit:6.*" --no-update ; fi 28 | - if [ "$LARAVEL" = "55" ] ; then composer require "laravel/framework:5.5.*" --no-update ; fi 29 | - if [ "$LARAVEL" = "55" ] ; then composer require "orchestra/database:3.5.*" --no-update ; fi 30 | - if [ "$LARAVEL" = "55" ] ; then composer require "orchestra/testbench:3.5.*" --no-update ; fi 31 | # Packages: Laravel 5.6.x 32 | - if [ "$LARAVEL" = "56" ] ; then composer require "phpunit/phpunit:7.*" --no-update ; fi 33 | - if [ "$LARAVEL" = "56" ] ; then composer require "laravel/framework:5.6.*" --no-update ; fi 34 | - if [ "$LARAVEL" = "56" ] ; then composer require "orchestra/database:3.6.*" --no-update ; fi 35 | - if [ "$LARAVEL" = "56" ] ; then composer require "orchestra/testbench:3.6.*" --no-update ; fi 36 | # Packages: Laravel 5.7.x 37 | - if [ "$LARAVEL" = "57" ] ; then composer require "phpunit/phpunit:7.*" --no-update ; fi 38 | - if [ "$LARAVEL" = "57" ] ; then composer require "laravel/framework:5.7.*" --no-update ; fi 39 | - if [ "$LARAVEL" = "57" ] ; then composer require "orchestra/database:3.7.*" --no-update ; fi 40 | - if [ "$LARAVEL" = "57" ] ; then composer require "orchestra/testbench:3.7.*" --no-update ; fi 41 | # Packages: Laravel 5.8.x 42 | - if [ "$LARAVEL" = "58" ] ; then composer require "phpunit/phpunit:8.*" --no-update ; fi 43 | - if [ "$LARAVEL" = "58" ] ; then composer require "laravel/framework:5.8.*" --no-update ; fi 44 | - if [ "$LARAVEL" = "58" ] ; then composer require "orchestra/database:3.8.*" --no-update ; fi 45 | - if [ "$LARAVEL" = "58" ] ; then composer require "orchestra/testbench:3.8.*" --no-update ; fi 46 | # Packages: Update 47 | - composer update --prefer-source --no-interaction 48 | # Tests: Run 49 | - php vendor/phpunit/phpunit/phpunit # use the phpunit specified in the composer.json so local and ci use the same version 50 | 51 | notifications: 52 | email: false -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Laravel 5.5+ Database Hashing package 2 | =============== 3 | _A package for automatically hashing Eloquent attributes!_ 4 | 5 | [![Build Status](https://travis-ci.org/JackNoordhuis/laravel-database-hashing.svg?branch=master)](https://travis-ci.org/JackNoordhuis/laravel-database-hashing) 6 | 7 | The purpose of this library is to create a set-it-and-forget-it package that can be installed without much effort to hash 8 | eloquent model attributes stored in your database tables. 9 | 10 | When enabled, this package will automatically hash the data assigned to attributes that you've specified as they are updated. 11 | This allows you to hide the plain text value of attributes and maintain the ability search the database for 12 | the value (the same input data will always provide the same hash). 13 | 14 | All data hashed by this package will have an application specific salt which is specified in the configuration or environment 15 | files, so hashing the same data with a different salt in another application will result in a different output. This adds 16 | layer of complexity/protection against attackers who try to reconstruct your data by attempting to brute force a hash. 17 | If this is not enough, this package also supports providing a secondary salt on top of the application salt, but this cannot 18 | be configured to automatically apply to attributes out of the box. 19 | 20 | ## Installation 21 | 22 | ### Step 1: Composer 23 | 24 | Via command line: 25 | ```bash 26 | $ composer require jacknoordhuis/laravel-database-hashing ^2.0 27 | ``` 28 | Or add the package to your `composer.json`: 29 | ```json 30 | { 31 | "require": { 32 | "jacknoordhuis/laravel-database-hashing": "^2.0" 33 | } 34 | } 35 | ``` 36 | 37 | ### Step 2: Enable the package 38 | 39 | This package implements Laravel 5.5's package auto-discovery feature. After you install it the package provider and facade 40 | are registered automatically. 41 | 42 | If you would like to explicitly declare the provider and/or alias, you can do so by first adding the service provider to 43 | your `config/app.php` file: 44 | ```php 45 | 'providers' => [ 46 | // 47 | \jacknoordhuis\database\hashing\HashingServiceProvider::class, 48 | ]; 49 | ``` 50 | And then add the alias to your `config/app.php` file: 51 | ```php 52 | 'aliases' => [ 53 | // 54 | 'DatabaseHashing' => \jacknoordhuis\database\hashing\HashingFacade::class, 55 | ]; 56 | ``` 57 | 58 | ### Step 3: Configure the package 59 | 60 | Publish the package config file: 61 | ```bash 62 | $ php artisan vendor:publish --provider="jacknoordhuis\database\hashing\HashingServiceProvider" 63 | ``` 64 | You may now enable automatic hashing of eloquent models by editing the `config/database-hashing.php` file: 65 | ```php 66 | return [ 67 | "enabled" => env("DB_HASHING_ENABLED", true), 68 | ]; 69 | ``` 70 | Or simply setting the the `DB_HASHING_ENABLED` environment variable to true, via the Laravel `.env` file or hosting environment. 71 | ```dotenv 72 | DB_HASHING_ENABLED=true 73 | ``` 74 | 75 | ## Usage 76 | 77 | Use the `HasHashedAttributes` trait in any eloquent model that you wish to apply automatic attribute hashing to and define 78 | a `protected $hashing` array containing an array of the attributes to automatically hash. 79 | 80 | For example: 81 | ```php 82 | use jacknoordhuis\database\hashing\traits\HasHashedAttributes; 83 | 84 | class User extends Model 85 | { 86 | use HasHashedAttributes; 87 | 88 | /** 89 | * The attributes that should be hashed when set. 90 | * 91 | * @var array 92 | */ 93 | protected $hashing = [ 94 | 'username_lookup', 95 | ]; 96 | } 97 | ``` 98 | 99 | ### Looking up hashed values 100 | 101 | You can lookup hashed values in your database tables by simply hashing the value you're searching for, as the resulting 102 | hash will always be the same. 103 | ```php 104 | $user->username_lookup = $request->get('username'); //the username_lookup attribute will be automatically hashed 105 | 106 | 107 | //when our user tries to login we just search the database for the hashed value of their username 108 | $user = User::where('username_lookup', DatabaseHashing::create($request->get("username"))->first(); 109 | ``` 110 | 111 | You can also optionally provide a salt modifier when hashing data directly, which adds another 112 | level of complexity/security on top of the application-level salt. 113 | ```php 114 | //with a salt modifier so we can only ever re-create the hash when the user provides their email or we could store an 115 | //encrypted copy ourselves with another package 116 | $user->username_lookup = $request->get('username'); //set the attribute, then hash manually because we use a modifier 117 | $user->hashAttribute('username_lookup', $request->get('username')); //this time add the plain text email as a salt modifier 118 | 119 | 120 | //when a user provides their email when logging in, we can replicate the hash and search for the user in the database. 121 | $user = User::where('username_lookup', DatabaseHashing::create($request->get("username"), $request->get("email")))->first(); 122 | ``` 123 | 124 | ## FAQ's 125 | 126 | ### Can I manually hash arbitrary data? 127 | 128 | Yes! You can manually hash any string using the `DatabaseHashing::create()` global facade. 129 | 130 | For example: 131 | 132 | ```php 133 | //hash with only application salt 134 | $hashedEmail = DatabaseHashing::create(Input::get('email')); 135 | 136 | //hash with application salt AND salt modifier 137 | $hashedEmail = DatabaseHashing::create(Input::get("email"), Input::get('password')); 138 | ``` 139 | 140 | ### Can I hash all my model data? 141 | 142 | No! The hashing process is irreversible, meaning it should only be used for creating (pseudonymous) identifiers so that 143 | it is still possible to look up data in your database. If you want to *encrypt* your data use a package like 144 | [laravel-database-encryption](https://github.com/austinheap/laravel-database-encryption). 145 | 146 | ### Should I hash numeric auto-incrementing identifiers? 147 | 148 | Probably not. If all data stored in your database is encrypted or hashed then the numeric identifier is effectively anonymous 149 | (it's really pseudonymous) so there is no way to associate any human readable data with the identifier. There are other 150 | reasons for not hashing or encrypting the primary key in your database, and you can read about those [here](https://stackoverflow.com/a/34423898). 151 | 152 | ### Compatibility with the laravel-database-encryption package 153 | 154 | By default these two packages will conflict but we can get around this by implementing our own `setAttribute()` method that 155 | calls both the packages implementations as well: 156 | 157 | ```php 158 | class User extends Authenticatable 159 | { 160 | use Notifiable, HasEncryptedAttributes, HasHashedAttributes { 161 | HasEncryptedAttributes::setAttribute as setEncryptedAttribute; 162 | HasHashedAttributes::setAttribute as setHashedAttribute; 163 | } 164 | 165 | protected $fillable = [ 166 | 'name', 'email', 'email_lookup', 'password', 167 | ]; 168 | 169 | protected $hidden = [ 170 | 'password', 'remember_token', 171 | ]; 172 | 173 | protected $encrypted = [ 174 | 'name', 'email', 175 | ]; 176 | 177 | protected $hashing = [ 178 | 'email_lookup', 179 | ]; 180 | 181 | /** 182 | * Overwrite the method so we can attempt to encrypt OR hash an 183 | * attribute without the traits colliding. 184 | * 185 | * @param string $key 186 | * @param mixed $value 187 | */ 188 | public function setAttribute($key, $value) 189 | { 190 | $this->setEncryptedAttribute($key, $value); //attempt to encrypt the attribute 191 | 192 | $current = $this->attributes[$key] ?? null; //fetch the current value of the attribute 193 | if($current === $value) { //check to make sure the attribute wasn't modified (we will never hash an encrypted attribute) 194 | $this->setHashedAttribute($key, $value); //attempt to hash the attribute 195 | } 196 | } 197 | } 198 | ``` 199 | 200 | This can be extracted into it's own trait if it is needed across multiple models in your project. This same approach can 201 | also be used to make any package that implements the `setAttribute()` method on models compatible. -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jacknoordhuis/laravel-database-hashing", 3 | "description": "A package for automatically hashing Eloquent attributes in Laravel 5.5+.", 4 | "homepage": "https://github.com/JackNoordhuis/laravel-database-hashing", 5 | "license": "LGPL-3.0-or-later", 6 | "authors": [ 7 | { 8 | "name": "Jack Noordhuis", 9 | "email": "me@jacknoordhuis.net", 10 | "homepage": "https://github.com/JackNoordhuis", 11 | "role": "Developer" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=7.2.0", 16 | "laravel/framework": "5.5.*|5.6.*|5.7.*|5.8.*" 17 | }, 18 | "require-dev": { 19 | "phpunit/phpunit": "~6.0|^7.0|^8", 20 | "orchestra/testbench": "^3.8" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "jacknoordhuis\\database\\hashing\\": "src" 25 | } 26 | }, 27 | "autoload-dev": { 28 | "psr-4": { 29 | "jacknoordhuis\\tests\\database\\hashing\\": "tests/hashing" 30 | }, 31 | "files": [ 32 | "tests/TestCase.php" 33 | ] 34 | }, 35 | "minimum-stability": "dev", 36 | "prefer-stable": true, 37 | "extra": { 38 | "laravel": { 39 | "providers": [ 40 | "jacknoordhuis\\database\\hashing\\HashingServiceProvider" 41 | ], 42 | "aliases": { 43 | "DatabaseHashing": "jacknoordhuis\\database\\hashing\\HashingFacade" 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "9f4169179fdecde57acd4737ce24467c", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "v1.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 20 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "^6.2" 28 | }, 29 | "type": "library", 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "1.3.x-dev" 33 | } 34 | }, 35 | "autoload": { 36 | "psr-4": { 37 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 38 | } 39 | }, 40 | "notification-url": "https://packagist.org/downloads/", 41 | "license": [ 42 | "MIT" 43 | ], 44 | "authors": [ 45 | { 46 | "name": "Roman Borschel", 47 | "email": "roman@code-factory.org" 48 | }, 49 | { 50 | "name": "Benjamin Eberlei", 51 | "email": "kontakt@beberlei.de" 52 | }, 53 | { 54 | "name": "Guilherme Blanco", 55 | "email": "guilhermeblanco@gmail.com" 56 | }, 57 | { 58 | "name": "Jonathan Wage", 59 | "email": "jonwage@gmail.com" 60 | }, 61 | { 62 | "name": "Johannes Schmitt", 63 | "email": "schmittjoh@gmail.com" 64 | } 65 | ], 66 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 67 | "homepage": "http://www.doctrine-project.org", 68 | "keywords": [ 69 | "inflection", 70 | "pluralize", 71 | "singularize", 72 | "string" 73 | ], 74 | "time": "2018-01-09T20:05:19+00:00" 75 | }, 76 | { 77 | "name": "doctrine/lexer", 78 | "version": "v1.0.1", 79 | "source": { 80 | "type": "git", 81 | "url": "https://github.com/doctrine/lexer.git", 82 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 83 | }, 84 | "dist": { 85 | "type": "zip", 86 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 87 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 88 | "shasum": "" 89 | }, 90 | "require": { 91 | "php": ">=5.3.2" 92 | }, 93 | "type": "library", 94 | "extra": { 95 | "branch-alias": { 96 | "dev-master": "1.0.x-dev" 97 | } 98 | }, 99 | "autoload": { 100 | "psr-0": { 101 | "Doctrine\\Common\\Lexer\\": "lib/" 102 | } 103 | }, 104 | "notification-url": "https://packagist.org/downloads/", 105 | "license": [ 106 | "MIT" 107 | ], 108 | "authors": [ 109 | { 110 | "name": "Roman Borschel", 111 | "email": "roman@code-factory.org" 112 | }, 113 | { 114 | "name": "Guilherme Blanco", 115 | "email": "guilhermeblanco@gmail.com" 116 | }, 117 | { 118 | "name": "Johannes Schmitt", 119 | "email": "schmittjoh@gmail.com" 120 | } 121 | ], 122 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 123 | "homepage": "http://www.doctrine-project.org", 124 | "keywords": [ 125 | "lexer", 126 | "parser" 127 | ], 128 | "time": "2014-09-09T13:34:57+00:00" 129 | }, 130 | { 131 | "name": "dragonmantank/cron-expression", 132 | "version": "v2.2.0", 133 | "source": { 134 | "type": "git", 135 | "url": "https://github.com/dragonmantank/cron-expression.git", 136 | "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" 137 | }, 138 | "dist": { 139 | "type": "zip", 140 | "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", 141 | "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", 142 | "shasum": "" 143 | }, 144 | "require": { 145 | "php": ">=7.0.0" 146 | }, 147 | "require-dev": { 148 | "phpunit/phpunit": "~6.4" 149 | }, 150 | "type": "library", 151 | "autoload": { 152 | "psr-4": { 153 | "Cron\\": "src/Cron/" 154 | } 155 | }, 156 | "notification-url": "https://packagist.org/downloads/", 157 | "license": [ 158 | "MIT" 159 | ], 160 | "authors": [ 161 | { 162 | "name": "Michael Dowling", 163 | "email": "mtdowling@gmail.com", 164 | "homepage": "https://github.com/mtdowling" 165 | }, 166 | { 167 | "name": "Chris Tankersley", 168 | "email": "chris@ctankersley.com", 169 | "homepage": "https://github.com/dragonmantank" 170 | } 171 | ], 172 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 173 | "keywords": [ 174 | "cron", 175 | "schedule" 176 | ], 177 | "time": "2018-06-06T03:12:17+00:00" 178 | }, 179 | { 180 | "name": "egulias/email-validator", 181 | "version": "2.1.7", 182 | "source": { 183 | "type": "git", 184 | "url": "https://github.com/egulias/EmailValidator.git", 185 | "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" 186 | }, 187 | "dist": { 188 | "type": "zip", 189 | "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", 190 | "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", 191 | "shasum": "" 192 | }, 193 | "require": { 194 | "doctrine/lexer": "^1.0.1", 195 | "php": ">= 5.5" 196 | }, 197 | "require-dev": { 198 | "dominicsayers/isemail": "dev-master", 199 | "phpunit/phpunit": "^4.8.35||^5.7||^6.0", 200 | "satooshi/php-coveralls": "^1.0.1" 201 | }, 202 | "suggest": { 203 | "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 204 | }, 205 | "type": "library", 206 | "extra": { 207 | "branch-alias": { 208 | "dev-master": "2.0.x-dev" 209 | } 210 | }, 211 | "autoload": { 212 | "psr-4": { 213 | "Egulias\\EmailValidator\\": "EmailValidator" 214 | } 215 | }, 216 | "notification-url": "https://packagist.org/downloads/", 217 | "license": [ 218 | "MIT" 219 | ], 220 | "authors": [ 221 | { 222 | "name": "Eduardo Gulias Davis" 223 | } 224 | ], 225 | "description": "A library for validating emails against several RFCs", 226 | "homepage": "https://github.com/egulias/EmailValidator", 227 | "keywords": [ 228 | "email", 229 | "emailvalidation", 230 | "emailvalidator", 231 | "validation", 232 | "validator" 233 | ], 234 | "time": "2018-12-04T22:38:24+00:00" 235 | }, 236 | { 237 | "name": "erusev/parsedown", 238 | "version": "1.7.1", 239 | "source": { 240 | "type": "git", 241 | "url": "https://github.com/erusev/parsedown.git", 242 | "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" 243 | }, 244 | "dist": { 245 | "type": "zip", 246 | "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", 247 | "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", 248 | "shasum": "" 249 | }, 250 | "require": { 251 | "ext-mbstring": "*", 252 | "php": ">=5.3.0" 253 | }, 254 | "require-dev": { 255 | "phpunit/phpunit": "^4.8.35" 256 | }, 257 | "type": "library", 258 | "autoload": { 259 | "psr-0": { 260 | "Parsedown": "" 261 | } 262 | }, 263 | "notification-url": "https://packagist.org/downloads/", 264 | "license": [ 265 | "MIT" 266 | ], 267 | "authors": [ 268 | { 269 | "name": "Emanuil Rusev", 270 | "email": "hello@erusev.com", 271 | "homepage": "http://erusev.com" 272 | } 273 | ], 274 | "description": "Parser for Markdown.", 275 | "homepage": "http://parsedown.org", 276 | "keywords": [ 277 | "markdown", 278 | "parser" 279 | ], 280 | "time": "2018-03-08T01:11:30+00:00" 281 | }, 282 | { 283 | "name": "laravel/framework", 284 | "version": "v5.8.2", 285 | "source": { 286 | "type": "git", 287 | "url": "https://github.com/laravel/framework.git", 288 | "reference": "c3b7cbe700efb0f4c9a5359feaedb0a1f0a741ca" 289 | }, 290 | "dist": { 291 | "type": "zip", 292 | "url": "https://api.github.com/repos/laravel/framework/zipball/c3b7cbe700efb0f4c9a5359feaedb0a1f0a741ca", 293 | "reference": "c3b7cbe700efb0f4c9a5359feaedb0a1f0a741ca", 294 | "shasum": "" 295 | }, 296 | "require": { 297 | "doctrine/inflector": "^1.1", 298 | "dragonmantank/cron-expression": "^2.0", 299 | "egulias/email-validator": "^2.0", 300 | "erusev/parsedown": "^1.7", 301 | "ext-json": "*", 302 | "ext-mbstring": "*", 303 | "ext-openssl": "*", 304 | "league/flysystem": "^1.0.8", 305 | "monolog/monolog": "^1.12", 306 | "nesbot/carbon": "^1.26.3 || ^2.0", 307 | "opis/closure": "^3.1", 308 | "php": "^7.1.3", 309 | "psr/container": "^1.0", 310 | "psr/simple-cache": "^1.0", 311 | "ramsey/uuid": "^3.7", 312 | "swiftmailer/swiftmailer": "^6.0", 313 | "symfony/console": "^4.2", 314 | "symfony/debug": "^4.2", 315 | "symfony/finder": "^4.2", 316 | "symfony/http-foundation": "^4.2", 317 | "symfony/http-kernel": "^4.2", 318 | "symfony/process": "^4.2", 319 | "symfony/routing": "^4.2", 320 | "symfony/var-dumper": "^4.2", 321 | "tijsverkoyen/css-to-inline-styles": "^2.2.1", 322 | "vlucas/phpdotenv": "^3.3" 323 | }, 324 | "conflict": { 325 | "tightenco/collect": "<5.5.33" 326 | }, 327 | "replace": { 328 | "illuminate/auth": "self.version", 329 | "illuminate/broadcasting": "self.version", 330 | "illuminate/bus": "self.version", 331 | "illuminate/cache": "self.version", 332 | "illuminate/config": "self.version", 333 | "illuminate/console": "self.version", 334 | "illuminate/container": "self.version", 335 | "illuminate/contracts": "self.version", 336 | "illuminate/cookie": "self.version", 337 | "illuminate/database": "self.version", 338 | "illuminate/encryption": "self.version", 339 | "illuminate/events": "self.version", 340 | "illuminate/filesystem": "self.version", 341 | "illuminate/hashing": "self.version", 342 | "illuminate/http": "self.version", 343 | "illuminate/log": "self.version", 344 | "illuminate/mail": "self.version", 345 | "illuminate/notifications": "self.version", 346 | "illuminate/pagination": "self.version", 347 | "illuminate/pipeline": "self.version", 348 | "illuminate/queue": "self.version", 349 | "illuminate/redis": "self.version", 350 | "illuminate/routing": "self.version", 351 | "illuminate/session": "self.version", 352 | "illuminate/support": "self.version", 353 | "illuminate/translation": "self.version", 354 | "illuminate/validation": "self.version", 355 | "illuminate/view": "self.version" 356 | }, 357 | "require-dev": { 358 | "aws/aws-sdk-php": "^3.0", 359 | "doctrine/dbal": "^2.6", 360 | "filp/whoops": "^2.1.4", 361 | "guzzlehttp/guzzle": "^6.3", 362 | "league/flysystem-cached-adapter": "^1.0", 363 | "mockery/mockery": "^1.0", 364 | "moontoast/math": "^1.1", 365 | "orchestra/testbench-core": "3.8.*", 366 | "pda/pheanstalk": "^4.0", 367 | "phpunit/phpunit": "^7.5|^8.0", 368 | "predis/predis": "^1.1.1", 369 | "symfony/css-selector": "^4.2", 370 | "symfony/dom-crawler": "^4.2", 371 | "true/punycode": "^2.1" 372 | }, 373 | "suggest": { 374 | "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (^3.0).", 375 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", 376 | "ext-pcntl": "Required to use all features of the queue worker.", 377 | "ext-posix": "Required to use all features of the queue worker.", 378 | "filp/whoops": "Required for friendly error pages in development (^2.1.4).", 379 | "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", 380 | "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (^6.0).", 381 | "laravel/tinker": "Required to use the tinker console command (^1.0).", 382 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", 383 | "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", 384 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", 385 | "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", 386 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 387 | "nexmo/client": "Required to use the Nexmo transport (^1.0).", 388 | "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", 389 | "predis/predis": "Required to use the redis cache and queue drivers (^1.0).", 390 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^3.0).", 391 | "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.2).", 392 | "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.2).", 393 | "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.1).", 394 | "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." 395 | }, 396 | "type": "library", 397 | "extra": { 398 | "branch-alias": { 399 | "dev-master": "5.8-dev" 400 | } 401 | }, 402 | "autoload": { 403 | "files": [ 404 | "src/Illuminate/Foundation/helpers.php", 405 | "src/Illuminate/Support/helpers.php" 406 | ], 407 | "psr-4": { 408 | "Illuminate\\": "src/Illuminate/" 409 | } 410 | }, 411 | "notification-url": "https://packagist.org/downloads/", 412 | "license": [ 413 | "MIT" 414 | ], 415 | "authors": [ 416 | { 417 | "name": "Taylor Otwell", 418 | "email": "taylor@laravel.com" 419 | } 420 | ], 421 | "description": "The Laravel Framework.", 422 | "homepage": "https://laravel.com", 423 | "keywords": [ 424 | "framework", 425 | "laravel" 426 | ], 427 | "time": "2019-02-27T14:02:36+00:00" 428 | }, 429 | { 430 | "name": "league/flysystem", 431 | "version": "1.0.50", 432 | "source": { 433 | "type": "git", 434 | "url": "https://github.com/thephpleague/flysystem.git", 435 | "reference": "dab4e7624efa543a943be978008f439c333f2249" 436 | }, 437 | "dist": { 438 | "type": "zip", 439 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/dab4e7624efa543a943be978008f439c333f2249", 440 | "reference": "dab4e7624efa543a943be978008f439c333f2249", 441 | "shasum": "" 442 | }, 443 | "require": { 444 | "ext-fileinfo": "*", 445 | "php": ">=5.5.9" 446 | }, 447 | "conflict": { 448 | "league/flysystem-sftp": "<1.0.6" 449 | }, 450 | "require-dev": { 451 | "phpspec/phpspec": "^3.4", 452 | "phpunit/phpunit": "^5.7.10" 453 | }, 454 | "suggest": { 455 | "ext-fileinfo": "Required for MimeType", 456 | "ext-ftp": "Allows you to use FTP server storage", 457 | "ext-openssl": "Allows you to use FTPS server storage", 458 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 459 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 460 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 461 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 462 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 463 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 464 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 465 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 466 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 467 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 468 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 469 | }, 470 | "type": "library", 471 | "extra": { 472 | "branch-alias": { 473 | "dev-master": "1.1-dev" 474 | } 475 | }, 476 | "autoload": { 477 | "psr-4": { 478 | "League\\Flysystem\\": "src/" 479 | } 480 | }, 481 | "notification-url": "https://packagist.org/downloads/", 482 | "license": [ 483 | "MIT" 484 | ], 485 | "authors": [ 486 | { 487 | "name": "Frank de Jonge", 488 | "email": "info@frenky.net" 489 | } 490 | ], 491 | "description": "Filesystem abstraction: Many filesystems, one API.", 492 | "keywords": [ 493 | "Cloud Files", 494 | "WebDAV", 495 | "abstraction", 496 | "aws", 497 | "cloud", 498 | "copy.com", 499 | "dropbox", 500 | "file systems", 501 | "files", 502 | "filesystem", 503 | "filesystems", 504 | "ftp", 505 | "rackspace", 506 | "remote", 507 | "s3", 508 | "sftp", 509 | "storage" 510 | ], 511 | "time": "2019-02-01T08:50:36+00:00" 512 | }, 513 | { 514 | "name": "monolog/monolog", 515 | "version": "1.24.0", 516 | "source": { 517 | "type": "git", 518 | "url": "https://github.com/Seldaek/monolog.git", 519 | "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266" 520 | }, 521 | "dist": { 522 | "type": "zip", 523 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", 524 | "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", 525 | "shasum": "" 526 | }, 527 | "require": { 528 | "php": ">=5.3.0", 529 | "psr/log": "~1.0" 530 | }, 531 | "provide": { 532 | "psr/log-implementation": "1.0.0" 533 | }, 534 | "require-dev": { 535 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 536 | "doctrine/couchdb": "~1.0@dev", 537 | "graylog2/gelf-php": "~1.0", 538 | "jakub-onderka/php-parallel-lint": "0.9", 539 | "php-amqplib/php-amqplib": "~2.4", 540 | "php-console/php-console": "^3.1.3", 541 | "phpunit/phpunit": "~4.5", 542 | "phpunit/phpunit-mock-objects": "2.3.0", 543 | "ruflin/elastica": ">=0.90 <3.0", 544 | "sentry/sentry": "^0.13", 545 | "swiftmailer/swiftmailer": "^5.3|^6.0" 546 | }, 547 | "suggest": { 548 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 549 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 550 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 551 | "ext-mongo": "Allow sending log messages to a MongoDB server", 552 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 553 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 554 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 555 | "php-console/php-console": "Allow sending log messages to Google Chrome", 556 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 557 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 558 | "sentry/sentry": "Allow sending log messages to a Sentry server" 559 | }, 560 | "type": "library", 561 | "extra": { 562 | "branch-alias": { 563 | "dev-master": "2.0.x-dev" 564 | } 565 | }, 566 | "autoload": { 567 | "psr-4": { 568 | "Monolog\\": "src/Monolog" 569 | } 570 | }, 571 | "notification-url": "https://packagist.org/downloads/", 572 | "license": [ 573 | "MIT" 574 | ], 575 | "authors": [ 576 | { 577 | "name": "Jordi Boggiano", 578 | "email": "j.boggiano@seld.be", 579 | "homepage": "http://seld.be" 580 | } 581 | ], 582 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 583 | "homepage": "http://github.com/Seldaek/monolog", 584 | "keywords": [ 585 | "log", 586 | "logging", 587 | "psr-3" 588 | ], 589 | "time": "2018-11-05T09:00:11+00:00" 590 | }, 591 | { 592 | "name": "nesbot/carbon", 593 | "version": "2.14.2", 594 | "source": { 595 | "type": "git", 596 | "url": "https://github.com/briannesbitt/Carbon.git", 597 | "reference": "a1f4f9abcde8241ce33bf5090896e9c16d0b4232" 598 | }, 599 | "dist": { 600 | "type": "zip", 601 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a1f4f9abcde8241ce33bf5090896e9c16d0b4232", 602 | "reference": "a1f4f9abcde8241ce33bf5090896e9c16d0b4232", 603 | "shasum": "" 604 | }, 605 | "require": { 606 | "ext-json": "*", 607 | "php": "^7.1.8 || ^8.0", 608 | "symfony/translation": "^3.4 || ^4.0" 609 | }, 610 | "require-dev": { 611 | "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", 612 | "kylekatarnls/multi-tester": "^0.1", 613 | "phpmd/phpmd": "^2.6", 614 | "phpstan/phpstan": "^0.10.8", 615 | "phpunit/phpunit": "^7.5 || ^8.0", 616 | "squizlabs/php_codesniffer": "^3.4" 617 | }, 618 | "type": "library", 619 | "extra": { 620 | "laravel": { 621 | "providers": [ 622 | "Carbon\\Laravel\\ServiceProvider" 623 | ] 624 | } 625 | }, 626 | "autoload": { 627 | "psr-4": { 628 | "Carbon\\": "src/Carbon/" 629 | } 630 | }, 631 | "notification-url": "https://packagist.org/downloads/", 632 | "license": [ 633 | "MIT" 634 | ], 635 | "authors": [ 636 | { 637 | "name": "Brian Nesbitt", 638 | "email": "brian@nesbot.com", 639 | "homepage": "http://nesbot.com" 640 | } 641 | ], 642 | "description": "A simple API extension for DateTime.", 643 | "homepage": "http://carbon.nesbot.com", 644 | "keywords": [ 645 | "date", 646 | "datetime", 647 | "time" 648 | ], 649 | "time": "2019-02-28T09:07:12+00:00" 650 | }, 651 | { 652 | "name": "opis/closure", 653 | "version": "3.1.6", 654 | "source": { 655 | "type": "git", 656 | "url": "https://github.com/opis/closure.git", 657 | "reference": "ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b" 658 | }, 659 | "dist": { 660 | "type": "zip", 661 | "url": "https://api.github.com/repos/opis/closure/zipball/ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b", 662 | "reference": "ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b", 663 | "shasum": "" 664 | }, 665 | "require": { 666 | "php": "^5.4 || ^7.0" 667 | }, 668 | "require-dev": { 669 | "jeremeamia/superclosure": "^2.0", 670 | "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0" 671 | }, 672 | "type": "library", 673 | "extra": { 674 | "branch-alias": { 675 | "dev-master": "3.1.x-dev" 676 | } 677 | }, 678 | "autoload": { 679 | "psr-4": { 680 | "Opis\\Closure\\": "src/" 681 | }, 682 | "files": [ 683 | "functions.php" 684 | ] 685 | }, 686 | "notification-url": "https://packagist.org/downloads/", 687 | "license": [ 688 | "MIT" 689 | ], 690 | "authors": [ 691 | { 692 | "name": "Marius Sarca", 693 | "email": "marius.sarca@gmail.com" 694 | }, 695 | { 696 | "name": "Sorin Sarca", 697 | "email": "sarca_sorin@hotmail.com" 698 | } 699 | ], 700 | "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", 701 | "homepage": "https://opis.io/closure", 702 | "keywords": [ 703 | "anonymous functions", 704 | "closure", 705 | "function", 706 | "serializable", 707 | "serialization", 708 | "serialize" 709 | ], 710 | "time": "2019-02-22T10:30:00+00:00" 711 | }, 712 | { 713 | "name": "paragonie/random_compat", 714 | "version": "v9.99.99", 715 | "source": { 716 | "type": "git", 717 | "url": "https://github.com/paragonie/random_compat.git", 718 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" 719 | }, 720 | "dist": { 721 | "type": "zip", 722 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 723 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 724 | "shasum": "" 725 | }, 726 | "require": { 727 | "php": "^7" 728 | }, 729 | "require-dev": { 730 | "phpunit/phpunit": "4.*|5.*", 731 | "vimeo/psalm": "^1" 732 | }, 733 | "suggest": { 734 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 735 | }, 736 | "type": "library", 737 | "notification-url": "https://packagist.org/downloads/", 738 | "license": [ 739 | "MIT" 740 | ], 741 | "authors": [ 742 | { 743 | "name": "Paragon Initiative Enterprises", 744 | "email": "security@paragonie.com", 745 | "homepage": "https://paragonie.com" 746 | } 747 | ], 748 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 749 | "keywords": [ 750 | "csprng", 751 | "polyfill", 752 | "pseudorandom", 753 | "random" 754 | ], 755 | "time": "2018-07-02T15:55:56+00:00" 756 | }, 757 | { 758 | "name": "phpoption/phpoption", 759 | "version": "1.5.0", 760 | "source": { 761 | "type": "git", 762 | "url": "https://github.com/schmittjoh/php-option.git", 763 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" 764 | }, 765 | "dist": { 766 | "type": "zip", 767 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", 768 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", 769 | "shasum": "" 770 | }, 771 | "require": { 772 | "php": ">=5.3.0" 773 | }, 774 | "require-dev": { 775 | "phpunit/phpunit": "4.7.*" 776 | }, 777 | "type": "library", 778 | "extra": { 779 | "branch-alias": { 780 | "dev-master": "1.3-dev" 781 | } 782 | }, 783 | "autoload": { 784 | "psr-0": { 785 | "PhpOption\\": "src/" 786 | } 787 | }, 788 | "notification-url": "https://packagist.org/downloads/", 789 | "license": [ 790 | "Apache2" 791 | ], 792 | "authors": [ 793 | { 794 | "name": "Johannes M. Schmitt", 795 | "email": "schmittjoh@gmail.com" 796 | } 797 | ], 798 | "description": "Option Type for PHP", 799 | "keywords": [ 800 | "language", 801 | "option", 802 | "php", 803 | "type" 804 | ], 805 | "time": "2015-07-25T16:39:46+00:00" 806 | }, 807 | { 808 | "name": "psr/container", 809 | "version": "1.0.0", 810 | "source": { 811 | "type": "git", 812 | "url": "https://github.com/php-fig/container.git", 813 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 814 | }, 815 | "dist": { 816 | "type": "zip", 817 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 818 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 819 | "shasum": "" 820 | }, 821 | "require": { 822 | "php": ">=5.3.0" 823 | }, 824 | "type": "library", 825 | "extra": { 826 | "branch-alias": { 827 | "dev-master": "1.0.x-dev" 828 | } 829 | }, 830 | "autoload": { 831 | "psr-4": { 832 | "Psr\\Container\\": "src/" 833 | } 834 | }, 835 | "notification-url": "https://packagist.org/downloads/", 836 | "license": [ 837 | "MIT" 838 | ], 839 | "authors": [ 840 | { 841 | "name": "PHP-FIG", 842 | "homepage": "http://www.php-fig.org/" 843 | } 844 | ], 845 | "description": "Common Container Interface (PHP FIG PSR-11)", 846 | "homepage": "https://github.com/php-fig/container", 847 | "keywords": [ 848 | "PSR-11", 849 | "container", 850 | "container-interface", 851 | "container-interop", 852 | "psr" 853 | ], 854 | "time": "2017-02-14T16:28:37+00:00" 855 | }, 856 | { 857 | "name": "psr/log", 858 | "version": "1.1.0", 859 | "source": { 860 | "type": "git", 861 | "url": "https://github.com/php-fig/log.git", 862 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" 863 | }, 864 | "dist": { 865 | "type": "zip", 866 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 867 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 868 | "shasum": "" 869 | }, 870 | "require": { 871 | "php": ">=5.3.0" 872 | }, 873 | "type": "library", 874 | "extra": { 875 | "branch-alias": { 876 | "dev-master": "1.0.x-dev" 877 | } 878 | }, 879 | "autoload": { 880 | "psr-4": { 881 | "Psr\\Log\\": "Psr/Log/" 882 | } 883 | }, 884 | "notification-url": "https://packagist.org/downloads/", 885 | "license": [ 886 | "MIT" 887 | ], 888 | "authors": [ 889 | { 890 | "name": "PHP-FIG", 891 | "homepage": "http://www.php-fig.org/" 892 | } 893 | ], 894 | "description": "Common interface for logging libraries", 895 | "homepage": "https://github.com/php-fig/log", 896 | "keywords": [ 897 | "log", 898 | "psr", 899 | "psr-3" 900 | ], 901 | "time": "2018-11-20T15:27:04+00:00" 902 | }, 903 | { 904 | "name": "psr/simple-cache", 905 | "version": "1.0.1", 906 | "source": { 907 | "type": "git", 908 | "url": "https://github.com/php-fig/simple-cache.git", 909 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 910 | }, 911 | "dist": { 912 | "type": "zip", 913 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 914 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 915 | "shasum": "" 916 | }, 917 | "require": { 918 | "php": ">=5.3.0" 919 | }, 920 | "type": "library", 921 | "extra": { 922 | "branch-alias": { 923 | "dev-master": "1.0.x-dev" 924 | } 925 | }, 926 | "autoload": { 927 | "psr-4": { 928 | "Psr\\SimpleCache\\": "src/" 929 | } 930 | }, 931 | "notification-url": "https://packagist.org/downloads/", 932 | "license": [ 933 | "MIT" 934 | ], 935 | "authors": [ 936 | { 937 | "name": "PHP-FIG", 938 | "homepage": "http://www.php-fig.org/" 939 | } 940 | ], 941 | "description": "Common interfaces for simple caching", 942 | "keywords": [ 943 | "cache", 944 | "caching", 945 | "psr", 946 | "psr-16", 947 | "simple-cache" 948 | ], 949 | "time": "2017-10-23T01:57:42+00:00" 950 | }, 951 | { 952 | "name": "ramsey/uuid", 953 | "version": "3.8.0", 954 | "source": { 955 | "type": "git", 956 | "url": "https://github.com/ramsey/uuid.git", 957 | "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3" 958 | }, 959 | "dist": { 960 | "type": "zip", 961 | "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3", 962 | "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3", 963 | "shasum": "" 964 | }, 965 | "require": { 966 | "paragonie/random_compat": "^1.0|^2.0|9.99.99", 967 | "php": "^5.4 || ^7.0", 968 | "symfony/polyfill-ctype": "^1.8" 969 | }, 970 | "replace": { 971 | "rhumsaa/uuid": "self.version" 972 | }, 973 | "require-dev": { 974 | "codeception/aspect-mock": "^1.0 | ~2.0.0", 975 | "doctrine/annotations": "~1.2.0", 976 | "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0", 977 | "ircmaxell/random-lib": "^1.1", 978 | "jakub-onderka/php-parallel-lint": "^0.9.0", 979 | "mockery/mockery": "^0.9.9", 980 | "moontoast/math": "^1.1", 981 | "php-mock/php-mock-phpunit": "^0.3|^1.1", 982 | "phpunit/phpunit": "^4.7|^5.0|^6.5", 983 | "squizlabs/php_codesniffer": "^2.3" 984 | }, 985 | "suggest": { 986 | "ext-ctype": "Provides support for PHP Ctype functions", 987 | "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", 988 | "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", 989 | "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", 990 | "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", 991 | "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", 992 | "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." 993 | }, 994 | "type": "library", 995 | "extra": { 996 | "branch-alias": { 997 | "dev-master": "3.x-dev" 998 | } 999 | }, 1000 | "autoload": { 1001 | "psr-4": { 1002 | "Ramsey\\Uuid\\": "src/" 1003 | } 1004 | }, 1005 | "notification-url": "https://packagist.org/downloads/", 1006 | "license": [ 1007 | "MIT" 1008 | ], 1009 | "authors": [ 1010 | { 1011 | "name": "Marijn Huizendveld", 1012 | "email": "marijn.huizendveld@gmail.com" 1013 | }, 1014 | { 1015 | "name": "Thibaud Fabre", 1016 | "email": "thibaud@aztech.io" 1017 | }, 1018 | { 1019 | "name": "Ben Ramsey", 1020 | "email": "ben@benramsey.com", 1021 | "homepage": "https://benramsey.com" 1022 | } 1023 | ], 1024 | "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", 1025 | "homepage": "https://github.com/ramsey/uuid", 1026 | "keywords": [ 1027 | "guid", 1028 | "identifier", 1029 | "uuid" 1030 | ], 1031 | "time": "2018-07-19T23:38:55+00:00" 1032 | }, 1033 | { 1034 | "name": "swiftmailer/swiftmailer", 1035 | "version": "v6.1.3", 1036 | "source": { 1037 | "type": "git", 1038 | "url": "https://github.com/swiftmailer/swiftmailer.git", 1039 | "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4" 1040 | }, 1041 | "dist": { 1042 | "type": "zip", 1043 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8ddcb66ac10c392d3beb54829eef8ac1438595f4", 1044 | "reference": "8ddcb66ac10c392d3beb54829eef8ac1438595f4", 1045 | "shasum": "" 1046 | }, 1047 | "require": { 1048 | "egulias/email-validator": "~2.0", 1049 | "php": ">=7.0.0" 1050 | }, 1051 | "require-dev": { 1052 | "mockery/mockery": "~0.9.1", 1053 | "symfony/phpunit-bridge": "~3.3@dev" 1054 | }, 1055 | "suggest": { 1056 | "ext-intl": "Needed to support internationalized email addresses", 1057 | "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" 1058 | }, 1059 | "type": "library", 1060 | "extra": { 1061 | "branch-alias": { 1062 | "dev-master": "6.1-dev" 1063 | } 1064 | }, 1065 | "autoload": { 1066 | "files": [ 1067 | "lib/swift_required.php" 1068 | ] 1069 | }, 1070 | "notification-url": "https://packagist.org/downloads/", 1071 | "license": [ 1072 | "MIT" 1073 | ], 1074 | "authors": [ 1075 | { 1076 | "name": "Chris Corbyn" 1077 | }, 1078 | { 1079 | "name": "Fabien Potencier", 1080 | "email": "fabien@symfony.com" 1081 | } 1082 | ], 1083 | "description": "Swiftmailer, free feature-rich PHP mailer", 1084 | "homepage": "https://swiftmailer.symfony.com", 1085 | "keywords": [ 1086 | "email", 1087 | "mail", 1088 | "mailer" 1089 | ], 1090 | "time": "2018-09-11T07:12:52+00:00" 1091 | }, 1092 | { 1093 | "name": "symfony/console", 1094 | "version": "v4.2.3", 1095 | "source": { 1096 | "type": "git", 1097 | "url": "https://github.com/symfony/console.git", 1098 | "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4" 1099 | }, 1100 | "dist": { 1101 | "type": "zip", 1102 | "url": "https://api.github.com/repos/symfony/console/zipball/1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4", 1103 | "reference": "1f0ad51dfde4da8a6070f06adc58b4e37cbb37a4", 1104 | "shasum": "" 1105 | }, 1106 | "require": { 1107 | "php": "^7.1.3", 1108 | "symfony/contracts": "^1.0", 1109 | "symfony/polyfill-mbstring": "~1.0" 1110 | }, 1111 | "conflict": { 1112 | "symfony/dependency-injection": "<3.4", 1113 | "symfony/process": "<3.3" 1114 | }, 1115 | "provide": { 1116 | "psr/log-implementation": "1.0" 1117 | }, 1118 | "require-dev": { 1119 | "psr/log": "~1.0", 1120 | "symfony/config": "~3.4|~4.0", 1121 | "symfony/dependency-injection": "~3.4|~4.0", 1122 | "symfony/event-dispatcher": "~3.4|~4.0", 1123 | "symfony/lock": "~3.4|~4.0", 1124 | "symfony/process": "~3.4|~4.0" 1125 | }, 1126 | "suggest": { 1127 | "psr/log": "For using the console logger", 1128 | "symfony/event-dispatcher": "", 1129 | "symfony/lock": "", 1130 | "symfony/process": "" 1131 | }, 1132 | "type": "library", 1133 | "extra": { 1134 | "branch-alias": { 1135 | "dev-master": "4.2-dev" 1136 | } 1137 | }, 1138 | "autoload": { 1139 | "psr-4": { 1140 | "Symfony\\Component\\Console\\": "" 1141 | }, 1142 | "exclude-from-classmap": [ 1143 | "/Tests/" 1144 | ] 1145 | }, 1146 | "notification-url": "https://packagist.org/downloads/", 1147 | "license": [ 1148 | "MIT" 1149 | ], 1150 | "authors": [ 1151 | { 1152 | "name": "Fabien Potencier", 1153 | "email": "fabien@symfony.com" 1154 | }, 1155 | { 1156 | "name": "Symfony Community", 1157 | "homepage": "https://symfony.com/contributors" 1158 | } 1159 | ], 1160 | "description": "Symfony Console Component", 1161 | "homepage": "https://symfony.com", 1162 | "time": "2019-01-25T14:35:16+00:00" 1163 | }, 1164 | { 1165 | "name": "symfony/contracts", 1166 | "version": "v1.0.2", 1167 | "source": { 1168 | "type": "git", 1169 | "url": "https://github.com/symfony/contracts.git", 1170 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" 1171 | }, 1172 | "dist": { 1173 | "type": "zip", 1174 | "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", 1175 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", 1176 | "shasum": "" 1177 | }, 1178 | "require": { 1179 | "php": "^7.1.3" 1180 | }, 1181 | "require-dev": { 1182 | "psr/cache": "^1.0", 1183 | "psr/container": "^1.0" 1184 | }, 1185 | "suggest": { 1186 | "psr/cache": "When using the Cache contracts", 1187 | "psr/container": "When using the Service contracts", 1188 | "symfony/cache-contracts-implementation": "", 1189 | "symfony/service-contracts-implementation": "", 1190 | "symfony/translation-contracts-implementation": "" 1191 | }, 1192 | "type": "library", 1193 | "extra": { 1194 | "branch-alias": { 1195 | "dev-master": "1.0-dev" 1196 | } 1197 | }, 1198 | "autoload": { 1199 | "psr-4": { 1200 | "Symfony\\Contracts\\": "" 1201 | }, 1202 | "exclude-from-classmap": [ 1203 | "**/Tests/" 1204 | ] 1205 | }, 1206 | "notification-url": "https://packagist.org/downloads/", 1207 | "license": [ 1208 | "MIT" 1209 | ], 1210 | "authors": [ 1211 | { 1212 | "name": "Nicolas Grekas", 1213 | "email": "p@tchwork.com" 1214 | }, 1215 | { 1216 | "name": "Symfony Community", 1217 | "homepage": "https://symfony.com/contributors" 1218 | } 1219 | ], 1220 | "description": "A set of abstractions extracted out of the Symfony components", 1221 | "homepage": "https://symfony.com", 1222 | "keywords": [ 1223 | "abstractions", 1224 | "contracts", 1225 | "decoupling", 1226 | "interfaces", 1227 | "interoperability", 1228 | "standards" 1229 | ], 1230 | "time": "2018-12-05T08:06:11+00:00" 1231 | }, 1232 | { 1233 | "name": "symfony/css-selector", 1234 | "version": "v4.2.3", 1235 | "source": { 1236 | "type": "git", 1237 | "url": "https://github.com/symfony/css-selector.git", 1238 | "reference": "48eddf66950fa57996e1be4a55916d65c10c604a" 1239 | }, 1240 | "dist": { 1241 | "type": "zip", 1242 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/48eddf66950fa57996e1be4a55916d65c10c604a", 1243 | "reference": "48eddf66950fa57996e1be4a55916d65c10c604a", 1244 | "shasum": "" 1245 | }, 1246 | "require": { 1247 | "php": "^7.1.3" 1248 | }, 1249 | "type": "library", 1250 | "extra": { 1251 | "branch-alias": { 1252 | "dev-master": "4.2-dev" 1253 | } 1254 | }, 1255 | "autoload": { 1256 | "psr-4": { 1257 | "Symfony\\Component\\CssSelector\\": "" 1258 | }, 1259 | "exclude-from-classmap": [ 1260 | "/Tests/" 1261 | ] 1262 | }, 1263 | "notification-url": "https://packagist.org/downloads/", 1264 | "license": [ 1265 | "MIT" 1266 | ], 1267 | "authors": [ 1268 | { 1269 | "name": "Jean-François Simon", 1270 | "email": "jeanfrancois.simon@sensiolabs.com" 1271 | }, 1272 | { 1273 | "name": "Fabien Potencier", 1274 | "email": "fabien@symfony.com" 1275 | }, 1276 | { 1277 | "name": "Symfony Community", 1278 | "homepage": "https://symfony.com/contributors" 1279 | } 1280 | ], 1281 | "description": "Symfony CssSelector Component", 1282 | "homepage": "https://symfony.com", 1283 | "time": "2019-01-16T20:31:39+00:00" 1284 | }, 1285 | { 1286 | "name": "symfony/debug", 1287 | "version": "v4.2.3", 1288 | "source": { 1289 | "type": "git", 1290 | "url": "https://github.com/symfony/debug.git", 1291 | "reference": "cf9b2e33f757deb884ce474e06d2647c1c769b65" 1292 | }, 1293 | "dist": { 1294 | "type": "zip", 1295 | "url": "https://api.github.com/repos/symfony/debug/zipball/cf9b2e33f757deb884ce474e06d2647c1c769b65", 1296 | "reference": "cf9b2e33f757deb884ce474e06d2647c1c769b65", 1297 | "shasum": "" 1298 | }, 1299 | "require": { 1300 | "php": "^7.1.3", 1301 | "psr/log": "~1.0" 1302 | }, 1303 | "conflict": { 1304 | "symfony/http-kernel": "<3.4" 1305 | }, 1306 | "require-dev": { 1307 | "symfony/http-kernel": "~3.4|~4.0" 1308 | }, 1309 | "type": "library", 1310 | "extra": { 1311 | "branch-alias": { 1312 | "dev-master": "4.2-dev" 1313 | } 1314 | }, 1315 | "autoload": { 1316 | "psr-4": { 1317 | "Symfony\\Component\\Debug\\": "" 1318 | }, 1319 | "exclude-from-classmap": [ 1320 | "/Tests/" 1321 | ] 1322 | }, 1323 | "notification-url": "https://packagist.org/downloads/", 1324 | "license": [ 1325 | "MIT" 1326 | ], 1327 | "authors": [ 1328 | { 1329 | "name": "Fabien Potencier", 1330 | "email": "fabien@symfony.com" 1331 | }, 1332 | { 1333 | "name": "Symfony Community", 1334 | "homepage": "https://symfony.com/contributors" 1335 | } 1336 | ], 1337 | "description": "Symfony Debug Component", 1338 | "homepage": "https://symfony.com", 1339 | "time": "2019-01-25T14:35:16+00:00" 1340 | }, 1341 | { 1342 | "name": "symfony/event-dispatcher", 1343 | "version": "v4.2.3", 1344 | "source": { 1345 | "type": "git", 1346 | "url": "https://github.com/symfony/event-dispatcher.git", 1347 | "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1" 1348 | }, 1349 | "dist": { 1350 | "type": "zip", 1351 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1", 1352 | "reference": "bd09ad265cd50b2b9d09d65ce6aba2d29bc81fe1", 1353 | "shasum": "" 1354 | }, 1355 | "require": { 1356 | "php": "^7.1.3", 1357 | "symfony/contracts": "^1.0" 1358 | }, 1359 | "conflict": { 1360 | "symfony/dependency-injection": "<3.4" 1361 | }, 1362 | "require-dev": { 1363 | "psr/log": "~1.0", 1364 | "symfony/config": "~3.4|~4.0", 1365 | "symfony/dependency-injection": "~3.4|~4.0", 1366 | "symfony/expression-language": "~3.4|~4.0", 1367 | "symfony/stopwatch": "~3.4|~4.0" 1368 | }, 1369 | "suggest": { 1370 | "symfony/dependency-injection": "", 1371 | "symfony/http-kernel": "" 1372 | }, 1373 | "type": "library", 1374 | "extra": { 1375 | "branch-alias": { 1376 | "dev-master": "4.2-dev" 1377 | } 1378 | }, 1379 | "autoload": { 1380 | "psr-4": { 1381 | "Symfony\\Component\\EventDispatcher\\": "" 1382 | }, 1383 | "exclude-from-classmap": [ 1384 | "/Tests/" 1385 | ] 1386 | }, 1387 | "notification-url": "https://packagist.org/downloads/", 1388 | "license": [ 1389 | "MIT" 1390 | ], 1391 | "authors": [ 1392 | { 1393 | "name": "Fabien Potencier", 1394 | "email": "fabien@symfony.com" 1395 | }, 1396 | { 1397 | "name": "Symfony Community", 1398 | "homepage": "https://symfony.com/contributors" 1399 | } 1400 | ], 1401 | "description": "Symfony EventDispatcher Component", 1402 | "homepage": "https://symfony.com", 1403 | "time": "2019-01-16T20:35:37+00:00" 1404 | }, 1405 | { 1406 | "name": "symfony/finder", 1407 | "version": "v4.2.3", 1408 | "source": { 1409 | "type": "git", 1410 | "url": "https://github.com/symfony/finder.git", 1411 | "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c" 1412 | }, 1413 | "dist": { 1414 | "type": "zip", 1415 | "url": "https://api.github.com/repos/symfony/finder/zipball/ef71816cbb264988bb57fe6a73f610888b9aa70c", 1416 | "reference": "ef71816cbb264988bb57fe6a73f610888b9aa70c", 1417 | "shasum": "" 1418 | }, 1419 | "require": { 1420 | "php": "^7.1.3" 1421 | }, 1422 | "type": "library", 1423 | "extra": { 1424 | "branch-alias": { 1425 | "dev-master": "4.2-dev" 1426 | } 1427 | }, 1428 | "autoload": { 1429 | "psr-4": { 1430 | "Symfony\\Component\\Finder\\": "" 1431 | }, 1432 | "exclude-from-classmap": [ 1433 | "/Tests/" 1434 | ] 1435 | }, 1436 | "notification-url": "https://packagist.org/downloads/", 1437 | "license": [ 1438 | "MIT" 1439 | ], 1440 | "authors": [ 1441 | { 1442 | "name": "Fabien Potencier", 1443 | "email": "fabien@symfony.com" 1444 | }, 1445 | { 1446 | "name": "Symfony Community", 1447 | "homepage": "https://symfony.com/contributors" 1448 | } 1449 | ], 1450 | "description": "Symfony Finder Component", 1451 | "homepage": "https://symfony.com", 1452 | "time": "2019-01-16T20:35:37+00:00" 1453 | }, 1454 | { 1455 | "name": "symfony/http-foundation", 1456 | "version": "v4.2.3", 1457 | "source": { 1458 | "type": "git", 1459 | "url": "https://github.com/symfony/http-foundation.git", 1460 | "reference": "8d2318b73e0a1bc75baa699d00ebe2ae8b595a39" 1461 | }, 1462 | "dist": { 1463 | "type": "zip", 1464 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8d2318b73e0a1bc75baa699d00ebe2ae8b595a39", 1465 | "reference": "8d2318b73e0a1bc75baa699d00ebe2ae8b595a39", 1466 | "shasum": "" 1467 | }, 1468 | "require": { 1469 | "php": "^7.1.3", 1470 | "symfony/polyfill-mbstring": "~1.1" 1471 | }, 1472 | "require-dev": { 1473 | "predis/predis": "~1.0", 1474 | "symfony/expression-language": "~3.4|~4.0" 1475 | }, 1476 | "type": "library", 1477 | "extra": { 1478 | "branch-alias": { 1479 | "dev-master": "4.2-dev" 1480 | } 1481 | }, 1482 | "autoload": { 1483 | "psr-4": { 1484 | "Symfony\\Component\\HttpFoundation\\": "" 1485 | }, 1486 | "exclude-from-classmap": [ 1487 | "/Tests/" 1488 | ] 1489 | }, 1490 | "notification-url": "https://packagist.org/downloads/", 1491 | "license": [ 1492 | "MIT" 1493 | ], 1494 | "authors": [ 1495 | { 1496 | "name": "Fabien Potencier", 1497 | "email": "fabien@symfony.com" 1498 | }, 1499 | { 1500 | "name": "Symfony Community", 1501 | "homepage": "https://symfony.com/contributors" 1502 | } 1503 | ], 1504 | "description": "Symfony HttpFoundation Component", 1505 | "homepage": "https://symfony.com", 1506 | "time": "2019-01-29T09:49:29+00:00" 1507 | }, 1508 | { 1509 | "name": "symfony/http-kernel", 1510 | "version": "v4.2.3", 1511 | "source": { 1512 | "type": "git", 1513 | "url": "https://github.com/symfony/http-kernel.git", 1514 | "reference": "d56b1706abaa771eb6acd894c6787cb88f1dc97d" 1515 | }, 1516 | "dist": { 1517 | "type": "zip", 1518 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d56b1706abaa771eb6acd894c6787cb88f1dc97d", 1519 | "reference": "d56b1706abaa771eb6acd894c6787cb88f1dc97d", 1520 | "shasum": "" 1521 | }, 1522 | "require": { 1523 | "php": "^7.1.3", 1524 | "psr/log": "~1.0", 1525 | "symfony/contracts": "^1.0.2", 1526 | "symfony/debug": "~3.4|~4.0", 1527 | "symfony/event-dispatcher": "~4.1", 1528 | "symfony/http-foundation": "^4.1.1", 1529 | "symfony/polyfill-ctype": "~1.8" 1530 | }, 1531 | "conflict": { 1532 | "symfony/config": "<3.4", 1533 | "symfony/dependency-injection": "<4.2", 1534 | "symfony/translation": "<4.2", 1535 | "symfony/var-dumper": "<4.1.1", 1536 | "twig/twig": "<1.34|<2.4,>=2" 1537 | }, 1538 | "provide": { 1539 | "psr/log-implementation": "1.0" 1540 | }, 1541 | "require-dev": { 1542 | "psr/cache": "~1.0", 1543 | "symfony/browser-kit": "~3.4|~4.0", 1544 | "symfony/config": "~3.4|~4.0", 1545 | "symfony/console": "~3.4|~4.0", 1546 | "symfony/css-selector": "~3.4|~4.0", 1547 | "symfony/dependency-injection": "^4.2", 1548 | "symfony/dom-crawler": "~3.4|~4.0", 1549 | "symfony/expression-language": "~3.4|~4.0", 1550 | "symfony/finder": "~3.4|~4.0", 1551 | "symfony/process": "~3.4|~4.0", 1552 | "symfony/routing": "~3.4|~4.0", 1553 | "symfony/stopwatch": "~3.4|~4.0", 1554 | "symfony/templating": "~3.4|~4.0", 1555 | "symfony/translation": "~4.2", 1556 | "symfony/var-dumper": "^4.1.1" 1557 | }, 1558 | "suggest": { 1559 | "symfony/browser-kit": "", 1560 | "symfony/config": "", 1561 | "symfony/console": "", 1562 | "symfony/dependency-injection": "", 1563 | "symfony/var-dumper": "" 1564 | }, 1565 | "type": "library", 1566 | "extra": { 1567 | "branch-alias": { 1568 | "dev-master": "4.2-dev" 1569 | } 1570 | }, 1571 | "autoload": { 1572 | "psr-4": { 1573 | "Symfony\\Component\\HttpKernel\\": "" 1574 | }, 1575 | "exclude-from-classmap": [ 1576 | "/Tests/" 1577 | ] 1578 | }, 1579 | "notification-url": "https://packagist.org/downloads/", 1580 | "license": [ 1581 | "MIT" 1582 | ], 1583 | "authors": [ 1584 | { 1585 | "name": "Fabien Potencier", 1586 | "email": "fabien@symfony.com" 1587 | }, 1588 | { 1589 | "name": "Symfony Community", 1590 | "homepage": "https://symfony.com/contributors" 1591 | } 1592 | ], 1593 | "description": "Symfony HttpKernel Component", 1594 | "homepage": "https://symfony.com", 1595 | "time": "2019-02-03T12:47:33+00:00" 1596 | }, 1597 | { 1598 | "name": "symfony/polyfill-ctype", 1599 | "version": "v1.10.0", 1600 | "source": { 1601 | "type": "git", 1602 | "url": "https://github.com/symfony/polyfill-ctype.git", 1603 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" 1604 | }, 1605 | "dist": { 1606 | "type": "zip", 1607 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", 1608 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", 1609 | "shasum": "" 1610 | }, 1611 | "require": { 1612 | "php": ">=5.3.3" 1613 | }, 1614 | "suggest": { 1615 | "ext-ctype": "For best performance" 1616 | }, 1617 | "type": "library", 1618 | "extra": { 1619 | "branch-alias": { 1620 | "dev-master": "1.9-dev" 1621 | } 1622 | }, 1623 | "autoload": { 1624 | "psr-4": { 1625 | "Symfony\\Polyfill\\Ctype\\": "" 1626 | }, 1627 | "files": [ 1628 | "bootstrap.php" 1629 | ] 1630 | }, 1631 | "notification-url": "https://packagist.org/downloads/", 1632 | "license": [ 1633 | "MIT" 1634 | ], 1635 | "authors": [ 1636 | { 1637 | "name": "Symfony Community", 1638 | "homepage": "https://symfony.com/contributors" 1639 | }, 1640 | { 1641 | "name": "Gert de Pagter", 1642 | "email": "BackEndTea@gmail.com" 1643 | } 1644 | ], 1645 | "description": "Symfony polyfill for ctype functions", 1646 | "homepage": "https://symfony.com", 1647 | "keywords": [ 1648 | "compatibility", 1649 | "ctype", 1650 | "polyfill", 1651 | "portable" 1652 | ], 1653 | "time": "2018-08-06T14:22:27+00:00" 1654 | }, 1655 | { 1656 | "name": "symfony/polyfill-mbstring", 1657 | "version": "v1.10.0", 1658 | "source": { 1659 | "type": "git", 1660 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1661 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" 1662 | }, 1663 | "dist": { 1664 | "type": "zip", 1665 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", 1666 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", 1667 | "shasum": "" 1668 | }, 1669 | "require": { 1670 | "php": ">=5.3.3" 1671 | }, 1672 | "suggest": { 1673 | "ext-mbstring": "For best performance" 1674 | }, 1675 | "type": "library", 1676 | "extra": { 1677 | "branch-alias": { 1678 | "dev-master": "1.9-dev" 1679 | } 1680 | }, 1681 | "autoload": { 1682 | "psr-4": { 1683 | "Symfony\\Polyfill\\Mbstring\\": "" 1684 | }, 1685 | "files": [ 1686 | "bootstrap.php" 1687 | ] 1688 | }, 1689 | "notification-url": "https://packagist.org/downloads/", 1690 | "license": [ 1691 | "MIT" 1692 | ], 1693 | "authors": [ 1694 | { 1695 | "name": "Nicolas Grekas", 1696 | "email": "p@tchwork.com" 1697 | }, 1698 | { 1699 | "name": "Symfony Community", 1700 | "homepage": "https://symfony.com/contributors" 1701 | } 1702 | ], 1703 | "description": "Symfony polyfill for the Mbstring extension", 1704 | "homepage": "https://symfony.com", 1705 | "keywords": [ 1706 | "compatibility", 1707 | "mbstring", 1708 | "polyfill", 1709 | "portable", 1710 | "shim" 1711 | ], 1712 | "time": "2018-09-21T13:07:52+00:00" 1713 | }, 1714 | { 1715 | "name": "symfony/polyfill-php72", 1716 | "version": "v1.10.0", 1717 | "source": { 1718 | "type": "git", 1719 | "url": "https://github.com/symfony/polyfill-php72.git", 1720 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631" 1721 | }, 1722 | "dist": { 1723 | "type": "zip", 1724 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", 1725 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", 1726 | "shasum": "" 1727 | }, 1728 | "require": { 1729 | "php": ">=5.3.3" 1730 | }, 1731 | "type": "library", 1732 | "extra": { 1733 | "branch-alias": { 1734 | "dev-master": "1.9-dev" 1735 | } 1736 | }, 1737 | "autoload": { 1738 | "psr-4": { 1739 | "Symfony\\Polyfill\\Php72\\": "" 1740 | }, 1741 | "files": [ 1742 | "bootstrap.php" 1743 | ] 1744 | }, 1745 | "notification-url": "https://packagist.org/downloads/", 1746 | "license": [ 1747 | "MIT" 1748 | ], 1749 | "authors": [ 1750 | { 1751 | "name": "Nicolas Grekas", 1752 | "email": "p@tchwork.com" 1753 | }, 1754 | { 1755 | "name": "Symfony Community", 1756 | "homepage": "https://symfony.com/contributors" 1757 | } 1758 | ], 1759 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 1760 | "homepage": "https://symfony.com", 1761 | "keywords": [ 1762 | "compatibility", 1763 | "polyfill", 1764 | "portable", 1765 | "shim" 1766 | ], 1767 | "time": "2018-09-21T13:07:52+00:00" 1768 | }, 1769 | { 1770 | "name": "symfony/process", 1771 | "version": "v4.2.3", 1772 | "source": { 1773 | "type": "git", 1774 | "url": "https://github.com/symfony/process.git", 1775 | "reference": "6c05edb11fbeff9e2b324b4270ecb17911a8b7ad" 1776 | }, 1777 | "dist": { 1778 | "type": "zip", 1779 | "url": "https://api.github.com/repos/symfony/process/zipball/6c05edb11fbeff9e2b324b4270ecb17911a8b7ad", 1780 | "reference": "6c05edb11fbeff9e2b324b4270ecb17911a8b7ad", 1781 | "shasum": "" 1782 | }, 1783 | "require": { 1784 | "php": "^7.1.3" 1785 | }, 1786 | "type": "library", 1787 | "extra": { 1788 | "branch-alias": { 1789 | "dev-master": "4.2-dev" 1790 | } 1791 | }, 1792 | "autoload": { 1793 | "psr-4": { 1794 | "Symfony\\Component\\Process\\": "" 1795 | }, 1796 | "exclude-from-classmap": [ 1797 | "/Tests/" 1798 | ] 1799 | }, 1800 | "notification-url": "https://packagist.org/downloads/", 1801 | "license": [ 1802 | "MIT" 1803 | ], 1804 | "authors": [ 1805 | { 1806 | "name": "Fabien Potencier", 1807 | "email": "fabien@symfony.com" 1808 | }, 1809 | { 1810 | "name": "Symfony Community", 1811 | "homepage": "https://symfony.com/contributors" 1812 | } 1813 | ], 1814 | "description": "Symfony Process Component", 1815 | "homepage": "https://symfony.com", 1816 | "time": "2019-01-24T22:05:03+00:00" 1817 | }, 1818 | { 1819 | "name": "symfony/routing", 1820 | "version": "v4.2.3", 1821 | "source": { 1822 | "type": "git", 1823 | "url": "https://github.com/symfony/routing.git", 1824 | "reference": "7f8e44fc498972466f0841c3e48dc555f23bdf53" 1825 | }, 1826 | "dist": { 1827 | "type": "zip", 1828 | "url": "https://api.github.com/repos/symfony/routing/zipball/7f8e44fc498972466f0841c3e48dc555f23bdf53", 1829 | "reference": "7f8e44fc498972466f0841c3e48dc555f23bdf53", 1830 | "shasum": "" 1831 | }, 1832 | "require": { 1833 | "php": "^7.1.3" 1834 | }, 1835 | "conflict": { 1836 | "symfony/config": "<4.2", 1837 | "symfony/dependency-injection": "<3.4", 1838 | "symfony/yaml": "<3.4" 1839 | }, 1840 | "require-dev": { 1841 | "doctrine/annotations": "~1.0", 1842 | "psr/log": "~1.0", 1843 | "symfony/config": "~4.2", 1844 | "symfony/dependency-injection": "~3.4|~4.0", 1845 | "symfony/expression-language": "~3.4|~4.0", 1846 | "symfony/http-foundation": "~3.4|~4.0", 1847 | "symfony/yaml": "~3.4|~4.0" 1848 | }, 1849 | "suggest": { 1850 | "doctrine/annotations": "For using the annotation loader", 1851 | "symfony/config": "For using the all-in-one router or any loader", 1852 | "symfony/dependency-injection": "For loading routes from a service", 1853 | "symfony/expression-language": "For using expression matching", 1854 | "symfony/http-foundation": "For using a Symfony Request object", 1855 | "symfony/yaml": "For using the YAML loader" 1856 | }, 1857 | "type": "library", 1858 | "extra": { 1859 | "branch-alias": { 1860 | "dev-master": "4.2-dev" 1861 | } 1862 | }, 1863 | "autoload": { 1864 | "psr-4": { 1865 | "Symfony\\Component\\Routing\\": "" 1866 | }, 1867 | "exclude-from-classmap": [ 1868 | "/Tests/" 1869 | ] 1870 | }, 1871 | "notification-url": "https://packagist.org/downloads/", 1872 | "license": [ 1873 | "MIT" 1874 | ], 1875 | "authors": [ 1876 | { 1877 | "name": "Fabien Potencier", 1878 | "email": "fabien@symfony.com" 1879 | }, 1880 | { 1881 | "name": "Symfony Community", 1882 | "homepage": "https://symfony.com/contributors" 1883 | } 1884 | ], 1885 | "description": "Symfony Routing Component", 1886 | "homepage": "https://symfony.com", 1887 | "keywords": [ 1888 | "router", 1889 | "routing", 1890 | "uri", 1891 | "url" 1892 | ], 1893 | "time": "2019-01-29T09:49:29+00:00" 1894 | }, 1895 | { 1896 | "name": "symfony/translation", 1897 | "version": "v4.2.3", 1898 | "source": { 1899 | "type": "git", 1900 | "url": "https://github.com/symfony/translation.git", 1901 | "reference": "23fd7aac70d99a17a8e6473a41fec8fab3331050" 1902 | }, 1903 | "dist": { 1904 | "type": "zip", 1905 | "url": "https://api.github.com/repos/symfony/translation/zipball/23fd7aac70d99a17a8e6473a41fec8fab3331050", 1906 | "reference": "23fd7aac70d99a17a8e6473a41fec8fab3331050", 1907 | "shasum": "" 1908 | }, 1909 | "require": { 1910 | "php": "^7.1.3", 1911 | "symfony/contracts": "^1.0.2", 1912 | "symfony/polyfill-mbstring": "~1.0" 1913 | }, 1914 | "conflict": { 1915 | "symfony/config": "<3.4", 1916 | "symfony/dependency-injection": "<3.4", 1917 | "symfony/yaml": "<3.4" 1918 | }, 1919 | "provide": { 1920 | "symfony/translation-contracts-implementation": "1.0" 1921 | }, 1922 | "require-dev": { 1923 | "psr/log": "~1.0", 1924 | "symfony/config": "~3.4|~4.0", 1925 | "symfony/console": "~3.4|~4.0", 1926 | "symfony/dependency-injection": "~3.4|~4.0", 1927 | "symfony/finder": "~2.8|~3.0|~4.0", 1928 | "symfony/intl": "~3.4|~4.0", 1929 | "symfony/yaml": "~3.4|~4.0" 1930 | }, 1931 | "suggest": { 1932 | "psr/log-implementation": "To use logging capability in translator", 1933 | "symfony/config": "", 1934 | "symfony/yaml": "" 1935 | }, 1936 | "type": "library", 1937 | "extra": { 1938 | "branch-alias": { 1939 | "dev-master": "4.2-dev" 1940 | } 1941 | }, 1942 | "autoload": { 1943 | "psr-4": { 1944 | "Symfony\\Component\\Translation\\": "" 1945 | }, 1946 | "exclude-from-classmap": [ 1947 | "/Tests/" 1948 | ] 1949 | }, 1950 | "notification-url": "https://packagist.org/downloads/", 1951 | "license": [ 1952 | "MIT" 1953 | ], 1954 | "authors": [ 1955 | { 1956 | "name": "Fabien Potencier", 1957 | "email": "fabien@symfony.com" 1958 | }, 1959 | { 1960 | "name": "Symfony Community", 1961 | "homepage": "https://symfony.com/contributors" 1962 | } 1963 | ], 1964 | "description": "Symfony Translation Component", 1965 | "homepage": "https://symfony.com", 1966 | "time": "2019-01-27T23:11:39+00:00" 1967 | }, 1968 | { 1969 | "name": "symfony/var-dumper", 1970 | "version": "v4.2.3", 1971 | "source": { 1972 | "type": "git", 1973 | "url": "https://github.com/symfony/var-dumper.git", 1974 | "reference": "223bda89f9be41cf7033eeaf11bc61a280489c17" 1975 | }, 1976 | "dist": { 1977 | "type": "zip", 1978 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/223bda89f9be41cf7033eeaf11bc61a280489c17", 1979 | "reference": "223bda89f9be41cf7033eeaf11bc61a280489c17", 1980 | "shasum": "" 1981 | }, 1982 | "require": { 1983 | "php": "^7.1.3", 1984 | "symfony/polyfill-mbstring": "~1.0", 1985 | "symfony/polyfill-php72": "~1.5" 1986 | }, 1987 | "conflict": { 1988 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 1989 | "symfony/console": "<3.4" 1990 | }, 1991 | "require-dev": { 1992 | "ext-iconv": "*", 1993 | "symfony/console": "~3.4|~4.0", 1994 | "symfony/process": "~3.4|~4.0", 1995 | "twig/twig": "~1.34|~2.4" 1996 | }, 1997 | "suggest": { 1998 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 1999 | "ext-intl": "To show region name in time zone dump", 2000 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 2001 | }, 2002 | "bin": [ 2003 | "Resources/bin/var-dump-server" 2004 | ], 2005 | "type": "library", 2006 | "extra": { 2007 | "branch-alias": { 2008 | "dev-master": "4.2-dev" 2009 | } 2010 | }, 2011 | "autoload": { 2012 | "files": [ 2013 | "Resources/functions/dump.php" 2014 | ], 2015 | "psr-4": { 2016 | "Symfony\\Component\\VarDumper\\": "" 2017 | }, 2018 | "exclude-from-classmap": [ 2019 | "/Tests/" 2020 | ] 2021 | }, 2022 | "notification-url": "https://packagist.org/downloads/", 2023 | "license": [ 2024 | "MIT" 2025 | ], 2026 | "authors": [ 2027 | { 2028 | "name": "Nicolas Grekas", 2029 | "email": "p@tchwork.com" 2030 | }, 2031 | { 2032 | "name": "Symfony Community", 2033 | "homepage": "https://symfony.com/contributors" 2034 | } 2035 | ], 2036 | "description": "Symfony mechanism for exploring and dumping PHP variables", 2037 | "homepage": "https://symfony.com", 2038 | "keywords": [ 2039 | "debug", 2040 | "dump" 2041 | ], 2042 | "time": "2019-01-30T11:44:30+00:00" 2043 | }, 2044 | { 2045 | "name": "tijsverkoyen/css-to-inline-styles", 2046 | "version": "2.2.1", 2047 | "source": { 2048 | "type": "git", 2049 | "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", 2050 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757" 2051 | }, 2052 | "dist": { 2053 | "type": "zip", 2054 | "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 2055 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 2056 | "shasum": "" 2057 | }, 2058 | "require": { 2059 | "php": "^5.5 || ^7.0", 2060 | "symfony/css-selector": "^2.7 || ^3.0 || ^4.0" 2061 | }, 2062 | "require-dev": { 2063 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2064 | }, 2065 | "type": "library", 2066 | "extra": { 2067 | "branch-alias": { 2068 | "dev-master": "2.2.x-dev" 2069 | } 2070 | }, 2071 | "autoload": { 2072 | "psr-4": { 2073 | "TijsVerkoyen\\CssToInlineStyles\\": "src" 2074 | } 2075 | }, 2076 | "notification-url": "https://packagist.org/downloads/", 2077 | "license": [ 2078 | "BSD-3-Clause" 2079 | ], 2080 | "authors": [ 2081 | { 2082 | "name": "Tijs Verkoyen", 2083 | "email": "css_to_inline_styles@verkoyen.eu", 2084 | "role": "Developer" 2085 | } 2086 | ], 2087 | "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", 2088 | "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", 2089 | "time": "2017-11-27T11:13:29+00:00" 2090 | }, 2091 | { 2092 | "name": "vlucas/phpdotenv", 2093 | "version": "v3.3.2", 2094 | "source": { 2095 | "type": "git", 2096 | "url": "https://github.com/vlucas/phpdotenv.git", 2097 | "reference": "1ee9369cfbf26cfcf1f2515d98f15fab54e9647a" 2098 | }, 2099 | "dist": { 2100 | "type": "zip", 2101 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1ee9369cfbf26cfcf1f2515d98f15fab54e9647a", 2102 | "reference": "1ee9369cfbf26cfcf1f2515d98f15fab54e9647a", 2103 | "shasum": "" 2104 | }, 2105 | "require": { 2106 | "php": "^5.4 || ^7.0", 2107 | "phpoption/phpoption": "^1.5", 2108 | "symfony/polyfill-ctype": "^1.9" 2109 | }, 2110 | "require-dev": { 2111 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0" 2112 | }, 2113 | "type": "library", 2114 | "extra": { 2115 | "branch-alias": { 2116 | "dev-master": "3.3-dev" 2117 | } 2118 | }, 2119 | "autoload": { 2120 | "psr-4": { 2121 | "Dotenv\\": "src/" 2122 | } 2123 | }, 2124 | "notification-url": "https://packagist.org/downloads/", 2125 | "license": [ 2126 | "BSD-3-Clause" 2127 | ], 2128 | "authors": [ 2129 | { 2130 | "name": "Vance Lucas", 2131 | "email": "vance@vancelucas.com", 2132 | "homepage": "http://www.vancelucas.com" 2133 | } 2134 | ], 2135 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 2136 | "keywords": [ 2137 | "dotenv", 2138 | "env", 2139 | "environment" 2140 | ], 2141 | "time": "2019-01-30T10:43:17+00:00" 2142 | } 2143 | ], 2144 | "packages-dev": [ 2145 | { 2146 | "name": "doctrine/instantiator", 2147 | "version": "1.1.0", 2148 | "source": { 2149 | "type": "git", 2150 | "url": "https://github.com/doctrine/instantiator.git", 2151 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 2152 | }, 2153 | "dist": { 2154 | "type": "zip", 2155 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 2156 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 2157 | "shasum": "" 2158 | }, 2159 | "require": { 2160 | "php": "^7.1" 2161 | }, 2162 | "require-dev": { 2163 | "athletic/athletic": "~0.1.8", 2164 | "ext-pdo": "*", 2165 | "ext-phar": "*", 2166 | "phpunit/phpunit": "^6.2.3", 2167 | "squizlabs/php_codesniffer": "^3.0.2" 2168 | }, 2169 | "type": "library", 2170 | "extra": { 2171 | "branch-alias": { 2172 | "dev-master": "1.2.x-dev" 2173 | } 2174 | }, 2175 | "autoload": { 2176 | "psr-4": { 2177 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 2178 | } 2179 | }, 2180 | "notification-url": "https://packagist.org/downloads/", 2181 | "license": [ 2182 | "MIT" 2183 | ], 2184 | "authors": [ 2185 | { 2186 | "name": "Marco Pivetta", 2187 | "email": "ocramius@gmail.com", 2188 | "homepage": "http://ocramius.github.com/" 2189 | } 2190 | ], 2191 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 2192 | "homepage": "https://github.com/doctrine/instantiator", 2193 | "keywords": [ 2194 | "constructor", 2195 | "instantiate" 2196 | ], 2197 | "time": "2017-07-22T11:58:36+00:00" 2198 | }, 2199 | { 2200 | "name": "fzaninotto/faker", 2201 | "version": "v1.8.0", 2202 | "source": { 2203 | "type": "git", 2204 | "url": "https://github.com/fzaninotto/Faker.git", 2205 | "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de" 2206 | }, 2207 | "dist": { 2208 | "type": "zip", 2209 | "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de", 2210 | "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de", 2211 | "shasum": "" 2212 | }, 2213 | "require": { 2214 | "php": "^5.3.3 || ^7.0" 2215 | }, 2216 | "require-dev": { 2217 | "ext-intl": "*", 2218 | "phpunit/phpunit": "^4.8.35 || ^5.7", 2219 | "squizlabs/php_codesniffer": "^1.5" 2220 | }, 2221 | "type": "library", 2222 | "extra": { 2223 | "branch-alias": { 2224 | "dev-master": "1.8-dev" 2225 | } 2226 | }, 2227 | "autoload": { 2228 | "psr-4": { 2229 | "Faker\\": "src/Faker/" 2230 | } 2231 | }, 2232 | "notification-url": "https://packagist.org/downloads/", 2233 | "license": [ 2234 | "MIT" 2235 | ], 2236 | "authors": [ 2237 | { 2238 | "name": "François Zaninotto" 2239 | } 2240 | ], 2241 | "description": "Faker is a PHP library that generates fake data for you.", 2242 | "keywords": [ 2243 | "data", 2244 | "faker", 2245 | "fixtures" 2246 | ], 2247 | "time": "2018-07-12T10:23:15+00:00" 2248 | }, 2249 | { 2250 | "name": "hamcrest/hamcrest-php", 2251 | "version": "v2.0.0", 2252 | "source": { 2253 | "type": "git", 2254 | "url": "https://github.com/hamcrest/hamcrest-php.git", 2255 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" 2256 | }, 2257 | "dist": { 2258 | "type": "zip", 2259 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", 2260 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", 2261 | "shasum": "" 2262 | }, 2263 | "require": { 2264 | "php": "^5.3|^7.0" 2265 | }, 2266 | "replace": { 2267 | "cordoval/hamcrest-php": "*", 2268 | "davedevelopment/hamcrest-php": "*", 2269 | "kodova/hamcrest-php": "*" 2270 | }, 2271 | "require-dev": { 2272 | "phpunit/php-file-iterator": "1.3.3", 2273 | "phpunit/phpunit": "~4.0", 2274 | "satooshi/php-coveralls": "^1.0" 2275 | }, 2276 | "type": "library", 2277 | "extra": { 2278 | "branch-alias": { 2279 | "dev-master": "2.0-dev" 2280 | } 2281 | }, 2282 | "autoload": { 2283 | "classmap": [ 2284 | "hamcrest" 2285 | ] 2286 | }, 2287 | "notification-url": "https://packagist.org/downloads/", 2288 | "license": [ 2289 | "BSD" 2290 | ], 2291 | "description": "This is the PHP port of Hamcrest Matchers", 2292 | "keywords": [ 2293 | "test" 2294 | ], 2295 | "time": "2016-01-20T08:20:44+00:00" 2296 | }, 2297 | { 2298 | "name": "mockery/mockery", 2299 | "version": "1.2.2", 2300 | "source": { 2301 | "type": "git", 2302 | "url": "https://github.com/mockery/mockery.git", 2303 | "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2" 2304 | }, 2305 | "dist": { 2306 | "type": "zip", 2307 | "url": "https://api.github.com/repos/mockery/mockery/zipball/0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", 2308 | "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", 2309 | "shasum": "" 2310 | }, 2311 | "require": { 2312 | "hamcrest/hamcrest-php": "~2.0", 2313 | "lib-pcre": ">=7.0", 2314 | "php": ">=5.6.0" 2315 | }, 2316 | "require-dev": { 2317 | "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" 2318 | }, 2319 | "type": "library", 2320 | "extra": { 2321 | "branch-alias": { 2322 | "dev-master": "1.0.x-dev" 2323 | } 2324 | }, 2325 | "autoload": { 2326 | "psr-0": { 2327 | "Mockery": "library/" 2328 | } 2329 | }, 2330 | "notification-url": "https://packagist.org/downloads/", 2331 | "license": [ 2332 | "BSD-3-Clause" 2333 | ], 2334 | "authors": [ 2335 | { 2336 | "name": "Pádraic Brady", 2337 | "email": "padraic.brady@gmail.com", 2338 | "homepage": "http://blog.astrumfutura.com" 2339 | }, 2340 | { 2341 | "name": "Dave Marshall", 2342 | "email": "dave.marshall@atstsolutions.co.uk", 2343 | "homepage": "http://davedevelopment.co.uk" 2344 | } 2345 | ], 2346 | "description": "Mockery is a simple yet flexible PHP mock object framework", 2347 | "homepage": "https://github.com/mockery/mockery", 2348 | "keywords": [ 2349 | "BDD", 2350 | "TDD", 2351 | "library", 2352 | "mock", 2353 | "mock objects", 2354 | "mockery", 2355 | "stub", 2356 | "test", 2357 | "test double", 2358 | "testing" 2359 | ], 2360 | "time": "2019-02-13T09:37:52+00:00" 2361 | }, 2362 | { 2363 | "name": "myclabs/deep-copy", 2364 | "version": "1.8.1", 2365 | "source": { 2366 | "type": "git", 2367 | "url": "https://github.com/myclabs/DeepCopy.git", 2368 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" 2369 | }, 2370 | "dist": { 2371 | "type": "zip", 2372 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 2373 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 2374 | "shasum": "" 2375 | }, 2376 | "require": { 2377 | "php": "^7.1" 2378 | }, 2379 | "replace": { 2380 | "myclabs/deep-copy": "self.version" 2381 | }, 2382 | "require-dev": { 2383 | "doctrine/collections": "^1.0", 2384 | "doctrine/common": "^2.6", 2385 | "phpunit/phpunit": "^7.1" 2386 | }, 2387 | "type": "library", 2388 | "autoload": { 2389 | "psr-4": { 2390 | "DeepCopy\\": "src/DeepCopy/" 2391 | }, 2392 | "files": [ 2393 | "src/DeepCopy/deep_copy.php" 2394 | ] 2395 | }, 2396 | "notification-url": "https://packagist.org/downloads/", 2397 | "license": [ 2398 | "MIT" 2399 | ], 2400 | "description": "Create deep copies (clones) of your objects", 2401 | "keywords": [ 2402 | "clone", 2403 | "copy", 2404 | "duplicate", 2405 | "object", 2406 | "object graph" 2407 | ], 2408 | "time": "2018-06-11T23:09:50+00:00" 2409 | }, 2410 | { 2411 | "name": "orchestra/testbench", 2412 | "version": "v3.8.1", 2413 | "source": { 2414 | "type": "git", 2415 | "url": "https://github.com/orchestral/testbench.git", 2416 | "reference": "2a79dc414c27457e2c7500c763eba2594b51f14c" 2417 | }, 2418 | "dist": { 2419 | "type": "zip", 2420 | "url": "https://api.github.com/repos/orchestral/testbench/zipball/2a79dc414c27457e2c7500c763eba2594b51f14c", 2421 | "reference": "2a79dc414c27457e2c7500c763eba2594b51f14c", 2422 | "shasum": "" 2423 | }, 2424 | "require": { 2425 | "laravel/framework": "~5.8.2", 2426 | "mockery/mockery": "^1.0", 2427 | "orchestra/testbench-core": "~3.8.1", 2428 | "php": ">=7.1", 2429 | "phpunit/phpunit": "^7.5 || ^8.0" 2430 | }, 2431 | "type": "library", 2432 | "extra": { 2433 | "branch-alias": { 2434 | "dev-master": "3.8-dev" 2435 | } 2436 | }, 2437 | "notification-url": "https://packagist.org/downloads/", 2438 | "license": [ 2439 | "MIT" 2440 | ], 2441 | "authors": [ 2442 | { 2443 | "name": "Mior Muhammad Zaki", 2444 | "email": "crynobone@gmail.com", 2445 | "homepage": "https://github.com/crynobone" 2446 | } 2447 | ], 2448 | "description": "Laravel Testing Helper for Packages Development", 2449 | "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", 2450 | "keywords": [ 2451 | "BDD", 2452 | "TDD", 2453 | "laravel", 2454 | "orchestra-platform", 2455 | "orchestral", 2456 | "testing" 2457 | ], 2458 | "time": "2019-02-28T01:19:16+00:00" 2459 | }, 2460 | { 2461 | "name": "orchestra/testbench-core", 2462 | "version": "v3.8.1", 2463 | "source": { 2464 | "type": "git", 2465 | "url": "https://github.com/orchestral/testbench-core.git", 2466 | "reference": "51192972746beb3766327bb84838998d3a59e99c" 2467 | }, 2468 | "dist": { 2469 | "type": "zip", 2470 | "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/51192972746beb3766327bb84838998d3a59e99c", 2471 | "reference": "51192972746beb3766327bb84838998d3a59e99c", 2472 | "shasum": "" 2473 | }, 2474 | "require": { 2475 | "fzaninotto/faker": "^1.4", 2476 | "php": ">=7.1" 2477 | }, 2478 | "require-dev": { 2479 | "laravel/framework": "~5.8.0", 2480 | "mockery/mockery": "^1.0", 2481 | "phpunit/phpunit": "^7.5 || ^8.0" 2482 | }, 2483 | "suggest": { 2484 | "laravel/framework": "Required for testing (~5.8.0).", 2485 | "mockery/mockery": "Allow to use Mockery for testing (^1.0).", 2486 | "orchestra/testbench-browser-kit": "Allow to use legacy Laravel BrowserKit for testing (^3.8).", 2487 | "orchestra/testbench-dusk": "Allow to use Laravel Dusk for testing (^3.8).", 2488 | "phpunit/phpunit": "Allow to use PHPUnit for testing (^7.5 || ^8.0)." 2489 | }, 2490 | "type": "library", 2491 | "extra": { 2492 | "branch-alias": { 2493 | "dev-master": "3.8-dev" 2494 | } 2495 | }, 2496 | "autoload": { 2497 | "psr-4": { 2498 | "Orchestra\\Testbench\\": "src/" 2499 | } 2500 | }, 2501 | "notification-url": "https://packagist.org/downloads/", 2502 | "license": [ 2503 | "MIT" 2504 | ], 2505 | "authors": [ 2506 | { 2507 | "name": "Mior Muhammad Zaki", 2508 | "email": "crynobone@gmail.com", 2509 | "homepage": "https://github.com/crynobone" 2510 | } 2511 | ], 2512 | "description": "Testing Helper for Laravel Development", 2513 | "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", 2514 | "keywords": [ 2515 | "BDD", 2516 | "TDD", 2517 | "laravel", 2518 | "orchestra-platform", 2519 | "orchestral", 2520 | "testing" 2521 | ], 2522 | "time": "2019-02-28T00:40:46+00:00" 2523 | }, 2524 | { 2525 | "name": "phar-io/manifest", 2526 | "version": "1.0.3", 2527 | "source": { 2528 | "type": "git", 2529 | "url": "https://github.com/phar-io/manifest.git", 2530 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 2531 | }, 2532 | "dist": { 2533 | "type": "zip", 2534 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 2535 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 2536 | "shasum": "" 2537 | }, 2538 | "require": { 2539 | "ext-dom": "*", 2540 | "ext-phar": "*", 2541 | "phar-io/version": "^2.0", 2542 | "php": "^5.6 || ^7.0" 2543 | }, 2544 | "type": "library", 2545 | "extra": { 2546 | "branch-alias": { 2547 | "dev-master": "1.0.x-dev" 2548 | } 2549 | }, 2550 | "autoload": { 2551 | "classmap": [ 2552 | "src/" 2553 | ] 2554 | }, 2555 | "notification-url": "https://packagist.org/downloads/", 2556 | "license": [ 2557 | "BSD-3-Clause" 2558 | ], 2559 | "authors": [ 2560 | { 2561 | "name": "Arne Blankerts", 2562 | "email": "arne@blankerts.de", 2563 | "role": "Developer" 2564 | }, 2565 | { 2566 | "name": "Sebastian Heuer", 2567 | "email": "sebastian@phpeople.de", 2568 | "role": "Developer" 2569 | }, 2570 | { 2571 | "name": "Sebastian Bergmann", 2572 | "email": "sebastian@phpunit.de", 2573 | "role": "Developer" 2574 | } 2575 | ], 2576 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 2577 | "time": "2018-07-08T19:23:20+00:00" 2578 | }, 2579 | { 2580 | "name": "phar-io/version", 2581 | "version": "2.0.1", 2582 | "source": { 2583 | "type": "git", 2584 | "url": "https://github.com/phar-io/version.git", 2585 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 2586 | }, 2587 | "dist": { 2588 | "type": "zip", 2589 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 2590 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 2591 | "shasum": "" 2592 | }, 2593 | "require": { 2594 | "php": "^5.6 || ^7.0" 2595 | }, 2596 | "type": "library", 2597 | "autoload": { 2598 | "classmap": [ 2599 | "src/" 2600 | ] 2601 | }, 2602 | "notification-url": "https://packagist.org/downloads/", 2603 | "license": [ 2604 | "BSD-3-Clause" 2605 | ], 2606 | "authors": [ 2607 | { 2608 | "name": "Arne Blankerts", 2609 | "email": "arne@blankerts.de", 2610 | "role": "Developer" 2611 | }, 2612 | { 2613 | "name": "Sebastian Heuer", 2614 | "email": "sebastian@phpeople.de", 2615 | "role": "Developer" 2616 | }, 2617 | { 2618 | "name": "Sebastian Bergmann", 2619 | "email": "sebastian@phpunit.de", 2620 | "role": "Developer" 2621 | } 2622 | ], 2623 | "description": "Library for handling version information and constraints", 2624 | "time": "2018-07-08T19:19:57+00:00" 2625 | }, 2626 | { 2627 | "name": "phpdocumentor/reflection-common", 2628 | "version": "1.0.1", 2629 | "source": { 2630 | "type": "git", 2631 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 2632 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 2633 | }, 2634 | "dist": { 2635 | "type": "zip", 2636 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2637 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2638 | "shasum": "" 2639 | }, 2640 | "require": { 2641 | "php": ">=5.5" 2642 | }, 2643 | "require-dev": { 2644 | "phpunit/phpunit": "^4.6" 2645 | }, 2646 | "type": "library", 2647 | "extra": { 2648 | "branch-alias": { 2649 | "dev-master": "1.0.x-dev" 2650 | } 2651 | }, 2652 | "autoload": { 2653 | "psr-4": { 2654 | "phpDocumentor\\Reflection\\": [ 2655 | "src" 2656 | ] 2657 | } 2658 | }, 2659 | "notification-url": "https://packagist.org/downloads/", 2660 | "license": [ 2661 | "MIT" 2662 | ], 2663 | "authors": [ 2664 | { 2665 | "name": "Jaap van Otterdijk", 2666 | "email": "opensource@ijaap.nl" 2667 | } 2668 | ], 2669 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2670 | "homepage": "http://www.phpdoc.org", 2671 | "keywords": [ 2672 | "FQSEN", 2673 | "phpDocumentor", 2674 | "phpdoc", 2675 | "reflection", 2676 | "static analysis" 2677 | ], 2678 | "time": "2017-09-11T18:02:19+00:00" 2679 | }, 2680 | { 2681 | "name": "phpdocumentor/reflection-docblock", 2682 | "version": "4.3.0", 2683 | "source": { 2684 | "type": "git", 2685 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2686 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 2687 | }, 2688 | "dist": { 2689 | "type": "zip", 2690 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 2691 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 2692 | "shasum": "" 2693 | }, 2694 | "require": { 2695 | "php": "^7.0", 2696 | "phpdocumentor/reflection-common": "^1.0.0", 2697 | "phpdocumentor/type-resolver": "^0.4.0", 2698 | "webmozart/assert": "^1.0" 2699 | }, 2700 | "require-dev": { 2701 | "doctrine/instantiator": "~1.0.5", 2702 | "mockery/mockery": "^1.0", 2703 | "phpunit/phpunit": "^6.4" 2704 | }, 2705 | "type": "library", 2706 | "extra": { 2707 | "branch-alias": { 2708 | "dev-master": "4.x-dev" 2709 | } 2710 | }, 2711 | "autoload": { 2712 | "psr-4": { 2713 | "phpDocumentor\\Reflection\\": [ 2714 | "src/" 2715 | ] 2716 | } 2717 | }, 2718 | "notification-url": "https://packagist.org/downloads/", 2719 | "license": [ 2720 | "MIT" 2721 | ], 2722 | "authors": [ 2723 | { 2724 | "name": "Mike van Riel", 2725 | "email": "me@mikevanriel.com" 2726 | } 2727 | ], 2728 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2729 | "time": "2017-11-30T07:14:17+00:00" 2730 | }, 2731 | { 2732 | "name": "phpdocumentor/type-resolver", 2733 | "version": "0.4.0", 2734 | "source": { 2735 | "type": "git", 2736 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2737 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 2738 | }, 2739 | "dist": { 2740 | "type": "zip", 2741 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 2742 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 2743 | "shasum": "" 2744 | }, 2745 | "require": { 2746 | "php": "^5.5 || ^7.0", 2747 | "phpdocumentor/reflection-common": "^1.0" 2748 | }, 2749 | "require-dev": { 2750 | "mockery/mockery": "^0.9.4", 2751 | "phpunit/phpunit": "^5.2||^4.8.24" 2752 | }, 2753 | "type": "library", 2754 | "extra": { 2755 | "branch-alias": { 2756 | "dev-master": "1.0.x-dev" 2757 | } 2758 | }, 2759 | "autoload": { 2760 | "psr-4": { 2761 | "phpDocumentor\\Reflection\\": [ 2762 | "src/" 2763 | ] 2764 | } 2765 | }, 2766 | "notification-url": "https://packagist.org/downloads/", 2767 | "license": [ 2768 | "MIT" 2769 | ], 2770 | "authors": [ 2771 | { 2772 | "name": "Mike van Riel", 2773 | "email": "me@mikevanriel.com" 2774 | } 2775 | ], 2776 | "time": "2017-07-14T14:27:02+00:00" 2777 | }, 2778 | { 2779 | "name": "phpspec/prophecy", 2780 | "version": "1.8.0", 2781 | "source": { 2782 | "type": "git", 2783 | "url": "https://github.com/phpspec/prophecy.git", 2784 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 2785 | }, 2786 | "dist": { 2787 | "type": "zip", 2788 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2789 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 2790 | "shasum": "" 2791 | }, 2792 | "require": { 2793 | "doctrine/instantiator": "^1.0.2", 2794 | "php": "^5.3|^7.0", 2795 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 2796 | "sebastian/comparator": "^1.1|^2.0|^3.0", 2797 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 2798 | }, 2799 | "require-dev": { 2800 | "phpspec/phpspec": "^2.5|^3.2", 2801 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 2802 | }, 2803 | "type": "library", 2804 | "extra": { 2805 | "branch-alias": { 2806 | "dev-master": "1.8.x-dev" 2807 | } 2808 | }, 2809 | "autoload": { 2810 | "psr-0": { 2811 | "Prophecy\\": "src/" 2812 | } 2813 | }, 2814 | "notification-url": "https://packagist.org/downloads/", 2815 | "license": [ 2816 | "MIT" 2817 | ], 2818 | "authors": [ 2819 | { 2820 | "name": "Konstantin Kudryashov", 2821 | "email": "ever.zet@gmail.com", 2822 | "homepage": "http://everzet.com" 2823 | }, 2824 | { 2825 | "name": "Marcello Duarte", 2826 | "email": "marcello.duarte@gmail.com" 2827 | } 2828 | ], 2829 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2830 | "homepage": "https://github.com/phpspec/prophecy", 2831 | "keywords": [ 2832 | "Double", 2833 | "Dummy", 2834 | "fake", 2835 | "mock", 2836 | "spy", 2837 | "stub" 2838 | ], 2839 | "time": "2018-08-05T17:53:17+00:00" 2840 | }, 2841 | { 2842 | "name": "phpunit/php-code-coverage", 2843 | "version": "7.0.3", 2844 | "source": { 2845 | "type": "git", 2846 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2847 | "reference": "0317a769a81845c390e19684d9ba25d7f6aa4707" 2848 | }, 2849 | "dist": { 2850 | "type": "zip", 2851 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0317a769a81845c390e19684d9ba25d7f6aa4707", 2852 | "reference": "0317a769a81845c390e19684d9ba25d7f6aa4707", 2853 | "shasum": "" 2854 | }, 2855 | "require": { 2856 | "ext-dom": "*", 2857 | "ext-xmlwriter": "*", 2858 | "php": "^7.2", 2859 | "phpunit/php-file-iterator": "^2.0.2", 2860 | "phpunit/php-text-template": "^1.2.1", 2861 | "phpunit/php-token-stream": "^3.0.1", 2862 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 2863 | "sebastian/environment": "^4.1", 2864 | "sebastian/version": "^2.0.1", 2865 | "theseer/tokenizer": "^1.1" 2866 | }, 2867 | "require-dev": { 2868 | "phpunit/phpunit": "^8.0" 2869 | }, 2870 | "suggest": { 2871 | "ext-xdebug": "^2.6.1" 2872 | }, 2873 | "type": "library", 2874 | "extra": { 2875 | "branch-alias": { 2876 | "dev-master": "7.0-dev" 2877 | } 2878 | }, 2879 | "autoload": { 2880 | "classmap": [ 2881 | "src/" 2882 | ] 2883 | }, 2884 | "notification-url": "https://packagist.org/downloads/", 2885 | "license": [ 2886 | "BSD-3-Clause" 2887 | ], 2888 | "authors": [ 2889 | { 2890 | "name": "Sebastian Bergmann", 2891 | "email": "sebastian@phpunit.de", 2892 | "role": "lead" 2893 | } 2894 | ], 2895 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2896 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2897 | "keywords": [ 2898 | "coverage", 2899 | "testing", 2900 | "xunit" 2901 | ], 2902 | "time": "2019-02-26T07:38:26+00:00" 2903 | }, 2904 | { 2905 | "name": "phpunit/php-file-iterator", 2906 | "version": "2.0.2", 2907 | "source": { 2908 | "type": "git", 2909 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2910 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 2911 | }, 2912 | "dist": { 2913 | "type": "zip", 2914 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 2915 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 2916 | "shasum": "" 2917 | }, 2918 | "require": { 2919 | "php": "^7.1" 2920 | }, 2921 | "require-dev": { 2922 | "phpunit/phpunit": "^7.1" 2923 | }, 2924 | "type": "library", 2925 | "extra": { 2926 | "branch-alias": { 2927 | "dev-master": "2.0.x-dev" 2928 | } 2929 | }, 2930 | "autoload": { 2931 | "classmap": [ 2932 | "src/" 2933 | ] 2934 | }, 2935 | "notification-url": "https://packagist.org/downloads/", 2936 | "license": [ 2937 | "BSD-3-Clause" 2938 | ], 2939 | "authors": [ 2940 | { 2941 | "name": "Sebastian Bergmann", 2942 | "email": "sebastian@phpunit.de", 2943 | "role": "lead" 2944 | } 2945 | ], 2946 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2947 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2948 | "keywords": [ 2949 | "filesystem", 2950 | "iterator" 2951 | ], 2952 | "time": "2018-09-13T20:33:42+00:00" 2953 | }, 2954 | { 2955 | "name": "phpunit/php-text-template", 2956 | "version": "1.2.1", 2957 | "source": { 2958 | "type": "git", 2959 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2960 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2961 | }, 2962 | "dist": { 2963 | "type": "zip", 2964 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2965 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2966 | "shasum": "" 2967 | }, 2968 | "require": { 2969 | "php": ">=5.3.3" 2970 | }, 2971 | "type": "library", 2972 | "autoload": { 2973 | "classmap": [ 2974 | "src/" 2975 | ] 2976 | }, 2977 | "notification-url": "https://packagist.org/downloads/", 2978 | "license": [ 2979 | "BSD-3-Clause" 2980 | ], 2981 | "authors": [ 2982 | { 2983 | "name": "Sebastian Bergmann", 2984 | "email": "sebastian@phpunit.de", 2985 | "role": "lead" 2986 | } 2987 | ], 2988 | "description": "Simple template engine.", 2989 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2990 | "keywords": [ 2991 | "template" 2992 | ], 2993 | "time": "2015-06-21T13:50:34+00:00" 2994 | }, 2995 | { 2996 | "name": "phpunit/php-timer", 2997 | "version": "2.1.1", 2998 | "source": { 2999 | "type": "git", 3000 | "url": "https://github.com/sebastianbergmann/php-timer.git", 3001 | "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059" 3002 | }, 3003 | "dist": { 3004 | "type": "zip", 3005 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059", 3006 | "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059", 3007 | "shasum": "" 3008 | }, 3009 | "require": { 3010 | "php": "^7.1" 3011 | }, 3012 | "require-dev": { 3013 | "phpunit/phpunit": "^7.0" 3014 | }, 3015 | "type": "library", 3016 | "extra": { 3017 | "branch-alias": { 3018 | "dev-master": "2.1-dev" 3019 | } 3020 | }, 3021 | "autoload": { 3022 | "classmap": [ 3023 | "src/" 3024 | ] 3025 | }, 3026 | "notification-url": "https://packagist.org/downloads/", 3027 | "license": [ 3028 | "BSD-3-Clause" 3029 | ], 3030 | "authors": [ 3031 | { 3032 | "name": "Sebastian Bergmann", 3033 | "email": "sebastian@phpunit.de", 3034 | "role": "lead" 3035 | } 3036 | ], 3037 | "description": "Utility class for timing", 3038 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 3039 | "keywords": [ 3040 | "timer" 3041 | ], 3042 | "time": "2019-02-20T10:12:59+00:00" 3043 | }, 3044 | { 3045 | "name": "phpunit/php-token-stream", 3046 | "version": "3.0.1", 3047 | "source": { 3048 | "type": "git", 3049 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 3050 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" 3051 | }, 3052 | "dist": { 3053 | "type": "zip", 3054 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", 3055 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", 3056 | "shasum": "" 3057 | }, 3058 | "require": { 3059 | "ext-tokenizer": "*", 3060 | "php": "^7.1" 3061 | }, 3062 | "require-dev": { 3063 | "phpunit/phpunit": "^7.0" 3064 | }, 3065 | "type": "library", 3066 | "extra": { 3067 | "branch-alias": { 3068 | "dev-master": "3.0-dev" 3069 | } 3070 | }, 3071 | "autoload": { 3072 | "classmap": [ 3073 | "src/" 3074 | ] 3075 | }, 3076 | "notification-url": "https://packagist.org/downloads/", 3077 | "license": [ 3078 | "BSD-3-Clause" 3079 | ], 3080 | "authors": [ 3081 | { 3082 | "name": "Sebastian Bergmann", 3083 | "email": "sebastian@phpunit.de" 3084 | } 3085 | ], 3086 | "description": "Wrapper around PHP's tokenizer extension.", 3087 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 3088 | "keywords": [ 3089 | "tokenizer" 3090 | ], 3091 | "time": "2018-10-30T05:52:18+00:00" 3092 | }, 3093 | { 3094 | "name": "phpunit/phpunit", 3095 | "version": "8.0.4", 3096 | "source": { 3097 | "type": "git", 3098 | "url": "https://github.com/sebastianbergmann/phpunit.git", 3099 | "reference": "a7af0201285445c9c73c4bdf869c486e36b41604" 3100 | }, 3101 | "dist": { 3102 | "type": "zip", 3103 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a7af0201285445c9c73c4bdf869c486e36b41604", 3104 | "reference": "a7af0201285445c9c73c4bdf869c486e36b41604", 3105 | "shasum": "" 3106 | }, 3107 | "require": { 3108 | "doctrine/instantiator": "^1.1", 3109 | "ext-dom": "*", 3110 | "ext-json": "*", 3111 | "ext-libxml": "*", 3112 | "ext-mbstring": "*", 3113 | "ext-xml": "*", 3114 | "ext-xmlwriter": "*", 3115 | "myclabs/deep-copy": "^1.7", 3116 | "phar-io/manifest": "^1.0.2", 3117 | "phar-io/version": "^2.0", 3118 | "php": "^7.2", 3119 | "phpspec/prophecy": "^1.7", 3120 | "phpunit/php-code-coverage": "^7.0", 3121 | "phpunit/php-file-iterator": "^2.0.1", 3122 | "phpunit/php-text-template": "^1.2.1", 3123 | "phpunit/php-timer": "^2.0", 3124 | "sebastian/comparator": "^3.0", 3125 | "sebastian/diff": "^3.0", 3126 | "sebastian/environment": "^4.1", 3127 | "sebastian/exporter": "^3.1", 3128 | "sebastian/global-state": "^3.0", 3129 | "sebastian/object-enumerator": "^3.0.3", 3130 | "sebastian/resource-operations": "^2.0", 3131 | "sebastian/version": "^2.0.1" 3132 | }, 3133 | "require-dev": { 3134 | "ext-pdo": "*" 3135 | }, 3136 | "suggest": { 3137 | "ext-soap": "*", 3138 | "ext-xdebug": "*", 3139 | "phpunit/php-invoker": "^2.0" 3140 | }, 3141 | "bin": [ 3142 | "phpunit" 3143 | ], 3144 | "type": "library", 3145 | "extra": { 3146 | "branch-alias": { 3147 | "dev-master": "8.0-dev" 3148 | } 3149 | }, 3150 | "autoload": { 3151 | "classmap": [ 3152 | "src/" 3153 | ] 3154 | }, 3155 | "notification-url": "https://packagist.org/downloads/", 3156 | "license": [ 3157 | "BSD-3-Clause" 3158 | ], 3159 | "authors": [ 3160 | { 3161 | "name": "Sebastian Bergmann", 3162 | "email": "sebastian@phpunit.de", 3163 | "role": "lead" 3164 | } 3165 | ], 3166 | "description": "The PHP Unit Testing framework.", 3167 | "homepage": "https://phpunit.de/", 3168 | "keywords": [ 3169 | "phpunit", 3170 | "testing", 3171 | "xunit" 3172 | ], 3173 | "time": "2019-02-18T09:23:05+00:00" 3174 | }, 3175 | { 3176 | "name": "sebastian/code-unit-reverse-lookup", 3177 | "version": "1.0.1", 3178 | "source": { 3179 | "type": "git", 3180 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 3181 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 3182 | }, 3183 | "dist": { 3184 | "type": "zip", 3185 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 3186 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 3187 | "shasum": "" 3188 | }, 3189 | "require": { 3190 | "php": "^5.6 || ^7.0" 3191 | }, 3192 | "require-dev": { 3193 | "phpunit/phpunit": "^5.7 || ^6.0" 3194 | }, 3195 | "type": "library", 3196 | "extra": { 3197 | "branch-alias": { 3198 | "dev-master": "1.0.x-dev" 3199 | } 3200 | }, 3201 | "autoload": { 3202 | "classmap": [ 3203 | "src/" 3204 | ] 3205 | }, 3206 | "notification-url": "https://packagist.org/downloads/", 3207 | "license": [ 3208 | "BSD-3-Clause" 3209 | ], 3210 | "authors": [ 3211 | { 3212 | "name": "Sebastian Bergmann", 3213 | "email": "sebastian@phpunit.de" 3214 | } 3215 | ], 3216 | "description": "Looks up which function or method a line of code belongs to", 3217 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 3218 | "time": "2017-03-04T06:30:41+00:00" 3219 | }, 3220 | { 3221 | "name": "sebastian/comparator", 3222 | "version": "3.0.2", 3223 | "source": { 3224 | "type": "git", 3225 | "url": "https://github.com/sebastianbergmann/comparator.git", 3226 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 3227 | }, 3228 | "dist": { 3229 | "type": "zip", 3230 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 3231 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 3232 | "shasum": "" 3233 | }, 3234 | "require": { 3235 | "php": "^7.1", 3236 | "sebastian/diff": "^3.0", 3237 | "sebastian/exporter": "^3.1" 3238 | }, 3239 | "require-dev": { 3240 | "phpunit/phpunit": "^7.1" 3241 | }, 3242 | "type": "library", 3243 | "extra": { 3244 | "branch-alias": { 3245 | "dev-master": "3.0-dev" 3246 | } 3247 | }, 3248 | "autoload": { 3249 | "classmap": [ 3250 | "src/" 3251 | ] 3252 | }, 3253 | "notification-url": "https://packagist.org/downloads/", 3254 | "license": [ 3255 | "BSD-3-Clause" 3256 | ], 3257 | "authors": [ 3258 | { 3259 | "name": "Jeff Welch", 3260 | "email": "whatthejeff@gmail.com" 3261 | }, 3262 | { 3263 | "name": "Volker Dusch", 3264 | "email": "github@wallbash.com" 3265 | }, 3266 | { 3267 | "name": "Bernhard Schussek", 3268 | "email": "bschussek@2bepublished.at" 3269 | }, 3270 | { 3271 | "name": "Sebastian Bergmann", 3272 | "email": "sebastian@phpunit.de" 3273 | } 3274 | ], 3275 | "description": "Provides the functionality to compare PHP values for equality", 3276 | "homepage": "https://github.com/sebastianbergmann/comparator", 3277 | "keywords": [ 3278 | "comparator", 3279 | "compare", 3280 | "equality" 3281 | ], 3282 | "time": "2018-07-12T15:12:46+00:00" 3283 | }, 3284 | { 3285 | "name": "sebastian/diff", 3286 | "version": "3.0.2", 3287 | "source": { 3288 | "type": "git", 3289 | "url": "https://github.com/sebastianbergmann/diff.git", 3290 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 3291 | }, 3292 | "dist": { 3293 | "type": "zip", 3294 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 3295 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 3296 | "shasum": "" 3297 | }, 3298 | "require": { 3299 | "php": "^7.1" 3300 | }, 3301 | "require-dev": { 3302 | "phpunit/phpunit": "^7.5 || ^8.0", 3303 | "symfony/process": "^2 || ^3.3 || ^4" 3304 | }, 3305 | "type": "library", 3306 | "extra": { 3307 | "branch-alias": { 3308 | "dev-master": "3.0-dev" 3309 | } 3310 | }, 3311 | "autoload": { 3312 | "classmap": [ 3313 | "src/" 3314 | ] 3315 | }, 3316 | "notification-url": "https://packagist.org/downloads/", 3317 | "license": [ 3318 | "BSD-3-Clause" 3319 | ], 3320 | "authors": [ 3321 | { 3322 | "name": "Kore Nordmann", 3323 | "email": "mail@kore-nordmann.de" 3324 | }, 3325 | { 3326 | "name": "Sebastian Bergmann", 3327 | "email": "sebastian@phpunit.de" 3328 | } 3329 | ], 3330 | "description": "Diff implementation", 3331 | "homepage": "https://github.com/sebastianbergmann/diff", 3332 | "keywords": [ 3333 | "diff", 3334 | "udiff", 3335 | "unidiff", 3336 | "unified diff" 3337 | ], 3338 | "time": "2019-02-04T06:01:07+00:00" 3339 | }, 3340 | { 3341 | "name": "sebastian/environment", 3342 | "version": "4.1.0", 3343 | "source": { 3344 | "type": "git", 3345 | "url": "https://github.com/sebastianbergmann/environment.git", 3346 | "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" 3347 | }, 3348 | "dist": { 3349 | "type": "zip", 3350 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", 3351 | "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", 3352 | "shasum": "" 3353 | }, 3354 | "require": { 3355 | "php": "^7.1" 3356 | }, 3357 | "require-dev": { 3358 | "phpunit/phpunit": "^7.5" 3359 | }, 3360 | "suggest": { 3361 | "ext-posix": "*" 3362 | }, 3363 | "type": "library", 3364 | "extra": { 3365 | "branch-alias": { 3366 | "dev-master": "4.1-dev" 3367 | } 3368 | }, 3369 | "autoload": { 3370 | "classmap": [ 3371 | "src/" 3372 | ] 3373 | }, 3374 | "notification-url": "https://packagist.org/downloads/", 3375 | "license": [ 3376 | "BSD-3-Clause" 3377 | ], 3378 | "authors": [ 3379 | { 3380 | "name": "Sebastian Bergmann", 3381 | "email": "sebastian@phpunit.de" 3382 | } 3383 | ], 3384 | "description": "Provides functionality to handle HHVM/PHP environments", 3385 | "homepage": "http://www.github.com/sebastianbergmann/environment", 3386 | "keywords": [ 3387 | "Xdebug", 3388 | "environment", 3389 | "hhvm" 3390 | ], 3391 | "time": "2019-02-01T05:27:49+00:00" 3392 | }, 3393 | { 3394 | "name": "sebastian/exporter", 3395 | "version": "3.1.0", 3396 | "source": { 3397 | "type": "git", 3398 | "url": "https://github.com/sebastianbergmann/exporter.git", 3399 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 3400 | }, 3401 | "dist": { 3402 | "type": "zip", 3403 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 3404 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 3405 | "shasum": "" 3406 | }, 3407 | "require": { 3408 | "php": "^7.0", 3409 | "sebastian/recursion-context": "^3.0" 3410 | }, 3411 | "require-dev": { 3412 | "ext-mbstring": "*", 3413 | "phpunit/phpunit": "^6.0" 3414 | }, 3415 | "type": "library", 3416 | "extra": { 3417 | "branch-alias": { 3418 | "dev-master": "3.1.x-dev" 3419 | } 3420 | }, 3421 | "autoload": { 3422 | "classmap": [ 3423 | "src/" 3424 | ] 3425 | }, 3426 | "notification-url": "https://packagist.org/downloads/", 3427 | "license": [ 3428 | "BSD-3-Clause" 3429 | ], 3430 | "authors": [ 3431 | { 3432 | "name": "Jeff Welch", 3433 | "email": "whatthejeff@gmail.com" 3434 | }, 3435 | { 3436 | "name": "Volker Dusch", 3437 | "email": "github@wallbash.com" 3438 | }, 3439 | { 3440 | "name": "Bernhard Schussek", 3441 | "email": "bschussek@2bepublished.at" 3442 | }, 3443 | { 3444 | "name": "Sebastian Bergmann", 3445 | "email": "sebastian@phpunit.de" 3446 | }, 3447 | { 3448 | "name": "Adam Harvey", 3449 | "email": "aharvey@php.net" 3450 | } 3451 | ], 3452 | "description": "Provides the functionality to export PHP variables for visualization", 3453 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 3454 | "keywords": [ 3455 | "export", 3456 | "exporter" 3457 | ], 3458 | "time": "2017-04-03T13:19:02+00:00" 3459 | }, 3460 | { 3461 | "name": "sebastian/global-state", 3462 | "version": "3.0.0", 3463 | "source": { 3464 | "type": "git", 3465 | "url": "https://github.com/sebastianbergmann/global-state.git", 3466 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" 3467 | }, 3468 | "dist": { 3469 | "type": "zip", 3470 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 3471 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 3472 | "shasum": "" 3473 | }, 3474 | "require": { 3475 | "php": "^7.2", 3476 | "sebastian/object-reflector": "^1.1.1", 3477 | "sebastian/recursion-context": "^3.0" 3478 | }, 3479 | "require-dev": { 3480 | "ext-dom": "*", 3481 | "phpunit/phpunit": "^8.0" 3482 | }, 3483 | "suggest": { 3484 | "ext-uopz": "*" 3485 | }, 3486 | "type": "library", 3487 | "extra": { 3488 | "branch-alias": { 3489 | "dev-master": "3.0-dev" 3490 | } 3491 | }, 3492 | "autoload": { 3493 | "classmap": [ 3494 | "src/" 3495 | ] 3496 | }, 3497 | "notification-url": "https://packagist.org/downloads/", 3498 | "license": [ 3499 | "BSD-3-Clause" 3500 | ], 3501 | "authors": [ 3502 | { 3503 | "name": "Sebastian Bergmann", 3504 | "email": "sebastian@phpunit.de" 3505 | } 3506 | ], 3507 | "description": "Snapshotting of global state", 3508 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 3509 | "keywords": [ 3510 | "global state" 3511 | ], 3512 | "time": "2019-02-01T05:30:01+00:00" 3513 | }, 3514 | { 3515 | "name": "sebastian/object-enumerator", 3516 | "version": "3.0.3", 3517 | "source": { 3518 | "type": "git", 3519 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 3520 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 3521 | }, 3522 | "dist": { 3523 | "type": "zip", 3524 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3525 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 3526 | "shasum": "" 3527 | }, 3528 | "require": { 3529 | "php": "^7.0", 3530 | "sebastian/object-reflector": "^1.1.1", 3531 | "sebastian/recursion-context": "^3.0" 3532 | }, 3533 | "require-dev": { 3534 | "phpunit/phpunit": "^6.0" 3535 | }, 3536 | "type": "library", 3537 | "extra": { 3538 | "branch-alias": { 3539 | "dev-master": "3.0.x-dev" 3540 | } 3541 | }, 3542 | "autoload": { 3543 | "classmap": [ 3544 | "src/" 3545 | ] 3546 | }, 3547 | "notification-url": "https://packagist.org/downloads/", 3548 | "license": [ 3549 | "BSD-3-Clause" 3550 | ], 3551 | "authors": [ 3552 | { 3553 | "name": "Sebastian Bergmann", 3554 | "email": "sebastian@phpunit.de" 3555 | } 3556 | ], 3557 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3558 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3559 | "time": "2017-08-03T12:35:26+00:00" 3560 | }, 3561 | { 3562 | "name": "sebastian/object-reflector", 3563 | "version": "1.1.1", 3564 | "source": { 3565 | "type": "git", 3566 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 3567 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 3568 | }, 3569 | "dist": { 3570 | "type": "zip", 3571 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 3572 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 3573 | "shasum": "" 3574 | }, 3575 | "require": { 3576 | "php": "^7.0" 3577 | }, 3578 | "require-dev": { 3579 | "phpunit/phpunit": "^6.0" 3580 | }, 3581 | "type": "library", 3582 | "extra": { 3583 | "branch-alias": { 3584 | "dev-master": "1.1-dev" 3585 | } 3586 | }, 3587 | "autoload": { 3588 | "classmap": [ 3589 | "src/" 3590 | ] 3591 | }, 3592 | "notification-url": "https://packagist.org/downloads/", 3593 | "license": [ 3594 | "BSD-3-Clause" 3595 | ], 3596 | "authors": [ 3597 | { 3598 | "name": "Sebastian Bergmann", 3599 | "email": "sebastian@phpunit.de" 3600 | } 3601 | ], 3602 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 3603 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 3604 | "time": "2017-03-29T09:07:27+00:00" 3605 | }, 3606 | { 3607 | "name": "sebastian/recursion-context", 3608 | "version": "3.0.0", 3609 | "source": { 3610 | "type": "git", 3611 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3612 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 3613 | }, 3614 | "dist": { 3615 | "type": "zip", 3616 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3617 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 3618 | "shasum": "" 3619 | }, 3620 | "require": { 3621 | "php": "^7.0" 3622 | }, 3623 | "require-dev": { 3624 | "phpunit/phpunit": "^6.0" 3625 | }, 3626 | "type": "library", 3627 | "extra": { 3628 | "branch-alias": { 3629 | "dev-master": "3.0.x-dev" 3630 | } 3631 | }, 3632 | "autoload": { 3633 | "classmap": [ 3634 | "src/" 3635 | ] 3636 | }, 3637 | "notification-url": "https://packagist.org/downloads/", 3638 | "license": [ 3639 | "BSD-3-Clause" 3640 | ], 3641 | "authors": [ 3642 | { 3643 | "name": "Jeff Welch", 3644 | "email": "whatthejeff@gmail.com" 3645 | }, 3646 | { 3647 | "name": "Sebastian Bergmann", 3648 | "email": "sebastian@phpunit.de" 3649 | }, 3650 | { 3651 | "name": "Adam Harvey", 3652 | "email": "aharvey@php.net" 3653 | } 3654 | ], 3655 | "description": "Provides functionality to recursively process PHP variables", 3656 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3657 | "time": "2017-03-03T06:23:57+00:00" 3658 | }, 3659 | { 3660 | "name": "sebastian/resource-operations", 3661 | "version": "2.0.1", 3662 | "source": { 3663 | "type": "git", 3664 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3665 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 3666 | }, 3667 | "dist": { 3668 | "type": "zip", 3669 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 3670 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 3671 | "shasum": "" 3672 | }, 3673 | "require": { 3674 | "php": "^7.1" 3675 | }, 3676 | "type": "library", 3677 | "extra": { 3678 | "branch-alias": { 3679 | "dev-master": "2.0-dev" 3680 | } 3681 | }, 3682 | "autoload": { 3683 | "classmap": [ 3684 | "src/" 3685 | ] 3686 | }, 3687 | "notification-url": "https://packagist.org/downloads/", 3688 | "license": [ 3689 | "BSD-3-Clause" 3690 | ], 3691 | "authors": [ 3692 | { 3693 | "name": "Sebastian Bergmann", 3694 | "email": "sebastian@phpunit.de" 3695 | } 3696 | ], 3697 | "description": "Provides a list of PHP built-in functions that operate on resources", 3698 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3699 | "time": "2018-10-04T04:07:39+00:00" 3700 | }, 3701 | { 3702 | "name": "sebastian/version", 3703 | "version": "2.0.1", 3704 | "source": { 3705 | "type": "git", 3706 | "url": "https://github.com/sebastianbergmann/version.git", 3707 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3708 | }, 3709 | "dist": { 3710 | "type": "zip", 3711 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3712 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3713 | "shasum": "" 3714 | }, 3715 | "require": { 3716 | "php": ">=5.6" 3717 | }, 3718 | "type": "library", 3719 | "extra": { 3720 | "branch-alias": { 3721 | "dev-master": "2.0.x-dev" 3722 | } 3723 | }, 3724 | "autoload": { 3725 | "classmap": [ 3726 | "src/" 3727 | ] 3728 | }, 3729 | "notification-url": "https://packagist.org/downloads/", 3730 | "license": [ 3731 | "BSD-3-Clause" 3732 | ], 3733 | "authors": [ 3734 | { 3735 | "name": "Sebastian Bergmann", 3736 | "email": "sebastian@phpunit.de", 3737 | "role": "lead" 3738 | } 3739 | ], 3740 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3741 | "homepage": "https://github.com/sebastianbergmann/version", 3742 | "time": "2016-10-03T07:35:21+00:00" 3743 | }, 3744 | { 3745 | "name": "theseer/tokenizer", 3746 | "version": "1.1.0", 3747 | "source": { 3748 | "type": "git", 3749 | "url": "https://github.com/theseer/tokenizer.git", 3750 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 3751 | }, 3752 | "dist": { 3753 | "type": "zip", 3754 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3755 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 3756 | "shasum": "" 3757 | }, 3758 | "require": { 3759 | "ext-dom": "*", 3760 | "ext-tokenizer": "*", 3761 | "ext-xmlwriter": "*", 3762 | "php": "^7.0" 3763 | }, 3764 | "type": "library", 3765 | "autoload": { 3766 | "classmap": [ 3767 | "src/" 3768 | ] 3769 | }, 3770 | "notification-url": "https://packagist.org/downloads/", 3771 | "license": [ 3772 | "BSD-3-Clause" 3773 | ], 3774 | "authors": [ 3775 | { 3776 | "name": "Arne Blankerts", 3777 | "email": "arne@blankerts.de", 3778 | "role": "Developer" 3779 | } 3780 | ], 3781 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3782 | "time": "2017-04-07T12:08:54+00:00" 3783 | }, 3784 | { 3785 | "name": "webmozart/assert", 3786 | "version": "1.4.0", 3787 | "source": { 3788 | "type": "git", 3789 | "url": "https://github.com/webmozart/assert.git", 3790 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" 3791 | }, 3792 | "dist": { 3793 | "type": "zip", 3794 | "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", 3795 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", 3796 | "shasum": "" 3797 | }, 3798 | "require": { 3799 | "php": "^5.3.3 || ^7.0", 3800 | "symfony/polyfill-ctype": "^1.8" 3801 | }, 3802 | "require-dev": { 3803 | "phpunit/phpunit": "^4.6", 3804 | "sebastian/version": "^1.0.1" 3805 | }, 3806 | "type": "library", 3807 | "extra": { 3808 | "branch-alias": { 3809 | "dev-master": "1.3-dev" 3810 | } 3811 | }, 3812 | "autoload": { 3813 | "psr-4": { 3814 | "Webmozart\\Assert\\": "src/" 3815 | } 3816 | }, 3817 | "notification-url": "https://packagist.org/downloads/", 3818 | "license": [ 3819 | "MIT" 3820 | ], 3821 | "authors": [ 3822 | { 3823 | "name": "Bernhard Schussek", 3824 | "email": "bschussek@gmail.com" 3825 | } 3826 | ], 3827 | "description": "Assertions to validate method input/output with nice error messages.", 3828 | "keywords": [ 3829 | "assert", 3830 | "check", 3831 | "validate" 3832 | ], 3833 | "time": "2018-12-25T11:19:39+00:00" 3834 | } 3835 | ], 3836 | "aliases": [], 3837 | "minimum-stability": "dev", 3838 | "stability-flags": [], 3839 | "prefer-stable": true, 3840 | "prefer-lowest": false, 3841 | "platform": { 3842 | "php": ">=7.1.0" 3843 | }, 3844 | "platform-dev": [] 3845 | } 3846 | -------------------------------------------------------------------------------- /config/database-hashing.php: -------------------------------------------------------------------------------- 1 | env("DB_HASHING_ENABLED", false), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Database hash salt 34 | |-------------------------------------------------------------------------- 35 | | 36 | | This key is used as the salt for hashes generated, it should be unique in 37 | | every application as it mitigates the chances of an attacker brute 38 | | forcing any hashed value. Defaults to the application key but can be 39 | | a custom value specified by 'DB_HASHING_SALT' in the .env file. 40 | | 41 | */ 42 | 43 | "salt" => env("DB_HASHING_SALT", env("APP_KEY")), 44 | 45 | ]; -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | tests/hashing 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/HashingFacade.php: -------------------------------------------------------------------------------- 1 | $method(...$args); 67 | } 68 | } -------------------------------------------------------------------------------- /src/HashingHelper.php: -------------------------------------------------------------------------------- 1 | enabled = $enabled; 47 | 48 | if ($enabled) { 49 | $this->setUpSalt($app_salt); 50 | } 51 | } 52 | 53 | /** 54 | * Check if the hashing functionality is enabled. 55 | * 56 | * @return bool 57 | */ 58 | public function enabled(): bool 59 | { 60 | return $this->enabled; 61 | } 62 | 63 | /** 64 | * Retrieve the salt used for hashing. 65 | * 66 | * @return string|null 67 | */ 68 | public function salt(): ?string 69 | { 70 | return $this->salt; 71 | } 72 | 73 | /** 74 | * Generate a hash from the provided data and salt modifier. 75 | * 76 | * @param string $value Data to be hashed. 77 | * @param string $salt_modifier A modifier to provide an even more secure hash (eg. a users password). 78 | * 79 | * 80 | * NOTE: Any data passed to $salt_modifier must be provided in order to reproduce the hash. Only use it in situations where 81 | * you already have the modifier (eg. when attempting to login via password) otherwise the hash will be different and you 82 | * won't be able to search a database for matches. 83 | * 84 | * 85 | * @return string 86 | */ 87 | public function create(string $value, string $salt_modifier = ""): string 88 | { 89 | return bin2hex(hash('sha512', $value . $this->salt . $salt_modifier, true) ^ hash('whirlpool', $salt_modifier . $this->salt . $value, true)); 90 | } 91 | 92 | /** 93 | * Check the application salt is valid and decode from base64 if needed. 94 | * 95 | * @param string $salt 96 | */ 97 | private function setUpSalt(string $salt): void 98 | { 99 | throw_if(strlen($salt) === 0 or $salt === null, RuntimeException::class, 'No hashing salt has been specified.'); 100 | 101 | // If the salt starts with "base64:", we will need to decode it before using it 102 | // to hash anything. A salt may be base64 encoded for presentation and we want 103 | // it converted back into raw bytes before using it in our hashing algo. 104 | if (Str::startsWith($salt, 'base64:')) { 105 | $salt = base64_decode(substr($salt, 7)); 106 | } 107 | 108 | $this->salt = $salt; 109 | } 110 | } -------------------------------------------------------------------------------- /src/HashingServiceProvider.php: -------------------------------------------------------------------------------- 1 | publishes([__DIR__ . '/../config/database-hashing.php' => config_path('database-hashing.php')]); 44 | } 45 | 46 | /** 47 | * Register the application services. 48 | * 49 | * @return void 50 | */ 51 | public function register(): void 52 | { 53 | $this->mergeConfigFrom(__DIR__ . '/../config/database-hashing.php', 'database-hashing'); 54 | 55 | $this->app->singleton(HashingFacade::getFacadeAccessor(), function () { 56 | return new HashingHelper((bool) config('database-hashing.enabled', false), (string) config('database-hashing.salt', '')); 57 | }); 58 | } 59 | } -------------------------------------------------------------------------------- /src/traits/HasHashedAttributes.php: -------------------------------------------------------------------------------- 1 | hashing)) ? $this->hashing : [])); 35 | } 36 | 37 | /** 38 | * Set the value of an attribute to a hash of itself. 39 | * 40 | * @param string $attribute 41 | * @param string $salt_modifiers 42 | * 43 | * @return bool 44 | */ 45 | public function hashAttribute(string $attribute, string $salt_modifiers = ""): bool 46 | { 47 | if (isset($this->attributes[$attribute])) { 48 | $this->attributes[$attribute] = DatabaseHashing::create($this->attributes[$attribute], $salt_modifiers); 49 | 50 | return true; 51 | } 52 | 53 | return false; 54 | } 55 | 56 | /** 57 | * Attempt to hash a stored attribute. 58 | * 59 | * @param string $key 60 | * 61 | * @return self 62 | */ 63 | protected function attemptAttributeHash($key): self 64 | { 65 | if ($this->shouldHash($key)) { 66 | $this->hashAttribute($key); 67 | } 68 | 69 | return $this; 70 | } 71 | 72 | // 73 | // Methods below here override methods within the base Laravel/Illuminate/Eloquent 74 | // model class and may need adjusting for later releases of Laravel. 75 | // 76 | 77 | /** 78 | * Set a given attribute on the model. 79 | * 80 | * @param string $key 81 | * @param mixed $value 82 | */ 83 | public function setAttribute($key, $value) 84 | { 85 | parent::setAttribute($key, $value); 86 | 87 | $this->attemptAttributeHash($key); 88 | } 89 | } -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | loadMigrationsFrom(__DIR__ . '/migrations'); 36 | } 37 | 38 | protected function getEnvironmentSetUp($app) : void 39 | { 40 | $app['config']->set('database-hashing.enabled', true); 41 | $app['config']->set('database-hashing.salt', $this->salt = str_random(32)); 42 | } 43 | 44 | protected function getPackageProviders($app) : array 45 | { 46 | if(class_exists('\Orchestra\Database\ConsoleServiceProvider')) { 47 | return [ 48 | HashingServiceProvider::class, 49 | \Orchestra\Database\ConsoleServiceProvider::class, 50 | ]; 51 | } else { 52 | return [ 53 | HashingServiceProvider::class, 54 | ]; 55 | } 56 | } 57 | 58 | protected function getPackageAliases($app) : array 59 | { 60 | return [ 61 | 'DatabaseHashing' => HashingFacade::class, 62 | 63 | ]; 64 | } 65 | } -------------------------------------------------------------------------------- /tests/hashing/HashedAttributesTraitTest.php: -------------------------------------------------------------------------------- 1 | 'this should not be hashed', 37 | 'is_hashed' => 'this should be hashed', 38 | 'hash_lookup' => 'a unique hashed value', 39 | ]); 40 | 41 | $this->assertEquals(DatabaseHashing::create('this should be hashed'), $model->is_hashed); 42 | $this->assertEquals(DatabaseHashing::create('a unique hashed value'), $model->hash_lookup); 43 | } 44 | 45 | /** 46 | * Make sure attributes not marked as hashed aren't hashed. 47 | */ 48 | public function test_create_model_with_not_hashed_attribute(): void 49 | { 50 | $model = HashingTestModel::create([ 51 | 'not_hashed' => 'this should not be hashed', 52 | 'is_hashed' => 'this should be hashed', 53 | 'hash_lookup' => 'a unique hashed value', 54 | ]); 55 | 56 | $this->assertEquals('this should not be hashed', $model->not_hashed); 57 | } 58 | 59 | /** 60 | * Make sure we can use a hashed attribute as a lookup/index. 61 | */ 62 | public function test_lookup_by_hash(): void 63 | { 64 | $model = HashingTestModel::create([ 65 | 'not_hashed' => 'this should not be hashed', 66 | 'is_hashed' => 'this should be hashed', 67 | 'hash_lookup' => 'a unique hashed value', 68 | ]); 69 | $lookup = HashingTestModel::where('hash_lookup', $model->hash_lookup)->first(); 70 | 71 | $this->assertEquals($model->id, $lookup->id); 72 | } 73 | 74 | /** 75 | * Make sure we can use a hashed attribute with a custom salt modifier as a lookup/index. 76 | */ 77 | public function test_lookup_by_hash_slat_modifier(): void 78 | { 79 | $model = HashingTestModel::create([ 80 | 'not_hashed' => 'this should not be hashed', 81 | 'is_hashed' => 'this should be hashed', 82 | 'hash_lookup' => 'a unique hashed value', 83 | 'salt_modifier_lookup' => 'a unique hashed value with salt modifier', 84 | ]); 85 | $this->assertTrue($model->hashAttribute('salt_modifier_lookup', $model->not_hashed)); //assert that the attribute could be hashed 86 | $model->save(); //save the model to the database, we updated an attribute 87 | 88 | //recreating the hash later as if the user has logged in and the 'not_hashed' field is their email or username used as a modifier 89 | $lookup = HashingTestModel::where('salt_modifier_lookup', 90 | DatabaseHashing::create('a unique hashed value with salt modifier', 'this should not be hashed') 91 | )->first(); 92 | 93 | $this->assertNotNull($lookup); 94 | $this->assertEquals($model->id, $lookup->id); 95 | } 96 | } -------------------------------------------------------------------------------- /tests/hashing/HashingFacadeTest.php: -------------------------------------------------------------------------------- 1 | assertEquals(HashingFacade::getFacadeAccessor(), "DatabaseHashing"); 33 | } 34 | 35 | /** 36 | * Make sure the facade enabled method is enabled, as we expect it to be. 37 | */ 38 | public function test_facade_enabled(): void 39 | { 40 | $this->assertEquals(true, DatabaseHashing::enabled()); 41 | } 42 | 43 | /** 44 | * Make sure the facade salt method returns the value we expect it to. 45 | */ 46 | public function test_facade_salt(): void 47 | { 48 | $this->assertEquals($this->salt, DatabaseHashing::salt()); 49 | } 50 | 51 | /** 52 | * Make sure the facade creates the same hash from the same values by default. 53 | */ 54 | public function test_facade_create(): void 55 | { 56 | $this->assertEquals(DatabaseHashing::create('an input'), DatabaseHashing::create('an input')); 57 | } 58 | 59 | /** 60 | * Make sure the facade creates a different hash from different values by default. 61 | */ 62 | public function test_facade_create_different(): void 63 | { 64 | $this->assertNotEquals(DatabaseHashing::create('an input'), DatabaseHashing::create('another input')); 65 | } 66 | } -------------------------------------------------------------------------------- /tests/hashing/HashingHelperTest.php: -------------------------------------------------------------------------------- 1 | assertTrue($helper->enabled()); 35 | $this->assertEquals('this is a salt', $helper->salt()); 36 | } 37 | 38 | /** 39 | * Make sure a base64 encoded salt is loaded correctly. 40 | */ 41 | public function test_enabled_base64(): void 42 | { 43 | $helper = new HashingHelper(true, 'base64:' . base64_encode('this is a base64 salt')); 44 | 45 | $this->assertTrue($helper->enabled()); 46 | $this->assertEquals('this is a base64 salt', $helper->salt()); 47 | } 48 | 49 | /** 50 | * Make sure the salt isn't loaded if the hashing functionality is disabled. 51 | */ 52 | public function test_disabled_helper(): void 53 | { 54 | $helper = new HashingHelper(false, ''); 55 | 56 | $this->assertFalse($helper->enabled()); 57 | $this->assertNull($helper->salt()); 58 | } 59 | 60 | /** 61 | * Make sure the same application salt and input value create the same hash. 62 | */ 63 | public function test_same_app_salt_hash(): void 64 | { 65 | $helper = new HashingHelper(true, 'an application salt'); 66 | $hash_1 = $helper->create('some random data'); 67 | $hash_2 = $helper->create('some random data'); 68 | 69 | $this->assertEquals($hash_1, $hash_2); 70 | } 71 | 72 | /** 73 | * Make sure two different application salts create different hashes on the same data. 74 | */ 75 | public function test_different_app_salt_hash(): void 76 | { 77 | $hash_1 = (new HashingHelper(true, 'an application salt'))->create('some random data'); 78 | $hash_2 = (new HashingHelper(true, 'another application salt'))->create('some random data'); 79 | 80 | $this->assertNotEquals($hash_1, $hash_2); 81 | } 82 | 83 | /** 84 | * Make sure the same application salt creates a different hash for each input value. 85 | */ 86 | public function test_different_value(): void 87 | { 88 | $helper = new HashingHelper(true, 'an application salt'); 89 | $hash_1 = $helper->create('some random data'); 90 | $hash_2 = $helper->create('some more random data'); 91 | 92 | $this->assertNotEquals($hash_1, $hash_2); 93 | } 94 | 95 | /** 96 | * Make sure the same application salt, input values and salt modifiers create the same hash. 97 | */ 98 | public function test_same_salt_modifier(): void 99 | { 100 | $helper = new HashingHelper(true, 'an application salt'); 101 | $hash_1 = $helper->create('some random data', 'a custom salt modifier'); 102 | $hash_2 = $helper->create('some random data', 'a custom salt modifier'); 103 | 104 | $this->assertEquals($hash_1, $hash_2); 105 | } 106 | 107 | /** 108 | * Make sure the same application salt and input values with different salt modifiers creates different hashes. 109 | */ 110 | public function test_different_salt_modifier(): void 111 | { 112 | $helper = new HashingHelper(true, 'an application salt'); 113 | $hash_1 = $helper->create('some random data', 'a custom salt modifier'); 114 | $hash_2 = $helper->create('some random data', 'another custom salt modifier'); 115 | 116 | $this->assertNotEquals($hash_1, $hash_2); 117 | } 118 | } -------------------------------------------------------------------------------- /tests/hashing/fixtures/HashingTestModel.php: -------------------------------------------------------------------------------- 1 | increments('id'); 34 | $table->text('not_hashed'); 35 | $table->text('is_hashed'); 36 | $table->string('hash_lookup')->unique(); 37 | $table->string('salt_modifier_lookup')->unique()->nullable(); 38 | $table->rememberToken(); 39 | $table->timestamps(); 40 | }); 41 | } 42 | 43 | /** 44 | * Reverse the migrations. 45 | * 46 | * @return void 47 | */ 48 | public function down() 49 | { 50 | Schema::dropIfExists('test_model'); 51 | } 52 | } --------------------------------------------------------------------------------