├── .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 | [](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 | }
--------------------------------------------------------------------------------