├── .env.example ├── .gitignore ├── .travis.yml ├── README.md ├── composer.json ├── composer.lock ├── phpunit.xml.dist ├── src ├── BatchMessage.php ├── EmailAddress.php ├── Mailer.php └── Message.php └── tests ├── BatchMessageTest.php ├── EmailAddressTest.php ├── MailerTest.php ├── MessageTest.php ├── TestCase.php ├── bootstrap.php └── mail ├── example.php └── layouts └── html.php /.env.example: -------------------------------------------------------------------------------- 1 | MAILGUN_DOMAIN= 2 | MAILGUN_KEY= 3 | 4 | TEST_RECIPIENT= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor/ 3 | .env 4 | .phpunit.result.cache -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 7.2 5 | 6 | # faster builds on new travis setup not using sudo 7 | sudo: false 8 | 9 | # cache vendor dirs 10 | cache: 11 | directories: 12 | - $HOME/.composer/cache 13 | 14 | install: 15 | - travis_retry composer self-update && composer --version 16 | - export PATH="$HOME/.composer/vendor/bin:$PATH" 17 | - travis_retry composer install --prefer-dist --no-interaction 18 | 19 | script: 20 | - ./vendor/bin/phpunit --verbose -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mailgun Extension for Yii 2 2 | 3 | This extension provides a [Mailgun](https://www.mailgun.com/) mail solution for [Yii framework 2.0](http://www.yiiframework.com). 4 | 5 | [![Latest Stable Version](https://poser.pugx.org/boundstate/yii2-mailgun/v/stable)](https://packagist.org/packages/boundstate/yii2-mailgun) 6 | [![Total Downloads](https://poser.pugx.org/boundstate/yii2-mailgun/downloads)](https://packagist.org/packages/boundstate/yii2-mailgun) 7 | [![Build Status](https://travis-ci.com/boundstate/yii2-mailgun.svg?branch=master)](https://travis-ci.com/boundstate/yii2-mailgun) 8 | 9 | ## Installation 10 | 11 | The preferred way to install this extension is through [composer](http://getcomposer.org/download/). 12 | 13 | ``` 14 | composer require boundstate/yii2-mailgun 15 | ``` 16 | 17 | The [Mailgun API Client](https://github.com/mailgun/mailgun-php) is not hard coupled to Guzzle, Buzz or any other library that sends 18 | HTTP messages. You must also install the [PSR-7 implementation and HTTP client](https://packagist.org/providers/php-http/client-implementation) 19 | you want to use. 20 | 21 | If you just want to get started quickly you should install [Buzz](https://github.com/kriswallsmith/Buzz) and [nyholm/psr7](https://github.com/Nyholm/psr7): 22 | 23 | ```bash 24 | composer require kriswallsmith/buzz nyholm/psr7 25 | ``` 26 | 27 | ## Usage 28 | 29 | To use this extension, simply add the following code in your application configuration: 30 | 31 | ```php 32 | return [ 33 | //.... 34 | 'components' => [ 35 | 'mailer' => [ 36 | 'class' => 'boundstate\mailgun\Mailer', 37 | 'key' => 'key-example', 38 | 'domain' => 'mg.example.com', 39 | ], 40 | ], 41 | ]; 42 | ``` 43 | 44 | You can then send an email as follows: 45 | 46 | ```php 47 | Yii::$app->mailer->compose('contact/html', ['contactForm' => $form]) 48 | ->setFrom('from@domain.com') 49 | ->setTo($form->email) 50 | ->setSubject($form->subject) 51 | ->send(); 52 | ``` 53 | 54 | You can also specify an array of addresses and/or speicfy names: 55 | 56 | ```php 57 | $message->setTo(['bob@example.com' => 'Bob']); 58 | ``` 59 | 60 | > **Warning**: By default all recipients' email address will show up in the `to` field for each recipient. 61 | > Enable batch sending to avoid this. 62 | 63 | ### Batch Sending 64 | 65 | When [batch sending](https://documentation.mailgun.com/en/latest/user_manual.html#batch-sending) is enabled, 66 | Mailgun sends each recipient an individual email with only their email in the `to` field. 67 | 68 | To use batch sending, set the `messageClass` to `boundstate\mailgun\BatchMessage` in your application configuration: 69 | 70 | ```php 71 | 'mailer' => [ 72 | 'class' => 'boundstate\mailgun\Mailer', 73 | 'messageClass' => 'boundstate\mailgun\BatchMessage', 74 | // ... 75 | ] 76 | ``` 77 | 78 | Composing a batch email is similar to regular emails, 79 | except you may define and use recipient variables: 80 | 81 | ```php 82 | Yii::$app->mailer->compose('hello') 83 | ->setTo([ 84 | 'bob@example.com' => [ 85 | 'id': 3, 86 | 'full_name' => 'Bob' 87 | ], 88 | 'jane@example.com' => [ 89 | 'id': 4, 90 | 'full_name' => 'Jane' 91 | ], 92 | ]) 93 | ->setSubject('Hi %recipient.full_name%') 94 | ->send(); 95 | ``` 96 | 97 | 98 | For further instructions refer to the [Mailgun docs](https://documentation.mailgun.com/) and the [related section in the Yii Definitive Guide](http://www.yiiframework.com/doc-2.0/guide-tutorial-mailing.html). -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "boundstate/yii2-mailgun", 3 | "description": "Mailgun integration for the Yii framework", 4 | "type": "yii2-extension", 5 | "keywords": ["yii2", "extension", "rackspace", "mailgun", "mail", "email", "mailer"], 6 | "license": "Apache-2.0", 7 | "authors": [ 8 | { 9 | "name": "Mike Peters", 10 | "email": "mikejpeters@gmail.com" 11 | } 12 | ], 13 | "require": { 14 | "yiisoft/yii2": ">=2.0.4", 15 | "mailgun/mailgun-php": "^3" 16 | }, 17 | "require-dev": { 18 | "phpunit/phpunit": "^8", 19 | "kriswallsmith/buzz": "^1.0", 20 | "nyholm/psr7": "^1.2", 21 | "vlucas/phpdotenv": "^3.6" 22 | }, 23 | "suggest": { 24 | "kriswallsmith/buzz": "Mailgun API client requires an HTTP client", 25 | "nyholm/psr7": "Mailgun API client requires a PSR-7 implementation" 26 | }, 27 | "autoload": { 28 | "psr-4": { 29 | "boundstate\\mailgun\\": "src" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /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": "6777e36d4d94994f8801ba3b4058fb2d", 8 | "packages": [ 9 | { 10 | "name": "bower-asset/inputmask", 11 | "version": "3.3.11", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/RobinHerbots/Inputmask.git", 15 | "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/5e670ad62f50c738388d4dcec78d2888505ad77b", 20 | "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "bower-asset/jquery": ">=1.7" 25 | }, 26 | "type": "bower-asset-library", 27 | "extra": { 28 | "bower-asset-main": [ 29 | "./dist/inputmask/inputmask.js", 30 | "./dist/inputmask/inputmask.extensions.js", 31 | "./dist/inputmask/inputmask.date.extensions.js", 32 | "./dist/inputmask/inputmask.numeric.extensions.js", 33 | "./dist/inputmask/inputmask.phone.extensions.js", 34 | "./dist/inputmask/jquery.inputmask.js", 35 | "./dist/inputmask/global/document.js", 36 | "./dist/inputmask/global/window.js", 37 | "./dist/inputmask/phone-codes/phone.js", 38 | "./dist/inputmask/phone-codes/phone-be.js", 39 | "./dist/inputmask/phone-codes/phone-nl.js", 40 | "./dist/inputmask/phone-codes/phone-ru.js", 41 | "./dist/inputmask/phone-codes/phone-uk.js", 42 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js", 43 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js", 44 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.js", 45 | "./dist/inputmask/bindings/inputmask.binding.js" 46 | ], 47 | "bower-asset-ignore": [ 48 | "**/*", 49 | "!dist/*", 50 | "!dist/inputmask/*", 51 | "!dist/min/*", 52 | "!dist/min/inputmask/*" 53 | ] 54 | }, 55 | "license": [ 56 | "http://opensource.org/licenses/mit-license.php" 57 | ], 58 | "description": "Inputmask is a javascript library which creates an input mask. Inputmask can run against vanilla javascript, jQuery and jqlite.", 59 | "keywords": [ 60 | "form", 61 | "input", 62 | "inputmask", 63 | "jquery", 64 | "mask", 65 | "plugins" 66 | ], 67 | "time": "2017-11-21T11:46:23+00:00" 68 | }, 69 | { 70 | "name": "bower-asset/jquery", 71 | "version": "3.5.1", 72 | "source": { 73 | "type": "git", 74 | "url": "https://github.com/jquery/jquery-dist.git", 75 | "reference": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215" 76 | }, 77 | "dist": { 78 | "type": "zip", 79 | "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/4c0e4becb8263bb5b3e6dadc448d8e7305ef8215", 80 | "reference": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215", 81 | "shasum": "" 82 | }, 83 | "type": "bower-asset-library", 84 | "extra": { 85 | "bower-asset-main": "dist/jquery.js", 86 | "bower-asset-ignore": [ 87 | "package.json" 88 | ] 89 | }, 90 | "license": [ 91 | "MIT" 92 | ], 93 | "keywords": [ 94 | "browser", 95 | "javascript", 96 | "jquery", 97 | "library" 98 | ], 99 | "time": "2020-05-04T22:50:46+00:00" 100 | }, 101 | { 102 | "name": "bower-asset/punycode", 103 | "version": "v1.3.2", 104 | "source": { 105 | "type": "git", 106 | "url": "https://github.com/bestiejs/punycode.js.git", 107 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" 108 | }, 109 | "dist": { 110 | "type": "zip", 111 | "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", 112 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", 113 | "shasum": "" 114 | }, 115 | "type": "bower-asset-library", 116 | "extra": { 117 | "bower-asset-main": "punycode.js", 118 | "bower-asset-ignore": [ 119 | "coverage", 120 | "tests", 121 | ".*", 122 | "component.json", 123 | "Gruntfile.js", 124 | "node_modules", 125 | "package.json" 126 | ] 127 | }, 128 | "time": "2014-10-22T12:02:42+00:00" 129 | }, 130 | { 131 | "name": "bower-asset/yii2-pjax", 132 | "version": "2.0.7.1", 133 | "source": { 134 | "type": "git", 135 | "url": "https://github.com/yiisoft/jquery-pjax.git", 136 | "reference": "aef7b953107264f00234902a3880eb50dafc48be" 137 | }, 138 | "dist": { 139 | "type": "zip", 140 | "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/aef7b953107264f00234902a3880eb50dafc48be", 141 | "reference": "aef7b953107264f00234902a3880eb50dafc48be", 142 | "shasum": "" 143 | }, 144 | "require": { 145 | "bower-asset/jquery": ">=1.8" 146 | }, 147 | "type": "bower-asset-library", 148 | "extra": { 149 | "bower-asset-main": "./jquery.pjax.js", 150 | "bower-asset-ignore": [ 151 | ".travis.yml", 152 | "Gemfile", 153 | "Gemfile.lock", 154 | "CONTRIBUTING.md", 155 | "vendor/", 156 | "script/", 157 | "test/" 158 | ] 159 | }, 160 | "license": [ 161 | "MIT" 162 | ], 163 | "time": "2017-10-12T10:11:14+00:00" 164 | }, 165 | { 166 | "name": "cebe/markdown", 167 | "version": "1.2.1", 168 | "source": { 169 | "type": "git", 170 | "url": "https://github.com/cebe/markdown.git", 171 | "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" 172 | }, 173 | "dist": { 174 | "type": "zip", 175 | "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", 176 | "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", 177 | "shasum": "" 178 | }, 179 | "require": { 180 | "lib-pcre": "*", 181 | "php": ">=5.4.0" 182 | }, 183 | "require-dev": { 184 | "cebe/indent": "*", 185 | "facebook/xhprof": "*@dev", 186 | "phpunit/phpunit": "4.1.*" 187 | }, 188 | "bin": [ 189 | "bin/markdown" 190 | ], 191 | "type": "library", 192 | "extra": { 193 | "branch-alias": { 194 | "dev-master": "1.2.x-dev" 195 | } 196 | }, 197 | "autoload": { 198 | "psr-4": { 199 | "cebe\\markdown\\": "" 200 | } 201 | }, 202 | "notification-url": "https://packagist.org/downloads/", 203 | "license": [ 204 | "MIT" 205 | ], 206 | "authors": [ 207 | { 208 | "name": "Carsten Brandt", 209 | "email": "mail@cebe.cc", 210 | "homepage": "http://cebe.cc/", 211 | "role": "Creator" 212 | } 213 | ], 214 | "description": "A super fast, highly extensible markdown parser for PHP", 215 | "homepage": "https://github.com/cebe/markdown#readme", 216 | "keywords": [ 217 | "extensible", 218 | "fast", 219 | "gfm", 220 | "markdown", 221 | "markdown-extra" 222 | ], 223 | "time": "2018-03-26T11:24:36+00:00" 224 | }, 225 | { 226 | "name": "clue/stream-filter", 227 | "version": "v1.5.0", 228 | "source": { 229 | "type": "git", 230 | "url": "https://github.com/clue/php-stream-filter.git", 231 | "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" 232 | }, 233 | "dist": { 234 | "type": "zip", 235 | "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", 236 | "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", 237 | "shasum": "" 238 | }, 239 | "require": { 240 | "php": ">=5.3" 241 | }, 242 | "require-dev": { 243 | "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" 244 | }, 245 | "type": "library", 246 | "autoload": { 247 | "psr-4": { 248 | "Clue\\StreamFilter\\": "src/" 249 | }, 250 | "files": [ 251 | "src/functions_include.php" 252 | ] 253 | }, 254 | "notification-url": "https://packagist.org/downloads/", 255 | "license": [ 256 | "MIT" 257 | ], 258 | "authors": [ 259 | { 260 | "name": "Christian Lück", 261 | "email": "christian@clue.engineering" 262 | } 263 | ], 264 | "description": "A simple and modern approach to stream filtering in PHP", 265 | "homepage": "https://github.com/clue/php-stream-filter", 266 | "keywords": [ 267 | "bucket brigade", 268 | "callback", 269 | "filter", 270 | "php_user_filter", 271 | "stream", 272 | "stream_filter_append", 273 | "stream_filter_register" 274 | ], 275 | "funding": [ 276 | { 277 | "url": "https://clue.engineering/support", 278 | "type": "custom" 279 | }, 280 | { 281 | "url": "https://github.com/clue", 282 | "type": "github" 283 | } 284 | ], 285 | "time": "2020-10-02T12:38:20+00:00" 286 | }, 287 | { 288 | "name": "ezyang/htmlpurifier", 289 | "version": "v4.13.0", 290 | "source": { 291 | "type": "git", 292 | "url": "https://github.com/ezyang/htmlpurifier.git", 293 | "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" 294 | }, 295 | "dist": { 296 | "type": "zip", 297 | "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", 298 | "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", 299 | "shasum": "" 300 | }, 301 | "require": { 302 | "php": ">=5.2" 303 | }, 304 | "require-dev": { 305 | "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" 306 | }, 307 | "type": "library", 308 | "autoload": { 309 | "psr-0": { 310 | "HTMLPurifier": "library/" 311 | }, 312 | "files": [ 313 | "library/HTMLPurifier.composer.php" 314 | ], 315 | "exclude-from-classmap": [ 316 | "/library/HTMLPurifier/Language/" 317 | ] 318 | }, 319 | "notification-url": "https://packagist.org/downloads/", 320 | "license": [ 321 | "LGPL-2.1-or-later" 322 | ], 323 | "authors": [ 324 | { 325 | "name": "Edward Z. Yang", 326 | "email": "admin@htmlpurifier.org", 327 | "homepage": "http://ezyang.com" 328 | } 329 | ], 330 | "description": "Standards compliant HTML filter written in PHP", 331 | "homepage": "http://htmlpurifier.org/", 332 | "keywords": [ 333 | "html" 334 | ], 335 | "time": "2020-06-29T00:56:53+00:00" 336 | }, 337 | { 338 | "name": "mailgun/mailgun-php", 339 | "version": "3.1.0", 340 | "source": { 341 | "type": "git", 342 | "url": "https://github.com/mailgun/mailgun-php.git", 343 | "reference": "27d579fdf1295dd3fdf35f14cde797de21615fb7" 344 | }, 345 | "dist": { 346 | "type": "zip", 347 | "url": "https://api.github.com/repos/mailgun/mailgun-php/zipball/27d579fdf1295dd3fdf35f14cde797de21615fb7", 348 | "reference": "27d579fdf1295dd3fdf35f14cde797de21615fb7", 349 | "shasum": "" 350 | }, 351 | "require": { 352 | "php": "^7.1", 353 | "php-http/client-common": "^1.9 || ^2.0", 354 | "php-http/discovery": "^1.6", 355 | "php-http/multipart-stream-builder": "^1.0", 356 | "psr/http-client": "^1.0", 357 | "webmozart/assert": "^1.6" 358 | }, 359 | "require-dev": { 360 | "nyholm/nsa": "^1.1", 361 | "nyholm/psr7": "^1.0", 362 | "php-http/guzzle6-adapter": "^1.0 || ^2.0", 363 | "phpunit/phpunit": "^7.5" 364 | }, 365 | "suggest": { 366 | "guzzlehttp/psr7": "PSR-7 message implementation that also provides common utility methods", 367 | "php-http/curl-client": "cURL client for PHP-HTTP" 368 | }, 369 | "type": "library", 370 | "extra": { 371 | "branch-alias": { 372 | "dev-master": "3.0-dev" 373 | } 374 | }, 375 | "autoload": { 376 | "psr-4": { 377 | "Mailgun\\": "src/" 378 | } 379 | }, 380 | "notification-url": "https://packagist.org/downloads/", 381 | "license": [ 382 | "MIT" 383 | ], 384 | "authors": [ 385 | { 386 | "name": "Travis Swientek", 387 | "email": "travis@mailgunhq.com" 388 | } 389 | ], 390 | "description": "The Mailgun SDK provides methods for all API functions.", 391 | "time": "2020-10-08T12:20:23+00:00" 392 | }, 393 | { 394 | "name": "php-http/client-common", 395 | "version": "2.3.0", 396 | "source": { 397 | "type": "git", 398 | "url": "https://github.com/php-http/client-common.git", 399 | "reference": "e37e46c610c87519753135fb893111798c69076a" 400 | }, 401 | "dist": { 402 | "type": "zip", 403 | "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", 404 | "reference": "e37e46c610c87519753135fb893111798c69076a", 405 | "shasum": "" 406 | }, 407 | "require": { 408 | "php": "^7.1 || ^8.0", 409 | "php-http/httplug": "^2.0", 410 | "php-http/message": "^1.6", 411 | "php-http/message-factory": "^1.0", 412 | "psr/http-client": "^1.0", 413 | "psr/http-factory": "^1.0", 414 | "psr/http-message": "^1.0", 415 | "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", 416 | "symfony/polyfill-php80": "^1.17" 417 | }, 418 | "require-dev": { 419 | "doctrine/instantiator": "^1.1", 420 | "guzzlehttp/psr7": "^1.4", 421 | "nyholm/psr7": "^1.2", 422 | "phpspec/phpspec": "^5.1 || ^6.0", 423 | "phpspec/prophecy": "^1.10.2", 424 | "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" 425 | }, 426 | "suggest": { 427 | "ext-json": "To detect JSON responses with the ContentTypePlugin", 428 | "ext-libxml": "To detect XML responses with the ContentTypePlugin", 429 | "php-http/cache-plugin": "PSR-6 Cache plugin", 430 | "php-http/logger-plugin": "PSR-3 Logger plugin", 431 | "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" 432 | }, 433 | "type": "library", 434 | "extra": { 435 | "branch-alias": { 436 | "dev-master": "2.3.x-dev" 437 | } 438 | }, 439 | "autoload": { 440 | "psr-4": { 441 | "Http\\Client\\Common\\": "src/" 442 | } 443 | }, 444 | "notification-url": "https://packagist.org/downloads/", 445 | "license": [ 446 | "MIT" 447 | ], 448 | "authors": [ 449 | { 450 | "name": "Márk Sági-Kazár", 451 | "email": "mark.sagikazar@gmail.com" 452 | } 453 | ], 454 | "description": "Common HTTP Client implementations and tools for HTTPlug", 455 | "homepage": "http://httplug.io", 456 | "keywords": [ 457 | "client", 458 | "common", 459 | "http", 460 | "httplug" 461 | ], 462 | "time": "2020-07-21T10:04:13+00:00" 463 | }, 464 | { 465 | "name": "php-http/discovery", 466 | "version": "1.12.0", 467 | "source": { 468 | "type": "git", 469 | "url": "https://github.com/php-http/discovery.git", 470 | "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c" 471 | }, 472 | "dist": { 473 | "type": "zip", 474 | "url": "https://api.github.com/repos/php-http/discovery/zipball/4366bf1bc39b663aa87459bd725501d2f1988b6c", 475 | "reference": "4366bf1bc39b663aa87459bd725501d2f1988b6c", 476 | "shasum": "" 477 | }, 478 | "require": { 479 | "php": "^7.1 || ^8.0" 480 | }, 481 | "conflict": { 482 | "nyholm/psr7": "<1.0" 483 | }, 484 | "require-dev": { 485 | "graham-campbell/phpspec-skip-example-extension": "^5.0", 486 | "php-http/httplug": "^1.0 || ^2.0", 487 | "php-http/message-factory": "^1.0", 488 | "phpspec/phpspec": "^5.1 || ^6.1", 489 | "puli/composer-plugin": "1.0.0-beta10" 490 | }, 491 | "suggest": { 492 | "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", 493 | "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." 494 | }, 495 | "type": "library", 496 | "extra": { 497 | "branch-alias": { 498 | "dev-master": "1.9-dev" 499 | } 500 | }, 501 | "autoload": { 502 | "psr-4": { 503 | "Http\\Discovery\\": "src/" 504 | } 505 | }, 506 | "notification-url": "https://packagist.org/downloads/", 507 | "license": [ 508 | "MIT" 509 | ], 510 | "authors": [ 511 | { 512 | "name": "Márk Sági-Kazár", 513 | "email": "mark.sagikazar@gmail.com" 514 | } 515 | ], 516 | "description": "Finds installed HTTPlug implementations and PSR-7 message factories", 517 | "homepage": "http://php-http.org", 518 | "keywords": [ 519 | "adapter", 520 | "client", 521 | "discovery", 522 | "factory", 523 | "http", 524 | "message", 525 | "psr7" 526 | ], 527 | "time": "2020-09-22T13:31:04+00:00" 528 | }, 529 | { 530 | "name": "php-http/httplug", 531 | "version": "2.2.0", 532 | "source": { 533 | "type": "git", 534 | "url": "https://github.com/php-http/httplug.git", 535 | "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" 536 | }, 537 | "dist": { 538 | "type": "zip", 539 | "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", 540 | "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", 541 | "shasum": "" 542 | }, 543 | "require": { 544 | "php": "^7.1 || ^8.0", 545 | "php-http/promise": "^1.1", 546 | "psr/http-client": "^1.0", 547 | "psr/http-message": "^1.0" 548 | }, 549 | "require-dev": { 550 | "friends-of-phpspec/phpspec-code-coverage": "^4.1", 551 | "phpspec/phpspec": "^5.1 || ^6.0" 552 | }, 553 | "type": "library", 554 | "extra": { 555 | "branch-alias": { 556 | "dev-master": "2.x-dev" 557 | } 558 | }, 559 | "autoload": { 560 | "psr-4": { 561 | "Http\\Client\\": "src/" 562 | } 563 | }, 564 | "notification-url": "https://packagist.org/downloads/", 565 | "license": [ 566 | "MIT" 567 | ], 568 | "authors": [ 569 | { 570 | "name": "Eric GELOEN", 571 | "email": "geloen.eric@gmail.com" 572 | }, 573 | { 574 | "name": "Márk Sági-Kazár", 575 | "email": "mark.sagikazar@gmail.com", 576 | "homepage": "https://sagikazarmark.hu" 577 | } 578 | ], 579 | "description": "HTTPlug, the HTTP client abstraction for PHP", 580 | "homepage": "http://httplug.io", 581 | "keywords": [ 582 | "client", 583 | "http" 584 | ], 585 | "time": "2020-07-13T15:43:23+00:00" 586 | }, 587 | { 588 | "name": "php-http/message", 589 | "version": "1.9.1", 590 | "source": { 591 | "type": "git", 592 | "url": "https://github.com/php-http/message.git", 593 | "reference": "09f3f13af3a1a4273ecbf8e6b27248c002a3db29" 594 | }, 595 | "dist": { 596 | "type": "zip", 597 | "url": "https://api.github.com/repos/php-http/message/zipball/09f3f13af3a1a4273ecbf8e6b27248c002a3db29", 598 | "reference": "09f3f13af3a1a4273ecbf8e6b27248c002a3db29", 599 | "shasum": "" 600 | }, 601 | "require": { 602 | "clue/stream-filter": "^1.4.1", 603 | "php": "^7.1", 604 | "php-http/message-factory": "^1.0.2", 605 | "psr/http-message": "^1.0" 606 | }, 607 | "provide": { 608 | "php-http/message-factory-implementation": "1.0" 609 | }, 610 | "require-dev": { 611 | "akeneo/phpspec-skip-example-extension": "^1.0", 612 | "coduo/phpspec-data-provider-extension": "^1.0", 613 | "ergebnis/composer-normalize": "^2.1", 614 | "ext-zlib": "*", 615 | "guzzlehttp/psr7": "^1.0", 616 | "henrikbjorn/phpspec-code-coverage": "^1.0", 617 | "phpspec/phpspec": "^2.4", 618 | "slim/slim": "^3.0", 619 | "zendframework/zend-diactoros": "^1.0" 620 | }, 621 | "suggest": { 622 | "ext-zlib": "Used with compressor/decompressor streams", 623 | "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", 624 | "slim/slim": "Used with Slim Framework PSR-7 implementation", 625 | "zendframework/zend-diactoros": "Used with Diactoros Factories" 626 | }, 627 | "type": "library", 628 | "extra": { 629 | "branch-alias": { 630 | "dev-master": "1.8-dev" 631 | } 632 | }, 633 | "autoload": { 634 | "psr-4": { 635 | "Http\\Message\\": "src/" 636 | }, 637 | "files": [ 638 | "src/filters.php" 639 | ] 640 | }, 641 | "notification-url": "https://packagist.org/downloads/", 642 | "license": [ 643 | "MIT" 644 | ], 645 | "authors": [ 646 | { 647 | "name": "Márk Sági-Kazár", 648 | "email": "mark.sagikazar@gmail.com" 649 | } 650 | ], 651 | "description": "HTTP Message related tools", 652 | "homepage": "http://php-http.org", 653 | "keywords": [ 654 | "http", 655 | "message", 656 | "psr-7" 657 | ], 658 | "time": "2020-10-13T06:21:08+00:00" 659 | }, 660 | { 661 | "name": "php-http/message-factory", 662 | "version": "v1.0.2", 663 | "source": { 664 | "type": "git", 665 | "url": "https://github.com/php-http/message-factory.git", 666 | "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" 667 | }, 668 | "dist": { 669 | "type": "zip", 670 | "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", 671 | "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", 672 | "shasum": "" 673 | }, 674 | "require": { 675 | "php": ">=5.4", 676 | "psr/http-message": "^1.0" 677 | }, 678 | "type": "library", 679 | "extra": { 680 | "branch-alias": { 681 | "dev-master": "1.0-dev" 682 | } 683 | }, 684 | "autoload": { 685 | "psr-4": { 686 | "Http\\Message\\": "src/" 687 | } 688 | }, 689 | "notification-url": "https://packagist.org/downloads/", 690 | "license": [ 691 | "MIT" 692 | ], 693 | "authors": [ 694 | { 695 | "name": "Márk Sági-Kazár", 696 | "email": "mark.sagikazar@gmail.com" 697 | } 698 | ], 699 | "description": "Factory interfaces for PSR-7 HTTP Message", 700 | "homepage": "http://php-http.org", 701 | "keywords": [ 702 | "factory", 703 | "http", 704 | "message", 705 | "stream", 706 | "uri" 707 | ], 708 | "time": "2015-12-19T14:08:53+00:00" 709 | }, 710 | { 711 | "name": "php-http/multipart-stream-builder", 712 | "version": "1.1.2", 713 | "source": { 714 | "type": "git", 715 | "url": "https://github.com/php-http/multipart-stream-builder.git", 716 | "reference": "121299c2aad475a19087bc6298a1c9aa4d5c1ecc" 717 | }, 718 | "dist": { 719 | "type": "zip", 720 | "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/121299c2aad475a19087bc6298a1c9aa4d5c1ecc", 721 | "reference": "121299c2aad475a19087bc6298a1c9aa4d5c1ecc", 722 | "shasum": "" 723 | }, 724 | "require": { 725 | "php": "^7.1 || ^8.0", 726 | "php-http/discovery": "^1.7", 727 | "php-http/message-factory": "^1.0.2", 728 | "psr/http-factory": "^1.0", 729 | "psr/http-message": "^1.0" 730 | }, 731 | "require-dev": { 732 | "nyholm/psr7": "^1.0", 733 | "php-http/message": "^1.5", 734 | "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" 735 | }, 736 | "type": "library", 737 | "extra": { 738 | "branch-alias": { 739 | "dev-master": "1.1-dev" 740 | } 741 | }, 742 | "autoload": { 743 | "psr-4": { 744 | "Http\\Message\\MultipartStream\\": "src/" 745 | } 746 | }, 747 | "notification-url": "https://packagist.org/downloads/", 748 | "license": [ 749 | "MIT" 750 | ], 751 | "authors": [ 752 | { 753 | "name": "Tobias Nyholm", 754 | "email": "tobias.nyholm@gmail.com" 755 | } 756 | ], 757 | "description": "A builder class that help you create a multipart stream", 758 | "homepage": "http://php-http.org", 759 | "keywords": [ 760 | "factory", 761 | "http", 762 | "message", 763 | "multipart stream", 764 | "stream" 765 | ], 766 | "time": "2020-07-13T15:48:43+00:00" 767 | }, 768 | { 769 | "name": "php-http/promise", 770 | "version": "1.1.0", 771 | "source": { 772 | "type": "git", 773 | "url": "https://github.com/php-http/promise.git", 774 | "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" 775 | }, 776 | "dist": { 777 | "type": "zip", 778 | "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", 779 | "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", 780 | "shasum": "" 781 | }, 782 | "require": { 783 | "php": "^7.1 || ^8.0" 784 | }, 785 | "require-dev": { 786 | "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", 787 | "phpspec/phpspec": "^5.1.2 || ^6.2" 788 | }, 789 | "type": "library", 790 | "extra": { 791 | "branch-alias": { 792 | "dev-master": "1.1-dev" 793 | } 794 | }, 795 | "autoload": { 796 | "psr-4": { 797 | "Http\\Promise\\": "src/" 798 | } 799 | }, 800 | "notification-url": "https://packagist.org/downloads/", 801 | "license": [ 802 | "MIT" 803 | ], 804 | "authors": [ 805 | { 806 | "name": "Joel Wurtz", 807 | "email": "joel.wurtz@gmail.com" 808 | }, 809 | { 810 | "name": "Márk Sági-Kazár", 811 | "email": "mark.sagikazar@gmail.com" 812 | } 813 | ], 814 | "description": "Promise used for asynchronous HTTP requests", 815 | "homepage": "http://httplug.io", 816 | "keywords": [ 817 | "promise" 818 | ], 819 | "time": "2020-07-07T09:29:14+00:00" 820 | }, 821 | { 822 | "name": "psr/http-client", 823 | "version": "1.0.1", 824 | "source": { 825 | "type": "git", 826 | "url": "https://github.com/php-fig/http-client.git", 827 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" 828 | }, 829 | "dist": { 830 | "type": "zip", 831 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 832 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 833 | "shasum": "" 834 | }, 835 | "require": { 836 | "php": "^7.0 || ^8.0", 837 | "psr/http-message": "^1.0" 838 | }, 839 | "type": "library", 840 | "extra": { 841 | "branch-alias": { 842 | "dev-master": "1.0.x-dev" 843 | } 844 | }, 845 | "autoload": { 846 | "psr-4": { 847 | "Psr\\Http\\Client\\": "src/" 848 | } 849 | }, 850 | "notification-url": "https://packagist.org/downloads/", 851 | "license": [ 852 | "MIT" 853 | ], 854 | "authors": [ 855 | { 856 | "name": "PHP-FIG", 857 | "homepage": "http://www.php-fig.org/" 858 | } 859 | ], 860 | "description": "Common interface for HTTP clients", 861 | "homepage": "https://github.com/php-fig/http-client", 862 | "keywords": [ 863 | "http", 864 | "http-client", 865 | "psr", 866 | "psr-18" 867 | ], 868 | "time": "2020-06-29T06:28:15+00:00" 869 | }, 870 | { 871 | "name": "psr/http-factory", 872 | "version": "1.0.1", 873 | "source": { 874 | "type": "git", 875 | "url": "https://github.com/php-fig/http-factory.git", 876 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" 877 | }, 878 | "dist": { 879 | "type": "zip", 880 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 881 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 882 | "shasum": "" 883 | }, 884 | "require": { 885 | "php": ">=7.0.0", 886 | "psr/http-message": "^1.0" 887 | }, 888 | "type": "library", 889 | "extra": { 890 | "branch-alias": { 891 | "dev-master": "1.0.x-dev" 892 | } 893 | }, 894 | "autoload": { 895 | "psr-4": { 896 | "Psr\\Http\\Message\\": "src/" 897 | } 898 | }, 899 | "notification-url": "https://packagist.org/downloads/", 900 | "license": [ 901 | "MIT" 902 | ], 903 | "authors": [ 904 | { 905 | "name": "PHP-FIG", 906 | "homepage": "http://www.php-fig.org/" 907 | } 908 | ], 909 | "description": "Common interfaces for PSR-7 HTTP message factories", 910 | "keywords": [ 911 | "factory", 912 | "http", 913 | "message", 914 | "psr", 915 | "psr-17", 916 | "psr-7", 917 | "request", 918 | "response" 919 | ], 920 | "time": "2019-04-30T12:38:16+00:00" 921 | }, 922 | { 923 | "name": "psr/http-message", 924 | "version": "1.0.1", 925 | "source": { 926 | "type": "git", 927 | "url": "https://github.com/php-fig/http-message.git", 928 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 929 | }, 930 | "dist": { 931 | "type": "zip", 932 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 933 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 934 | "shasum": "" 935 | }, 936 | "require": { 937 | "php": ">=5.3.0" 938 | }, 939 | "type": "library", 940 | "extra": { 941 | "branch-alias": { 942 | "dev-master": "1.0.x-dev" 943 | } 944 | }, 945 | "autoload": { 946 | "psr-4": { 947 | "Psr\\Http\\Message\\": "src/" 948 | } 949 | }, 950 | "notification-url": "https://packagist.org/downloads/", 951 | "license": [ 952 | "MIT" 953 | ], 954 | "authors": [ 955 | { 956 | "name": "PHP-FIG", 957 | "homepage": "http://www.php-fig.org/" 958 | } 959 | ], 960 | "description": "Common interface for HTTP messages", 961 | "homepage": "https://github.com/php-fig/http-message", 962 | "keywords": [ 963 | "http", 964 | "http-message", 965 | "psr", 966 | "psr-7", 967 | "request", 968 | "response" 969 | ], 970 | "time": "2016-08-06T14:39:51+00:00" 971 | }, 972 | { 973 | "name": "symfony/deprecation-contracts", 974 | "version": "v2.2.0", 975 | "source": { 976 | "type": "git", 977 | "url": "https://github.com/symfony/deprecation-contracts.git", 978 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" 979 | }, 980 | "dist": { 981 | "type": "zip", 982 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", 983 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", 984 | "shasum": "" 985 | }, 986 | "require": { 987 | "php": ">=7.1" 988 | }, 989 | "type": "library", 990 | "extra": { 991 | "branch-alias": { 992 | "dev-master": "2.2-dev" 993 | }, 994 | "thanks": { 995 | "name": "symfony/contracts", 996 | "url": "https://github.com/symfony/contracts" 997 | } 998 | }, 999 | "autoload": { 1000 | "files": [ 1001 | "function.php" 1002 | ] 1003 | }, 1004 | "notification-url": "https://packagist.org/downloads/", 1005 | "license": [ 1006 | "MIT" 1007 | ], 1008 | "authors": [ 1009 | { 1010 | "name": "Nicolas Grekas", 1011 | "email": "p@tchwork.com" 1012 | }, 1013 | { 1014 | "name": "Symfony Community", 1015 | "homepage": "https://symfony.com/contributors" 1016 | } 1017 | ], 1018 | "description": "A generic function and convention to trigger deprecation notices", 1019 | "homepage": "https://symfony.com", 1020 | "funding": [ 1021 | { 1022 | "url": "https://symfony.com/sponsor", 1023 | "type": "custom" 1024 | }, 1025 | { 1026 | "url": "https://github.com/fabpot", 1027 | "type": "github" 1028 | }, 1029 | { 1030 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1031 | "type": "tidelift" 1032 | } 1033 | ], 1034 | "time": "2020-09-07T11:33:47+00:00" 1035 | }, 1036 | { 1037 | "name": "symfony/options-resolver", 1038 | "version": "v5.1.8", 1039 | "source": { 1040 | "type": "git", 1041 | "url": "https://github.com/symfony/options-resolver.git", 1042 | "reference": "c6a02905e4ffc7a1498e8ee019db2b477cd1cc02" 1043 | }, 1044 | "dist": { 1045 | "type": "zip", 1046 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/c6a02905e4ffc7a1498e8ee019db2b477cd1cc02", 1047 | "reference": "c6a02905e4ffc7a1498e8ee019db2b477cd1cc02", 1048 | "shasum": "" 1049 | }, 1050 | "require": { 1051 | "php": ">=7.2.5", 1052 | "symfony/deprecation-contracts": "^2.1", 1053 | "symfony/polyfill-php80": "^1.15" 1054 | }, 1055 | "type": "library", 1056 | "autoload": { 1057 | "psr-4": { 1058 | "Symfony\\Component\\OptionsResolver\\": "" 1059 | }, 1060 | "exclude-from-classmap": [ 1061 | "/Tests/" 1062 | ] 1063 | }, 1064 | "notification-url": "https://packagist.org/downloads/", 1065 | "license": [ 1066 | "MIT" 1067 | ], 1068 | "authors": [ 1069 | { 1070 | "name": "Fabien Potencier", 1071 | "email": "fabien@symfony.com" 1072 | }, 1073 | { 1074 | "name": "Symfony Community", 1075 | "homepage": "https://symfony.com/contributors" 1076 | } 1077 | ], 1078 | "description": "Symfony OptionsResolver Component", 1079 | "homepage": "https://symfony.com", 1080 | "keywords": [ 1081 | "config", 1082 | "configuration", 1083 | "options" 1084 | ], 1085 | "funding": [ 1086 | { 1087 | "url": "https://symfony.com/sponsor", 1088 | "type": "custom" 1089 | }, 1090 | { 1091 | "url": "https://github.com/fabpot", 1092 | "type": "github" 1093 | }, 1094 | { 1095 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1096 | "type": "tidelift" 1097 | } 1098 | ], 1099 | "time": "2020-10-24T12:01:57+00:00" 1100 | }, 1101 | { 1102 | "name": "symfony/polyfill-ctype", 1103 | "version": "v1.20.0", 1104 | "source": { 1105 | "type": "git", 1106 | "url": "https://github.com/symfony/polyfill-ctype.git", 1107 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" 1108 | }, 1109 | "dist": { 1110 | "type": "zip", 1111 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", 1112 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", 1113 | "shasum": "" 1114 | }, 1115 | "require": { 1116 | "php": ">=7.1" 1117 | }, 1118 | "suggest": { 1119 | "ext-ctype": "For best performance" 1120 | }, 1121 | "type": "library", 1122 | "extra": { 1123 | "branch-alias": { 1124 | "dev-main": "1.20-dev" 1125 | }, 1126 | "thanks": { 1127 | "name": "symfony/polyfill", 1128 | "url": "https://github.com/symfony/polyfill" 1129 | } 1130 | }, 1131 | "autoload": { 1132 | "psr-4": { 1133 | "Symfony\\Polyfill\\Ctype\\": "" 1134 | }, 1135 | "files": [ 1136 | "bootstrap.php" 1137 | ] 1138 | }, 1139 | "notification-url": "https://packagist.org/downloads/", 1140 | "license": [ 1141 | "MIT" 1142 | ], 1143 | "authors": [ 1144 | { 1145 | "name": "Gert de Pagter", 1146 | "email": "BackEndTea@gmail.com" 1147 | }, 1148 | { 1149 | "name": "Symfony Community", 1150 | "homepage": "https://symfony.com/contributors" 1151 | } 1152 | ], 1153 | "description": "Symfony polyfill for ctype functions", 1154 | "homepage": "https://symfony.com", 1155 | "keywords": [ 1156 | "compatibility", 1157 | "ctype", 1158 | "polyfill", 1159 | "portable" 1160 | ], 1161 | "funding": [ 1162 | { 1163 | "url": "https://symfony.com/sponsor", 1164 | "type": "custom" 1165 | }, 1166 | { 1167 | "url": "https://github.com/fabpot", 1168 | "type": "github" 1169 | }, 1170 | { 1171 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1172 | "type": "tidelift" 1173 | } 1174 | ], 1175 | "time": "2020-10-23T14:02:19+00:00" 1176 | }, 1177 | { 1178 | "name": "symfony/polyfill-php80", 1179 | "version": "v1.20.0", 1180 | "source": { 1181 | "type": "git", 1182 | "url": "https://github.com/symfony/polyfill-php80.git", 1183 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" 1184 | }, 1185 | "dist": { 1186 | "type": "zip", 1187 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 1188 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 1189 | "shasum": "" 1190 | }, 1191 | "require": { 1192 | "php": ">=7.1" 1193 | }, 1194 | "type": "library", 1195 | "extra": { 1196 | "branch-alias": { 1197 | "dev-main": "1.20-dev" 1198 | }, 1199 | "thanks": { 1200 | "name": "symfony/polyfill", 1201 | "url": "https://github.com/symfony/polyfill" 1202 | } 1203 | }, 1204 | "autoload": { 1205 | "psr-4": { 1206 | "Symfony\\Polyfill\\Php80\\": "" 1207 | }, 1208 | "files": [ 1209 | "bootstrap.php" 1210 | ], 1211 | "classmap": [ 1212 | "Resources/stubs" 1213 | ] 1214 | }, 1215 | "notification-url": "https://packagist.org/downloads/", 1216 | "license": [ 1217 | "MIT" 1218 | ], 1219 | "authors": [ 1220 | { 1221 | "name": "Ion Bazan", 1222 | "email": "ion.bazan@gmail.com" 1223 | }, 1224 | { 1225 | "name": "Nicolas Grekas", 1226 | "email": "p@tchwork.com" 1227 | }, 1228 | { 1229 | "name": "Symfony Community", 1230 | "homepage": "https://symfony.com/contributors" 1231 | } 1232 | ], 1233 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 1234 | "homepage": "https://symfony.com", 1235 | "keywords": [ 1236 | "compatibility", 1237 | "polyfill", 1238 | "portable", 1239 | "shim" 1240 | ], 1241 | "funding": [ 1242 | { 1243 | "url": "https://symfony.com/sponsor", 1244 | "type": "custom" 1245 | }, 1246 | { 1247 | "url": "https://github.com/fabpot", 1248 | "type": "github" 1249 | }, 1250 | { 1251 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1252 | "type": "tidelift" 1253 | } 1254 | ], 1255 | "time": "2020-10-23T14:02:19+00:00" 1256 | }, 1257 | { 1258 | "name": "webmozart/assert", 1259 | "version": "1.9.1", 1260 | "source": { 1261 | "type": "git", 1262 | "url": "https://github.com/webmozart/assert.git", 1263 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" 1264 | }, 1265 | "dist": { 1266 | "type": "zip", 1267 | "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", 1268 | "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", 1269 | "shasum": "" 1270 | }, 1271 | "require": { 1272 | "php": "^5.3.3 || ^7.0 || ^8.0", 1273 | "symfony/polyfill-ctype": "^1.8" 1274 | }, 1275 | "conflict": { 1276 | "phpstan/phpstan": "<0.12.20", 1277 | "vimeo/psalm": "<3.9.1" 1278 | }, 1279 | "require-dev": { 1280 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1281 | }, 1282 | "type": "library", 1283 | "autoload": { 1284 | "psr-4": { 1285 | "Webmozart\\Assert\\": "src/" 1286 | } 1287 | }, 1288 | "notification-url": "https://packagist.org/downloads/", 1289 | "license": [ 1290 | "MIT" 1291 | ], 1292 | "authors": [ 1293 | { 1294 | "name": "Bernhard Schussek", 1295 | "email": "bschussek@gmail.com" 1296 | } 1297 | ], 1298 | "description": "Assertions to validate method input/output with nice error messages.", 1299 | "keywords": [ 1300 | "assert", 1301 | "check", 1302 | "validate" 1303 | ], 1304 | "time": "2020-07-08T17:02:28+00:00" 1305 | }, 1306 | { 1307 | "name": "yiisoft/yii2", 1308 | "version": "2.0.38", 1309 | "source": { 1310 | "type": "git", 1311 | "url": "https://github.com/yiisoft/yii2-framework.git", 1312 | "reference": "fd01e747cc66a049ec105048f0ab8dfbdf60bf4b" 1313 | }, 1314 | "dist": { 1315 | "type": "zip", 1316 | "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/fd01e747cc66a049ec105048f0ab8dfbdf60bf4b", 1317 | "reference": "fd01e747cc66a049ec105048f0ab8dfbdf60bf4b", 1318 | "shasum": "" 1319 | }, 1320 | "require": { 1321 | "bower-asset/inputmask": "~3.2.2 | ~3.3.5", 1322 | "bower-asset/jquery": "3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", 1323 | "bower-asset/punycode": "1.3.*", 1324 | "bower-asset/yii2-pjax": "~2.0.1", 1325 | "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", 1326 | "ext-ctype": "*", 1327 | "ext-mbstring": "*", 1328 | "ezyang/htmlpurifier": "~4.6", 1329 | "lib-pcre": "*", 1330 | "php": ">=5.4.0", 1331 | "yiisoft/yii2-composer": "~2.0.4" 1332 | }, 1333 | "bin": [ 1334 | "yii" 1335 | ], 1336 | "type": "library", 1337 | "extra": { 1338 | "branch-alias": { 1339 | "dev-master": "2.0.x-dev" 1340 | } 1341 | }, 1342 | "autoload": { 1343 | "psr-4": { 1344 | "yii\\": "" 1345 | } 1346 | }, 1347 | "notification-url": "https://packagist.org/downloads/", 1348 | "license": [ 1349 | "BSD-3-Clause" 1350 | ], 1351 | "authors": [ 1352 | { 1353 | "name": "Qiang Xue", 1354 | "email": "qiang.xue@gmail.com", 1355 | "homepage": "http://www.yiiframework.com/", 1356 | "role": "Founder and project lead" 1357 | }, 1358 | { 1359 | "name": "Alexander Makarov", 1360 | "email": "sam@rmcreative.ru", 1361 | "homepage": "http://rmcreative.ru/", 1362 | "role": "Core framework development" 1363 | }, 1364 | { 1365 | "name": "Maurizio Domba", 1366 | "homepage": "http://mdomba.info/", 1367 | "role": "Core framework development" 1368 | }, 1369 | { 1370 | "name": "Carsten Brandt", 1371 | "email": "mail@cebe.cc", 1372 | "homepage": "http://cebe.cc/", 1373 | "role": "Core framework development" 1374 | }, 1375 | { 1376 | "name": "Timur Ruziev", 1377 | "email": "resurtm@gmail.com", 1378 | "homepage": "http://resurtm.com/", 1379 | "role": "Core framework development" 1380 | }, 1381 | { 1382 | "name": "Paul Klimov", 1383 | "email": "klimov.paul@gmail.com", 1384 | "role": "Core framework development" 1385 | }, 1386 | { 1387 | "name": "Dmitry Naumenko", 1388 | "email": "d.naumenko.a@gmail.com", 1389 | "role": "Core framework development" 1390 | }, 1391 | { 1392 | "name": "Boudewijn Vahrmeijer", 1393 | "email": "info@dynasource.eu", 1394 | "homepage": "http://dynasource.eu", 1395 | "role": "Core framework development" 1396 | } 1397 | ], 1398 | "description": "Yii PHP Framework Version 2", 1399 | "homepage": "http://www.yiiframework.com/", 1400 | "keywords": [ 1401 | "framework", 1402 | "yii2" 1403 | ], 1404 | "funding": [ 1405 | { 1406 | "url": "https://github.com/yiisoft", 1407 | "type": "github" 1408 | }, 1409 | { 1410 | "url": "https://opencollective.com/yiisoft", 1411 | "type": "open_collective" 1412 | }, 1413 | { 1414 | "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2", 1415 | "type": "tidelift" 1416 | } 1417 | ], 1418 | "time": "2020-09-14T21:52:10+00:00" 1419 | }, 1420 | { 1421 | "name": "yiisoft/yii2-composer", 1422 | "version": "2.0.10", 1423 | "source": { 1424 | "type": "git", 1425 | "url": "https://github.com/yiisoft/yii2-composer.git", 1426 | "reference": "94bb3f66e779e2774f8776d6e1bdeab402940510" 1427 | }, 1428 | "dist": { 1429 | "type": "zip", 1430 | "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/94bb3f66e779e2774f8776d6e1bdeab402940510", 1431 | "reference": "94bb3f66e779e2774f8776d6e1bdeab402940510", 1432 | "shasum": "" 1433 | }, 1434 | "require": { 1435 | "composer-plugin-api": "^1.0 | ^2.0" 1436 | }, 1437 | "require-dev": { 1438 | "composer/composer": "^1.0 | ^2.0@dev", 1439 | "phpunit/phpunit": "<7" 1440 | }, 1441 | "type": "composer-plugin", 1442 | "extra": { 1443 | "class": "yii\\composer\\Plugin", 1444 | "branch-alias": { 1445 | "dev-master": "2.0.x-dev" 1446 | } 1447 | }, 1448 | "autoload": { 1449 | "psr-4": { 1450 | "yii\\composer\\": "" 1451 | } 1452 | }, 1453 | "notification-url": "https://packagist.org/downloads/", 1454 | "license": [ 1455 | "BSD-3-Clause" 1456 | ], 1457 | "authors": [ 1458 | { 1459 | "name": "Qiang Xue", 1460 | "email": "qiang.xue@gmail.com" 1461 | }, 1462 | { 1463 | "name": "Carsten Brandt", 1464 | "email": "mail@cebe.cc" 1465 | } 1466 | ], 1467 | "description": "The composer plugin for Yii extension installer", 1468 | "keywords": [ 1469 | "composer", 1470 | "extension installer", 1471 | "yii2" 1472 | ], 1473 | "funding": [ 1474 | { 1475 | "url": "https://github.com/yiisoft", 1476 | "type": "github" 1477 | }, 1478 | { 1479 | "url": "https://opencollective.com/yiisoft", 1480 | "type": "open_collective" 1481 | }, 1482 | { 1483 | "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-composer", 1484 | "type": "tidelift" 1485 | } 1486 | ], 1487 | "time": "2020-06-24T00:04:01+00:00" 1488 | } 1489 | ], 1490 | "packages-dev": [ 1491 | { 1492 | "name": "doctrine/instantiator", 1493 | "version": "1.3.1", 1494 | "source": { 1495 | "type": "git", 1496 | "url": "https://github.com/doctrine/instantiator.git", 1497 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" 1498 | }, 1499 | "dist": { 1500 | "type": "zip", 1501 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", 1502 | "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", 1503 | "shasum": "" 1504 | }, 1505 | "require": { 1506 | "php": "^7.1 || ^8.0" 1507 | }, 1508 | "require-dev": { 1509 | "doctrine/coding-standard": "^6.0", 1510 | "ext-pdo": "*", 1511 | "ext-phar": "*", 1512 | "phpbench/phpbench": "^0.13", 1513 | "phpstan/phpstan-phpunit": "^0.11", 1514 | "phpstan/phpstan-shim": "^0.11", 1515 | "phpunit/phpunit": "^7.0" 1516 | }, 1517 | "type": "library", 1518 | "extra": { 1519 | "branch-alias": { 1520 | "dev-master": "1.2.x-dev" 1521 | } 1522 | }, 1523 | "autoload": { 1524 | "psr-4": { 1525 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1526 | } 1527 | }, 1528 | "notification-url": "https://packagist.org/downloads/", 1529 | "license": [ 1530 | "MIT" 1531 | ], 1532 | "authors": [ 1533 | { 1534 | "name": "Marco Pivetta", 1535 | "email": "ocramius@gmail.com", 1536 | "homepage": "http://ocramius.github.com/" 1537 | } 1538 | ], 1539 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1540 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 1541 | "keywords": [ 1542 | "constructor", 1543 | "instantiate" 1544 | ], 1545 | "funding": [ 1546 | { 1547 | "url": "https://www.doctrine-project.org/sponsorship.html", 1548 | "type": "custom" 1549 | }, 1550 | { 1551 | "url": "https://www.patreon.com/phpdoctrine", 1552 | "type": "patreon" 1553 | }, 1554 | { 1555 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 1556 | "type": "tidelift" 1557 | } 1558 | ], 1559 | "time": "2020-05-29T17:27:14+00:00" 1560 | }, 1561 | { 1562 | "name": "kriswallsmith/buzz", 1563 | "version": "1.1.0", 1564 | "source": { 1565 | "type": "git", 1566 | "url": "https://github.com/kriswallsmith/Buzz.git", 1567 | "reference": "40d2cece35d9b608505851395c390892f358e57e" 1568 | }, 1569 | "dist": { 1570 | "type": "zip", 1571 | "url": "https://api.github.com/repos/kriswallsmith/Buzz/zipball/40d2cece35d9b608505851395c390892f358e57e", 1572 | "reference": "40d2cece35d9b608505851395c390892f358e57e", 1573 | "shasum": "" 1574 | }, 1575 | "require": { 1576 | "php": "^7.1", 1577 | "php-http/httplug": "^1.1 || ^2.0", 1578 | "psr/http-client": "^1.0", 1579 | "psr/http-factory": "^1.0", 1580 | "psr/http-message": "^1.0", 1581 | "symfony/options-resolver": "^3.4 || ^4.0 || ^5.0" 1582 | }, 1583 | "provide": { 1584 | "php-http/client-implementation": "1.0", 1585 | "psr/http-client-implementation": "1.0" 1586 | }, 1587 | "require-dev": { 1588 | "nyholm/psr7": "^1.0", 1589 | "php-http/client-integration-tests": "^2.0.1", 1590 | "phpunit/phpunit": "7.5.20", 1591 | "psr/log": "^1.0" 1592 | }, 1593 | "suggest": { 1594 | "ext-curl": "To use our cUrl clients", 1595 | "nyholm/psr7": "For PSR-7 and PSR-17 implementation" 1596 | }, 1597 | "type": "library", 1598 | "autoload": { 1599 | "psr-4": { 1600 | "Buzz\\": "lib" 1601 | } 1602 | }, 1603 | "notification-url": "https://packagist.org/downloads/", 1604 | "license": [ 1605 | "MIT" 1606 | ], 1607 | "authors": [ 1608 | { 1609 | "name": "Kris Wallsmith", 1610 | "email": "kris.wallsmith@gmail.com", 1611 | "homepage": "https://kriswallsmith.net/" 1612 | }, 1613 | { 1614 | "name": "Tobias Nyholm", 1615 | "email": "tobias.nyholm@gmail.com", 1616 | "homepage": "https://tnyholm.se/" 1617 | } 1618 | ], 1619 | "description": "Lightweight HTTP client", 1620 | "homepage": "https://github.com/kriswallsmith/Buzz", 1621 | "keywords": [ 1622 | "curl", 1623 | "http client" 1624 | ], 1625 | "time": "2020-03-07T13:42:51+00:00" 1626 | }, 1627 | { 1628 | "name": "myclabs/deep-copy", 1629 | "version": "1.10.1", 1630 | "source": { 1631 | "type": "git", 1632 | "url": "https://github.com/myclabs/DeepCopy.git", 1633 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" 1634 | }, 1635 | "dist": { 1636 | "type": "zip", 1637 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 1638 | "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", 1639 | "shasum": "" 1640 | }, 1641 | "require": { 1642 | "php": "^7.1 || ^8.0" 1643 | }, 1644 | "replace": { 1645 | "myclabs/deep-copy": "self.version" 1646 | }, 1647 | "require-dev": { 1648 | "doctrine/collections": "^1.0", 1649 | "doctrine/common": "^2.6", 1650 | "phpunit/phpunit": "^7.1" 1651 | }, 1652 | "type": "library", 1653 | "autoload": { 1654 | "psr-4": { 1655 | "DeepCopy\\": "src/DeepCopy/" 1656 | }, 1657 | "files": [ 1658 | "src/DeepCopy/deep_copy.php" 1659 | ] 1660 | }, 1661 | "notification-url": "https://packagist.org/downloads/", 1662 | "license": [ 1663 | "MIT" 1664 | ], 1665 | "description": "Create deep copies (clones) of your objects", 1666 | "keywords": [ 1667 | "clone", 1668 | "copy", 1669 | "duplicate", 1670 | "object", 1671 | "object graph" 1672 | ], 1673 | "funding": [ 1674 | { 1675 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 1676 | "type": "tidelift" 1677 | } 1678 | ], 1679 | "time": "2020-06-29T13:22:24+00:00" 1680 | }, 1681 | { 1682 | "name": "nyholm/psr7", 1683 | "version": "1.3.1", 1684 | "source": { 1685 | "type": "git", 1686 | "url": "https://github.com/Nyholm/psr7.git", 1687 | "reference": "21b71a31eab5c0c2caf967b9c0fd97020254ed75" 1688 | }, 1689 | "dist": { 1690 | "type": "zip", 1691 | "url": "https://api.github.com/repos/Nyholm/psr7/zipball/21b71a31eab5c0c2caf967b9c0fd97020254ed75", 1692 | "reference": "21b71a31eab5c0c2caf967b9c0fd97020254ed75", 1693 | "shasum": "" 1694 | }, 1695 | "require": { 1696 | "php": ">=7.1", 1697 | "php-http/message-factory": "^1.0", 1698 | "psr/http-factory": "^1.0", 1699 | "psr/http-message": "^1.0" 1700 | }, 1701 | "provide": { 1702 | "psr/http-factory-implementation": "1.0", 1703 | "psr/http-message-implementation": "1.0" 1704 | }, 1705 | "require-dev": { 1706 | "http-interop/http-factory-tests": "dev-master", 1707 | "php-http/psr7-integration-tests": "^1.0", 1708 | "phpunit/phpunit": "^7.5", 1709 | "symfony/error-handler": "^4.4" 1710 | }, 1711 | "type": "library", 1712 | "extra": { 1713 | "branch-alias": { 1714 | "dev-master": "1.0-dev" 1715 | } 1716 | }, 1717 | "autoload": { 1718 | "psr-4": { 1719 | "Nyholm\\Psr7\\": "src/" 1720 | } 1721 | }, 1722 | "notification-url": "https://packagist.org/downloads/", 1723 | "license": [ 1724 | "MIT" 1725 | ], 1726 | "authors": [ 1727 | { 1728 | "name": "Tobias Nyholm", 1729 | "email": "tobias.nyholm@gmail.com" 1730 | }, 1731 | { 1732 | "name": "Martijn van der Ven", 1733 | "email": "martijn@vanderven.se" 1734 | } 1735 | ], 1736 | "description": "A fast PHP7 implementation of PSR-7", 1737 | "homepage": "http://tnyholm.se", 1738 | "keywords": [ 1739 | "psr-17", 1740 | "psr-7" 1741 | ], 1742 | "funding": [ 1743 | { 1744 | "url": "https://github.com/Zegnat", 1745 | "type": "github" 1746 | }, 1747 | { 1748 | "url": "https://github.com/nyholm", 1749 | "type": "github" 1750 | } 1751 | ], 1752 | "time": "2020-06-13T15:59:10+00:00" 1753 | }, 1754 | { 1755 | "name": "phar-io/manifest", 1756 | "version": "1.0.3", 1757 | "source": { 1758 | "type": "git", 1759 | "url": "https://github.com/phar-io/manifest.git", 1760 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 1761 | }, 1762 | "dist": { 1763 | "type": "zip", 1764 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 1765 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 1766 | "shasum": "" 1767 | }, 1768 | "require": { 1769 | "ext-dom": "*", 1770 | "ext-phar": "*", 1771 | "phar-io/version": "^2.0", 1772 | "php": "^5.6 || ^7.0" 1773 | }, 1774 | "type": "library", 1775 | "extra": { 1776 | "branch-alias": { 1777 | "dev-master": "1.0.x-dev" 1778 | } 1779 | }, 1780 | "autoload": { 1781 | "classmap": [ 1782 | "src/" 1783 | ] 1784 | }, 1785 | "notification-url": "https://packagist.org/downloads/", 1786 | "license": [ 1787 | "BSD-3-Clause" 1788 | ], 1789 | "authors": [ 1790 | { 1791 | "name": "Arne Blankerts", 1792 | "email": "arne@blankerts.de", 1793 | "role": "Developer" 1794 | }, 1795 | { 1796 | "name": "Sebastian Heuer", 1797 | "email": "sebastian@phpeople.de", 1798 | "role": "Developer" 1799 | }, 1800 | { 1801 | "name": "Sebastian Bergmann", 1802 | "email": "sebastian@phpunit.de", 1803 | "role": "Developer" 1804 | } 1805 | ], 1806 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1807 | "time": "2018-07-08T19:23:20+00:00" 1808 | }, 1809 | { 1810 | "name": "phar-io/version", 1811 | "version": "2.0.1", 1812 | "source": { 1813 | "type": "git", 1814 | "url": "https://github.com/phar-io/version.git", 1815 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 1816 | }, 1817 | "dist": { 1818 | "type": "zip", 1819 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 1820 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 1821 | "shasum": "" 1822 | }, 1823 | "require": { 1824 | "php": "^5.6 || ^7.0" 1825 | }, 1826 | "type": "library", 1827 | "autoload": { 1828 | "classmap": [ 1829 | "src/" 1830 | ] 1831 | }, 1832 | "notification-url": "https://packagist.org/downloads/", 1833 | "license": [ 1834 | "BSD-3-Clause" 1835 | ], 1836 | "authors": [ 1837 | { 1838 | "name": "Arne Blankerts", 1839 | "email": "arne@blankerts.de", 1840 | "role": "Developer" 1841 | }, 1842 | { 1843 | "name": "Sebastian Heuer", 1844 | "email": "sebastian@phpeople.de", 1845 | "role": "Developer" 1846 | }, 1847 | { 1848 | "name": "Sebastian Bergmann", 1849 | "email": "sebastian@phpunit.de", 1850 | "role": "Developer" 1851 | } 1852 | ], 1853 | "description": "Library for handling version information and constraints", 1854 | "time": "2018-07-08T19:19:57+00:00" 1855 | }, 1856 | { 1857 | "name": "phpdocumentor/reflection-common", 1858 | "version": "2.2.0", 1859 | "source": { 1860 | "type": "git", 1861 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1862 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 1863 | }, 1864 | "dist": { 1865 | "type": "zip", 1866 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1867 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1868 | "shasum": "" 1869 | }, 1870 | "require": { 1871 | "php": "^7.2 || ^8.0" 1872 | }, 1873 | "type": "library", 1874 | "extra": { 1875 | "branch-alias": { 1876 | "dev-2.x": "2.x-dev" 1877 | } 1878 | }, 1879 | "autoload": { 1880 | "psr-4": { 1881 | "phpDocumentor\\Reflection\\": "src/" 1882 | } 1883 | }, 1884 | "notification-url": "https://packagist.org/downloads/", 1885 | "license": [ 1886 | "MIT" 1887 | ], 1888 | "authors": [ 1889 | { 1890 | "name": "Jaap van Otterdijk", 1891 | "email": "opensource@ijaap.nl" 1892 | } 1893 | ], 1894 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1895 | "homepage": "http://www.phpdoc.org", 1896 | "keywords": [ 1897 | "FQSEN", 1898 | "phpDocumentor", 1899 | "phpdoc", 1900 | "reflection", 1901 | "static analysis" 1902 | ], 1903 | "time": "2020-06-27T09:03:43+00:00" 1904 | }, 1905 | { 1906 | "name": "phpdocumentor/reflection-docblock", 1907 | "version": "5.2.2", 1908 | "source": { 1909 | "type": "git", 1910 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1911 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" 1912 | }, 1913 | "dist": { 1914 | "type": "zip", 1915 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", 1916 | "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", 1917 | "shasum": "" 1918 | }, 1919 | "require": { 1920 | "ext-filter": "*", 1921 | "php": "^7.2 || ^8.0", 1922 | "phpdocumentor/reflection-common": "^2.2", 1923 | "phpdocumentor/type-resolver": "^1.3", 1924 | "webmozart/assert": "^1.9.1" 1925 | }, 1926 | "require-dev": { 1927 | "mockery/mockery": "~1.3.2" 1928 | }, 1929 | "type": "library", 1930 | "extra": { 1931 | "branch-alias": { 1932 | "dev-master": "5.x-dev" 1933 | } 1934 | }, 1935 | "autoload": { 1936 | "psr-4": { 1937 | "phpDocumentor\\Reflection\\": "src" 1938 | } 1939 | }, 1940 | "notification-url": "https://packagist.org/downloads/", 1941 | "license": [ 1942 | "MIT" 1943 | ], 1944 | "authors": [ 1945 | { 1946 | "name": "Mike van Riel", 1947 | "email": "me@mikevanriel.com" 1948 | }, 1949 | { 1950 | "name": "Jaap van Otterdijk", 1951 | "email": "account@ijaap.nl" 1952 | } 1953 | ], 1954 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1955 | "time": "2020-09-03T19:13:55+00:00" 1956 | }, 1957 | { 1958 | "name": "phpdocumentor/type-resolver", 1959 | "version": "1.4.0", 1960 | "source": { 1961 | "type": "git", 1962 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1963 | "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" 1964 | }, 1965 | "dist": { 1966 | "type": "zip", 1967 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", 1968 | "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", 1969 | "shasum": "" 1970 | }, 1971 | "require": { 1972 | "php": "^7.2 || ^8.0", 1973 | "phpdocumentor/reflection-common": "^2.0" 1974 | }, 1975 | "require-dev": { 1976 | "ext-tokenizer": "*" 1977 | }, 1978 | "type": "library", 1979 | "extra": { 1980 | "branch-alias": { 1981 | "dev-1.x": "1.x-dev" 1982 | } 1983 | }, 1984 | "autoload": { 1985 | "psr-4": { 1986 | "phpDocumentor\\Reflection\\": "src" 1987 | } 1988 | }, 1989 | "notification-url": "https://packagist.org/downloads/", 1990 | "license": [ 1991 | "MIT" 1992 | ], 1993 | "authors": [ 1994 | { 1995 | "name": "Mike van Riel", 1996 | "email": "me@mikevanriel.com" 1997 | } 1998 | ], 1999 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 2000 | "time": "2020-09-17T18:55:26+00:00" 2001 | }, 2002 | { 2003 | "name": "phpoption/phpoption", 2004 | "version": "1.7.5", 2005 | "source": { 2006 | "type": "git", 2007 | "url": "https://github.com/schmittjoh/php-option.git", 2008 | "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" 2009 | }, 2010 | "dist": { 2011 | "type": "zip", 2012 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", 2013 | "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", 2014 | "shasum": "" 2015 | }, 2016 | "require": { 2017 | "php": "^5.5.9 || ^7.0 || ^8.0" 2018 | }, 2019 | "require-dev": { 2020 | "bamarni/composer-bin-plugin": "^1.4.1", 2021 | "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" 2022 | }, 2023 | "type": "library", 2024 | "extra": { 2025 | "branch-alias": { 2026 | "dev-master": "1.7-dev" 2027 | } 2028 | }, 2029 | "autoload": { 2030 | "psr-4": { 2031 | "PhpOption\\": "src/PhpOption/" 2032 | } 2033 | }, 2034 | "notification-url": "https://packagist.org/downloads/", 2035 | "license": [ 2036 | "Apache-2.0" 2037 | ], 2038 | "authors": [ 2039 | { 2040 | "name": "Johannes M. Schmitt", 2041 | "email": "schmittjoh@gmail.com" 2042 | }, 2043 | { 2044 | "name": "Graham Campbell", 2045 | "email": "graham@alt-three.com" 2046 | } 2047 | ], 2048 | "description": "Option Type for PHP", 2049 | "keywords": [ 2050 | "language", 2051 | "option", 2052 | "php", 2053 | "type" 2054 | ], 2055 | "funding": [ 2056 | { 2057 | "url": "https://github.com/GrahamCampbell", 2058 | "type": "github" 2059 | }, 2060 | { 2061 | "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", 2062 | "type": "tidelift" 2063 | } 2064 | ], 2065 | "time": "2020-07-20T17:29:33+00:00" 2066 | }, 2067 | { 2068 | "name": "phpspec/prophecy", 2069 | "version": "1.12.1", 2070 | "source": { 2071 | "type": "git", 2072 | "url": "https://github.com/phpspec/prophecy.git", 2073 | "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" 2074 | }, 2075 | "dist": { 2076 | "type": "zip", 2077 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", 2078 | "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", 2079 | "shasum": "" 2080 | }, 2081 | "require": { 2082 | "doctrine/instantiator": "^1.2", 2083 | "php": "^7.2 || ~8.0, <8.1", 2084 | "phpdocumentor/reflection-docblock": "^5.2", 2085 | "sebastian/comparator": "^3.0 || ^4.0", 2086 | "sebastian/recursion-context": "^3.0 || ^4.0" 2087 | }, 2088 | "require-dev": { 2089 | "phpspec/phpspec": "^6.0", 2090 | "phpunit/phpunit": "^8.0 || ^9.0 <9.3" 2091 | }, 2092 | "type": "library", 2093 | "extra": { 2094 | "branch-alias": { 2095 | "dev-master": "1.11.x-dev" 2096 | } 2097 | }, 2098 | "autoload": { 2099 | "psr-4": { 2100 | "Prophecy\\": "src/Prophecy" 2101 | } 2102 | }, 2103 | "notification-url": "https://packagist.org/downloads/", 2104 | "license": [ 2105 | "MIT" 2106 | ], 2107 | "authors": [ 2108 | { 2109 | "name": "Konstantin Kudryashov", 2110 | "email": "ever.zet@gmail.com", 2111 | "homepage": "http://everzet.com" 2112 | }, 2113 | { 2114 | "name": "Marcello Duarte", 2115 | "email": "marcello.duarte@gmail.com" 2116 | } 2117 | ], 2118 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2119 | "homepage": "https://github.com/phpspec/prophecy", 2120 | "keywords": [ 2121 | "Double", 2122 | "Dummy", 2123 | "fake", 2124 | "mock", 2125 | "spy", 2126 | "stub" 2127 | ], 2128 | "time": "2020-09-29T09:10:42+00:00" 2129 | }, 2130 | { 2131 | "name": "phpunit/php-code-coverage", 2132 | "version": "7.0.10", 2133 | "source": { 2134 | "type": "git", 2135 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2136 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" 2137 | }, 2138 | "dist": { 2139 | "type": "zip", 2140 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", 2141 | "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", 2142 | "shasum": "" 2143 | }, 2144 | "require": { 2145 | "ext-dom": "*", 2146 | "ext-xmlwriter": "*", 2147 | "php": "^7.2", 2148 | "phpunit/php-file-iterator": "^2.0.2", 2149 | "phpunit/php-text-template": "^1.2.1", 2150 | "phpunit/php-token-stream": "^3.1.1", 2151 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 2152 | "sebastian/environment": "^4.2.2", 2153 | "sebastian/version": "^2.0.1", 2154 | "theseer/tokenizer": "^1.1.3" 2155 | }, 2156 | "require-dev": { 2157 | "phpunit/phpunit": "^8.2.2" 2158 | }, 2159 | "suggest": { 2160 | "ext-xdebug": "^2.7.2" 2161 | }, 2162 | "type": "library", 2163 | "extra": { 2164 | "branch-alias": { 2165 | "dev-master": "7.0-dev" 2166 | } 2167 | }, 2168 | "autoload": { 2169 | "classmap": [ 2170 | "src/" 2171 | ] 2172 | }, 2173 | "notification-url": "https://packagist.org/downloads/", 2174 | "license": [ 2175 | "BSD-3-Clause" 2176 | ], 2177 | "authors": [ 2178 | { 2179 | "name": "Sebastian Bergmann", 2180 | "email": "sebastian@phpunit.de", 2181 | "role": "lead" 2182 | } 2183 | ], 2184 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2185 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2186 | "keywords": [ 2187 | "coverage", 2188 | "testing", 2189 | "xunit" 2190 | ], 2191 | "time": "2019-11-20T13:55:58+00:00" 2192 | }, 2193 | { 2194 | "name": "phpunit/php-file-iterator", 2195 | "version": "2.0.2", 2196 | "source": { 2197 | "type": "git", 2198 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2199 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 2200 | }, 2201 | "dist": { 2202 | "type": "zip", 2203 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 2204 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 2205 | "shasum": "" 2206 | }, 2207 | "require": { 2208 | "php": "^7.1" 2209 | }, 2210 | "require-dev": { 2211 | "phpunit/phpunit": "^7.1" 2212 | }, 2213 | "type": "library", 2214 | "extra": { 2215 | "branch-alias": { 2216 | "dev-master": "2.0.x-dev" 2217 | } 2218 | }, 2219 | "autoload": { 2220 | "classmap": [ 2221 | "src/" 2222 | ] 2223 | }, 2224 | "notification-url": "https://packagist.org/downloads/", 2225 | "license": [ 2226 | "BSD-3-Clause" 2227 | ], 2228 | "authors": [ 2229 | { 2230 | "name": "Sebastian Bergmann", 2231 | "email": "sebastian@phpunit.de", 2232 | "role": "lead" 2233 | } 2234 | ], 2235 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2236 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2237 | "keywords": [ 2238 | "filesystem", 2239 | "iterator" 2240 | ], 2241 | "time": "2018-09-13T20:33:42+00:00" 2242 | }, 2243 | { 2244 | "name": "phpunit/php-text-template", 2245 | "version": "1.2.1", 2246 | "source": { 2247 | "type": "git", 2248 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2249 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2250 | }, 2251 | "dist": { 2252 | "type": "zip", 2253 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2254 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2255 | "shasum": "" 2256 | }, 2257 | "require": { 2258 | "php": ">=5.3.3" 2259 | }, 2260 | "type": "library", 2261 | "autoload": { 2262 | "classmap": [ 2263 | "src/" 2264 | ] 2265 | }, 2266 | "notification-url": "https://packagist.org/downloads/", 2267 | "license": [ 2268 | "BSD-3-Clause" 2269 | ], 2270 | "authors": [ 2271 | { 2272 | "name": "Sebastian Bergmann", 2273 | "email": "sebastian@phpunit.de", 2274 | "role": "lead" 2275 | } 2276 | ], 2277 | "description": "Simple template engine.", 2278 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2279 | "keywords": [ 2280 | "template" 2281 | ], 2282 | "time": "2015-06-21T13:50:34+00:00" 2283 | }, 2284 | { 2285 | "name": "phpunit/php-timer", 2286 | "version": "2.1.2", 2287 | "source": { 2288 | "type": "git", 2289 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2290 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 2291 | }, 2292 | "dist": { 2293 | "type": "zip", 2294 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 2295 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 2296 | "shasum": "" 2297 | }, 2298 | "require": { 2299 | "php": "^7.1" 2300 | }, 2301 | "require-dev": { 2302 | "phpunit/phpunit": "^7.0" 2303 | }, 2304 | "type": "library", 2305 | "extra": { 2306 | "branch-alias": { 2307 | "dev-master": "2.1-dev" 2308 | } 2309 | }, 2310 | "autoload": { 2311 | "classmap": [ 2312 | "src/" 2313 | ] 2314 | }, 2315 | "notification-url": "https://packagist.org/downloads/", 2316 | "license": [ 2317 | "BSD-3-Clause" 2318 | ], 2319 | "authors": [ 2320 | { 2321 | "name": "Sebastian Bergmann", 2322 | "email": "sebastian@phpunit.de", 2323 | "role": "lead" 2324 | } 2325 | ], 2326 | "description": "Utility class for timing", 2327 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2328 | "keywords": [ 2329 | "timer" 2330 | ], 2331 | "time": "2019-06-07T04:22:29+00:00" 2332 | }, 2333 | { 2334 | "name": "phpunit/php-token-stream", 2335 | "version": "3.1.1", 2336 | "source": { 2337 | "type": "git", 2338 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2339 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 2340 | }, 2341 | "dist": { 2342 | "type": "zip", 2343 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 2344 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 2345 | "shasum": "" 2346 | }, 2347 | "require": { 2348 | "ext-tokenizer": "*", 2349 | "php": "^7.1" 2350 | }, 2351 | "require-dev": { 2352 | "phpunit/phpunit": "^7.0" 2353 | }, 2354 | "type": "library", 2355 | "extra": { 2356 | "branch-alias": { 2357 | "dev-master": "3.1-dev" 2358 | } 2359 | }, 2360 | "autoload": { 2361 | "classmap": [ 2362 | "src/" 2363 | ] 2364 | }, 2365 | "notification-url": "https://packagist.org/downloads/", 2366 | "license": [ 2367 | "BSD-3-Clause" 2368 | ], 2369 | "authors": [ 2370 | { 2371 | "name": "Sebastian Bergmann", 2372 | "email": "sebastian@phpunit.de" 2373 | } 2374 | ], 2375 | "description": "Wrapper around PHP's tokenizer extension.", 2376 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2377 | "keywords": [ 2378 | "tokenizer" 2379 | ], 2380 | "abandoned": true, 2381 | "time": "2019-09-17T06:23:10+00:00" 2382 | }, 2383 | { 2384 | "name": "phpunit/phpunit", 2385 | "version": "8.5.8", 2386 | "source": { 2387 | "type": "git", 2388 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2389 | "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" 2390 | }, 2391 | "dist": { 2392 | "type": "zip", 2393 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", 2394 | "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", 2395 | "shasum": "" 2396 | }, 2397 | "require": { 2398 | "doctrine/instantiator": "^1.2.0", 2399 | "ext-dom": "*", 2400 | "ext-json": "*", 2401 | "ext-libxml": "*", 2402 | "ext-mbstring": "*", 2403 | "ext-xml": "*", 2404 | "ext-xmlwriter": "*", 2405 | "myclabs/deep-copy": "^1.9.1", 2406 | "phar-io/manifest": "^1.0.3", 2407 | "phar-io/version": "^2.0.1", 2408 | "php": "^7.2", 2409 | "phpspec/prophecy": "^1.8.1", 2410 | "phpunit/php-code-coverage": "^7.0.7", 2411 | "phpunit/php-file-iterator": "^2.0.2", 2412 | "phpunit/php-text-template": "^1.2.1", 2413 | "phpunit/php-timer": "^2.1.2", 2414 | "sebastian/comparator": "^3.0.2", 2415 | "sebastian/diff": "^3.0.2", 2416 | "sebastian/environment": "^4.2.2", 2417 | "sebastian/exporter": "^3.1.1", 2418 | "sebastian/global-state": "^3.0.0", 2419 | "sebastian/object-enumerator": "^3.0.3", 2420 | "sebastian/resource-operations": "^2.0.1", 2421 | "sebastian/type": "^1.1.3", 2422 | "sebastian/version": "^2.0.1" 2423 | }, 2424 | "require-dev": { 2425 | "ext-pdo": "*" 2426 | }, 2427 | "suggest": { 2428 | "ext-soap": "*", 2429 | "ext-xdebug": "*", 2430 | "phpunit/php-invoker": "^2.0.0" 2431 | }, 2432 | "bin": [ 2433 | "phpunit" 2434 | ], 2435 | "type": "library", 2436 | "extra": { 2437 | "branch-alias": { 2438 | "dev-master": "8.5-dev" 2439 | } 2440 | }, 2441 | "autoload": { 2442 | "classmap": [ 2443 | "src/" 2444 | ] 2445 | }, 2446 | "notification-url": "https://packagist.org/downloads/", 2447 | "license": [ 2448 | "BSD-3-Clause" 2449 | ], 2450 | "authors": [ 2451 | { 2452 | "name": "Sebastian Bergmann", 2453 | "email": "sebastian@phpunit.de", 2454 | "role": "lead" 2455 | } 2456 | ], 2457 | "description": "The PHP Unit Testing framework.", 2458 | "homepage": "https://phpunit.de/", 2459 | "keywords": [ 2460 | "phpunit", 2461 | "testing", 2462 | "xunit" 2463 | ], 2464 | "funding": [ 2465 | { 2466 | "url": "https://phpunit.de/donate.html", 2467 | "type": "custom" 2468 | }, 2469 | { 2470 | "url": "https://github.com/sebastianbergmann", 2471 | "type": "github" 2472 | } 2473 | ], 2474 | "time": "2020-06-22T07:06:58+00:00" 2475 | }, 2476 | { 2477 | "name": "sebastian/code-unit-reverse-lookup", 2478 | "version": "1.0.1", 2479 | "source": { 2480 | "type": "git", 2481 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2482 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 2483 | }, 2484 | "dist": { 2485 | "type": "zip", 2486 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2487 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2488 | "shasum": "" 2489 | }, 2490 | "require": { 2491 | "php": "^5.6 || ^7.0" 2492 | }, 2493 | "require-dev": { 2494 | "phpunit/phpunit": "^5.7 || ^6.0" 2495 | }, 2496 | "type": "library", 2497 | "extra": { 2498 | "branch-alias": { 2499 | "dev-master": "1.0.x-dev" 2500 | } 2501 | }, 2502 | "autoload": { 2503 | "classmap": [ 2504 | "src/" 2505 | ] 2506 | }, 2507 | "notification-url": "https://packagist.org/downloads/", 2508 | "license": [ 2509 | "BSD-3-Clause" 2510 | ], 2511 | "authors": [ 2512 | { 2513 | "name": "Sebastian Bergmann", 2514 | "email": "sebastian@phpunit.de" 2515 | } 2516 | ], 2517 | "description": "Looks up which function or method a line of code belongs to", 2518 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2519 | "time": "2017-03-04T06:30:41+00:00" 2520 | }, 2521 | { 2522 | "name": "sebastian/comparator", 2523 | "version": "3.0.2", 2524 | "source": { 2525 | "type": "git", 2526 | "url": "https://github.com/sebastianbergmann/comparator.git", 2527 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 2528 | }, 2529 | "dist": { 2530 | "type": "zip", 2531 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 2532 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 2533 | "shasum": "" 2534 | }, 2535 | "require": { 2536 | "php": "^7.1", 2537 | "sebastian/diff": "^3.0", 2538 | "sebastian/exporter": "^3.1" 2539 | }, 2540 | "require-dev": { 2541 | "phpunit/phpunit": "^7.1" 2542 | }, 2543 | "type": "library", 2544 | "extra": { 2545 | "branch-alias": { 2546 | "dev-master": "3.0-dev" 2547 | } 2548 | }, 2549 | "autoload": { 2550 | "classmap": [ 2551 | "src/" 2552 | ] 2553 | }, 2554 | "notification-url": "https://packagist.org/downloads/", 2555 | "license": [ 2556 | "BSD-3-Clause" 2557 | ], 2558 | "authors": [ 2559 | { 2560 | "name": "Jeff Welch", 2561 | "email": "whatthejeff@gmail.com" 2562 | }, 2563 | { 2564 | "name": "Volker Dusch", 2565 | "email": "github@wallbash.com" 2566 | }, 2567 | { 2568 | "name": "Bernhard Schussek", 2569 | "email": "bschussek@2bepublished.at" 2570 | }, 2571 | { 2572 | "name": "Sebastian Bergmann", 2573 | "email": "sebastian@phpunit.de" 2574 | } 2575 | ], 2576 | "description": "Provides the functionality to compare PHP values for equality", 2577 | "homepage": "https://github.com/sebastianbergmann/comparator", 2578 | "keywords": [ 2579 | "comparator", 2580 | "compare", 2581 | "equality" 2582 | ], 2583 | "time": "2018-07-12T15:12:46+00:00" 2584 | }, 2585 | { 2586 | "name": "sebastian/diff", 2587 | "version": "3.0.2", 2588 | "source": { 2589 | "type": "git", 2590 | "url": "https://github.com/sebastianbergmann/diff.git", 2591 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 2592 | }, 2593 | "dist": { 2594 | "type": "zip", 2595 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 2596 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 2597 | "shasum": "" 2598 | }, 2599 | "require": { 2600 | "php": "^7.1" 2601 | }, 2602 | "require-dev": { 2603 | "phpunit/phpunit": "^7.5 || ^8.0", 2604 | "symfony/process": "^2 || ^3.3 || ^4" 2605 | }, 2606 | "type": "library", 2607 | "extra": { 2608 | "branch-alias": { 2609 | "dev-master": "3.0-dev" 2610 | } 2611 | }, 2612 | "autoload": { 2613 | "classmap": [ 2614 | "src/" 2615 | ] 2616 | }, 2617 | "notification-url": "https://packagist.org/downloads/", 2618 | "license": [ 2619 | "BSD-3-Clause" 2620 | ], 2621 | "authors": [ 2622 | { 2623 | "name": "Kore Nordmann", 2624 | "email": "mail@kore-nordmann.de" 2625 | }, 2626 | { 2627 | "name": "Sebastian Bergmann", 2628 | "email": "sebastian@phpunit.de" 2629 | } 2630 | ], 2631 | "description": "Diff implementation", 2632 | "homepage": "https://github.com/sebastianbergmann/diff", 2633 | "keywords": [ 2634 | "diff", 2635 | "udiff", 2636 | "unidiff", 2637 | "unified diff" 2638 | ], 2639 | "time": "2019-02-04T06:01:07+00:00" 2640 | }, 2641 | { 2642 | "name": "sebastian/environment", 2643 | "version": "4.2.3", 2644 | "source": { 2645 | "type": "git", 2646 | "url": "https://github.com/sebastianbergmann/environment.git", 2647 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" 2648 | }, 2649 | "dist": { 2650 | "type": "zip", 2651 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 2652 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 2653 | "shasum": "" 2654 | }, 2655 | "require": { 2656 | "php": "^7.1" 2657 | }, 2658 | "require-dev": { 2659 | "phpunit/phpunit": "^7.5" 2660 | }, 2661 | "suggest": { 2662 | "ext-posix": "*" 2663 | }, 2664 | "type": "library", 2665 | "extra": { 2666 | "branch-alias": { 2667 | "dev-master": "4.2-dev" 2668 | } 2669 | }, 2670 | "autoload": { 2671 | "classmap": [ 2672 | "src/" 2673 | ] 2674 | }, 2675 | "notification-url": "https://packagist.org/downloads/", 2676 | "license": [ 2677 | "BSD-3-Clause" 2678 | ], 2679 | "authors": [ 2680 | { 2681 | "name": "Sebastian Bergmann", 2682 | "email": "sebastian@phpunit.de" 2683 | } 2684 | ], 2685 | "description": "Provides functionality to handle HHVM/PHP environments", 2686 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2687 | "keywords": [ 2688 | "Xdebug", 2689 | "environment", 2690 | "hhvm" 2691 | ], 2692 | "time": "2019-11-20T08:46:58+00:00" 2693 | }, 2694 | { 2695 | "name": "sebastian/exporter", 2696 | "version": "3.1.2", 2697 | "source": { 2698 | "type": "git", 2699 | "url": "https://github.com/sebastianbergmann/exporter.git", 2700 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 2701 | }, 2702 | "dist": { 2703 | "type": "zip", 2704 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 2705 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 2706 | "shasum": "" 2707 | }, 2708 | "require": { 2709 | "php": "^7.0", 2710 | "sebastian/recursion-context": "^3.0" 2711 | }, 2712 | "require-dev": { 2713 | "ext-mbstring": "*", 2714 | "phpunit/phpunit": "^6.0" 2715 | }, 2716 | "type": "library", 2717 | "extra": { 2718 | "branch-alias": { 2719 | "dev-master": "3.1.x-dev" 2720 | } 2721 | }, 2722 | "autoload": { 2723 | "classmap": [ 2724 | "src/" 2725 | ] 2726 | }, 2727 | "notification-url": "https://packagist.org/downloads/", 2728 | "license": [ 2729 | "BSD-3-Clause" 2730 | ], 2731 | "authors": [ 2732 | { 2733 | "name": "Sebastian Bergmann", 2734 | "email": "sebastian@phpunit.de" 2735 | }, 2736 | { 2737 | "name": "Jeff Welch", 2738 | "email": "whatthejeff@gmail.com" 2739 | }, 2740 | { 2741 | "name": "Volker Dusch", 2742 | "email": "github@wallbash.com" 2743 | }, 2744 | { 2745 | "name": "Adam Harvey", 2746 | "email": "aharvey@php.net" 2747 | }, 2748 | { 2749 | "name": "Bernhard Schussek", 2750 | "email": "bschussek@gmail.com" 2751 | } 2752 | ], 2753 | "description": "Provides the functionality to export PHP variables for visualization", 2754 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2755 | "keywords": [ 2756 | "export", 2757 | "exporter" 2758 | ], 2759 | "time": "2019-09-14T09:02:43+00:00" 2760 | }, 2761 | { 2762 | "name": "sebastian/global-state", 2763 | "version": "3.0.0", 2764 | "source": { 2765 | "type": "git", 2766 | "url": "https://github.com/sebastianbergmann/global-state.git", 2767 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" 2768 | }, 2769 | "dist": { 2770 | "type": "zip", 2771 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 2772 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 2773 | "shasum": "" 2774 | }, 2775 | "require": { 2776 | "php": "^7.2", 2777 | "sebastian/object-reflector": "^1.1.1", 2778 | "sebastian/recursion-context": "^3.0" 2779 | }, 2780 | "require-dev": { 2781 | "ext-dom": "*", 2782 | "phpunit/phpunit": "^8.0" 2783 | }, 2784 | "suggest": { 2785 | "ext-uopz": "*" 2786 | }, 2787 | "type": "library", 2788 | "extra": { 2789 | "branch-alias": { 2790 | "dev-master": "3.0-dev" 2791 | } 2792 | }, 2793 | "autoload": { 2794 | "classmap": [ 2795 | "src/" 2796 | ] 2797 | }, 2798 | "notification-url": "https://packagist.org/downloads/", 2799 | "license": [ 2800 | "BSD-3-Clause" 2801 | ], 2802 | "authors": [ 2803 | { 2804 | "name": "Sebastian Bergmann", 2805 | "email": "sebastian@phpunit.de" 2806 | } 2807 | ], 2808 | "description": "Snapshotting of global state", 2809 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2810 | "keywords": [ 2811 | "global state" 2812 | ], 2813 | "time": "2019-02-01T05:30:01+00:00" 2814 | }, 2815 | { 2816 | "name": "sebastian/object-enumerator", 2817 | "version": "3.0.3", 2818 | "source": { 2819 | "type": "git", 2820 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2821 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 2822 | }, 2823 | "dist": { 2824 | "type": "zip", 2825 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 2826 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 2827 | "shasum": "" 2828 | }, 2829 | "require": { 2830 | "php": "^7.0", 2831 | "sebastian/object-reflector": "^1.1.1", 2832 | "sebastian/recursion-context": "^3.0" 2833 | }, 2834 | "require-dev": { 2835 | "phpunit/phpunit": "^6.0" 2836 | }, 2837 | "type": "library", 2838 | "extra": { 2839 | "branch-alias": { 2840 | "dev-master": "3.0.x-dev" 2841 | } 2842 | }, 2843 | "autoload": { 2844 | "classmap": [ 2845 | "src/" 2846 | ] 2847 | }, 2848 | "notification-url": "https://packagist.org/downloads/", 2849 | "license": [ 2850 | "BSD-3-Clause" 2851 | ], 2852 | "authors": [ 2853 | { 2854 | "name": "Sebastian Bergmann", 2855 | "email": "sebastian@phpunit.de" 2856 | } 2857 | ], 2858 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2859 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2860 | "time": "2017-08-03T12:35:26+00:00" 2861 | }, 2862 | { 2863 | "name": "sebastian/object-reflector", 2864 | "version": "1.1.1", 2865 | "source": { 2866 | "type": "git", 2867 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2868 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 2869 | }, 2870 | "dist": { 2871 | "type": "zip", 2872 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 2873 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 2874 | "shasum": "" 2875 | }, 2876 | "require": { 2877 | "php": "^7.0" 2878 | }, 2879 | "require-dev": { 2880 | "phpunit/phpunit": "^6.0" 2881 | }, 2882 | "type": "library", 2883 | "extra": { 2884 | "branch-alias": { 2885 | "dev-master": "1.1-dev" 2886 | } 2887 | }, 2888 | "autoload": { 2889 | "classmap": [ 2890 | "src/" 2891 | ] 2892 | }, 2893 | "notification-url": "https://packagist.org/downloads/", 2894 | "license": [ 2895 | "BSD-3-Clause" 2896 | ], 2897 | "authors": [ 2898 | { 2899 | "name": "Sebastian Bergmann", 2900 | "email": "sebastian@phpunit.de" 2901 | } 2902 | ], 2903 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2904 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2905 | "time": "2017-03-29T09:07:27+00:00" 2906 | }, 2907 | { 2908 | "name": "sebastian/recursion-context", 2909 | "version": "3.0.0", 2910 | "source": { 2911 | "type": "git", 2912 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2913 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 2914 | }, 2915 | "dist": { 2916 | "type": "zip", 2917 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2918 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2919 | "shasum": "" 2920 | }, 2921 | "require": { 2922 | "php": "^7.0" 2923 | }, 2924 | "require-dev": { 2925 | "phpunit/phpunit": "^6.0" 2926 | }, 2927 | "type": "library", 2928 | "extra": { 2929 | "branch-alias": { 2930 | "dev-master": "3.0.x-dev" 2931 | } 2932 | }, 2933 | "autoload": { 2934 | "classmap": [ 2935 | "src/" 2936 | ] 2937 | }, 2938 | "notification-url": "https://packagist.org/downloads/", 2939 | "license": [ 2940 | "BSD-3-Clause" 2941 | ], 2942 | "authors": [ 2943 | { 2944 | "name": "Jeff Welch", 2945 | "email": "whatthejeff@gmail.com" 2946 | }, 2947 | { 2948 | "name": "Sebastian Bergmann", 2949 | "email": "sebastian@phpunit.de" 2950 | }, 2951 | { 2952 | "name": "Adam Harvey", 2953 | "email": "aharvey@php.net" 2954 | } 2955 | ], 2956 | "description": "Provides functionality to recursively process PHP variables", 2957 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2958 | "time": "2017-03-03T06:23:57+00:00" 2959 | }, 2960 | { 2961 | "name": "sebastian/resource-operations", 2962 | "version": "2.0.1", 2963 | "source": { 2964 | "type": "git", 2965 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2966 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 2967 | }, 2968 | "dist": { 2969 | "type": "zip", 2970 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 2971 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 2972 | "shasum": "" 2973 | }, 2974 | "require": { 2975 | "php": "^7.1" 2976 | }, 2977 | "type": "library", 2978 | "extra": { 2979 | "branch-alias": { 2980 | "dev-master": "2.0-dev" 2981 | } 2982 | }, 2983 | "autoload": { 2984 | "classmap": [ 2985 | "src/" 2986 | ] 2987 | }, 2988 | "notification-url": "https://packagist.org/downloads/", 2989 | "license": [ 2990 | "BSD-3-Clause" 2991 | ], 2992 | "authors": [ 2993 | { 2994 | "name": "Sebastian Bergmann", 2995 | "email": "sebastian@phpunit.de" 2996 | } 2997 | ], 2998 | "description": "Provides a list of PHP built-in functions that operate on resources", 2999 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3000 | "time": "2018-10-04T04:07:39+00:00" 3001 | }, 3002 | { 3003 | "name": "sebastian/type", 3004 | "version": "1.1.3", 3005 | "source": { 3006 | "type": "git", 3007 | "url": "https://github.com/sebastianbergmann/type.git", 3008 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" 3009 | }, 3010 | "dist": { 3011 | "type": "zip", 3012 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", 3013 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", 3014 | "shasum": "" 3015 | }, 3016 | "require": { 3017 | "php": "^7.2" 3018 | }, 3019 | "require-dev": { 3020 | "phpunit/phpunit": "^8.2" 3021 | }, 3022 | "type": "library", 3023 | "extra": { 3024 | "branch-alias": { 3025 | "dev-master": "1.1-dev" 3026 | } 3027 | }, 3028 | "autoload": { 3029 | "classmap": [ 3030 | "src/" 3031 | ] 3032 | }, 3033 | "notification-url": "https://packagist.org/downloads/", 3034 | "license": [ 3035 | "BSD-3-Clause" 3036 | ], 3037 | "authors": [ 3038 | { 3039 | "name": "Sebastian Bergmann", 3040 | "email": "sebastian@phpunit.de", 3041 | "role": "lead" 3042 | } 3043 | ], 3044 | "description": "Collection of value objects that represent the types of the PHP type system", 3045 | "homepage": "https://github.com/sebastianbergmann/type", 3046 | "time": "2019-07-02T08:10:15+00:00" 3047 | }, 3048 | { 3049 | "name": "sebastian/version", 3050 | "version": "2.0.1", 3051 | "source": { 3052 | "type": "git", 3053 | "url": "https://github.com/sebastianbergmann/version.git", 3054 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3055 | }, 3056 | "dist": { 3057 | "type": "zip", 3058 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3059 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3060 | "shasum": "" 3061 | }, 3062 | "require": { 3063 | "php": ">=5.6" 3064 | }, 3065 | "type": "library", 3066 | "extra": { 3067 | "branch-alias": { 3068 | "dev-master": "2.0.x-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 | "role": "lead" 3085 | } 3086 | ], 3087 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3088 | "homepage": "https://github.com/sebastianbergmann/version", 3089 | "time": "2016-10-03T07:35:21+00:00" 3090 | }, 3091 | { 3092 | "name": "theseer/tokenizer", 3093 | "version": "1.2.0", 3094 | "source": { 3095 | "type": "git", 3096 | "url": "https://github.com/theseer/tokenizer.git", 3097 | "reference": "75a63c33a8577608444246075ea0af0d052e452a" 3098 | }, 3099 | "dist": { 3100 | "type": "zip", 3101 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", 3102 | "reference": "75a63c33a8577608444246075ea0af0d052e452a", 3103 | "shasum": "" 3104 | }, 3105 | "require": { 3106 | "ext-dom": "*", 3107 | "ext-tokenizer": "*", 3108 | "ext-xmlwriter": "*", 3109 | "php": "^7.2 || ^8.0" 3110 | }, 3111 | "type": "library", 3112 | "autoload": { 3113 | "classmap": [ 3114 | "src/" 3115 | ] 3116 | }, 3117 | "notification-url": "https://packagist.org/downloads/", 3118 | "license": [ 3119 | "BSD-3-Clause" 3120 | ], 3121 | "authors": [ 3122 | { 3123 | "name": "Arne Blankerts", 3124 | "email": "arne@blankerts.de", 3125 | "role": "Developer" 3126 | } 3127 | ], 3128 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3129 | "funding": [ 3130 | { 3131 | "url": "https://github.com/theseer", 3132 | "type": "github" 3133 | } 3134 | ], 3135 | "time": "2020-07-12T23:59:07+00:00" 3136 | }, 3137 | { 3138 | "name": "vlucas/phpdotenv", 3139 | "version": "v3.6.7", 3140 | "source": { 3141 | "type": "git", 3142 | "url": "https://github.com/vlucas/phpdotenv.git", 3143 | "reference": "2065beda6cbe75e2603686907b2e45f6f3a5ad82" 3144 | }, 3145 | "dist": { 3146 | "type": "zip", 3147 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2065beda6cbe75e2603686907b2e45f6f3a5ad82", 3148 | "reference": "2065beda6cbe75e2603686907b2e45f6f3a5ad82", 3149 | "shasum": "" 3150 | }, 3151 | "require": { 3152 | "php": "^5.4 || ^7.0 || ^8.0", 3153 | "phpoption/phpoption": "^1.5.2", 3154 | "symfony/polyfill-ctype": "^1.17" 3155 | }, 3156 | "require-dev": { 3157 | "ext-filter": "*", 3158 | "ext-pcre": "*", 3159 | "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0" 3160 | }, 3161 | "suggest": { 3162 | "ext-filter": "Required to use the boolean validator.", 3163 | "ext-pcre": "Required to use most of the library." 3164 | }, 3165 | "type": "library", 3166 | "extra": { 3167 | "branch-alias": { 3168 | "dev-master": "3.6-dev" 3169 | } 3170 | }, 3171 | "autoload": { 3172 | "psr-4": { 3173 | "Dotenv\\": "src/" 3174 | } 3175 | }, 3176 | "notification-url": "https://packagist.org/downloads/", 3177 | "license": [ 3178 | "BSD-3-Clause" 3179 | ], 3180 | "authors": [ 3181 | { 3182 | "name": "Graham Campbell", 3183 | "email": "graham@alt-three.com", 3184 | "homepage": "https://gjcampbell.co.uk/" 3185 | }, 3186 | { 3187 | "name": "Vance Lucas", 3188 | "email": "vance@vancelucas.com", 3189 | "homepage": "https://vancelucas.com/" 3190 | } 3191 | ], 3192 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 3193 | "keywords": [ 3194 | "dotenv", 3195 | "env", 3196 | "environment" 3197 | ], 3198 | "funding": [ 3199 | { 3200 | "url": "https://github.com/GrahamCampbell", 3201 | "type": "github" 3202 | }, 3203 | { 3204 | "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", 3205 | "type": "tidelift" 3206 | } 3207 | ], 3208 | "time": "2020-07-14T19:04:52+00:00" 3209 | } 3210 | ], 3211 | "aliases": [], 3212 | "minimum-stability": "stable", 3213 | "stability-flags": [], 3214 | "prefer-stable": false, 3215 | "prefer-lowest": false, 3216 | "platform": [], 3217 | "platform-dev": [], 3218 | "plugin-api-version": "1.1.0" 3219 | } 3220 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | tests 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/BatchMessage.php: -------------------------------------------------------------------------------- 1 | _batchMessageBuilder)) { 31 | $this->_batchMessageBuilder = $this->createMessageBuilder(); 32 | } 33 | 34 | return $this->_batchMessageBuilder; 35 | } 36 | 37 | /** 38 | * Send any remaining recipients still in the buffer. 39 | */ 40 | public function finalize() { 41 | $this->$this->getMessageBuilder()->finalize(); 42 | } 43 | 44 | /** 45 | * Creates the Mailgun message builder. 46 | * @return BatchMessageBuilder message builder. 47 | * @throws Exception if mailer is not an instance of Mailer (i.e. independently created messages) 48 | */ 49 | protected function createMessageBuilder() 50 | { 51 | if (!($this->mailer instanceof Mailer)) { 52 | throw new Exception('BatchMessage must be created from the Mailgun Mailer'); 53 | } 54 | return $this->mailer->getMailgun()->messages()->getBatchMessage($this->mailer->domain, false); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/EmailAddress.php: -------------------------------------------------------------------------------- 1 | name]`. 13 | * Also supports providing variables using format: `[email => variables]`. 14 | * @return EmailAddress[] 15 | */ 16 | static function parse($input) { 17 | if (!is_array($input)) { 18 | return [new EmailAddress($input)]; 19 | } 20 | 21 | $emails = []; 22 | foreach ($input as $key => $value) { 23 | if (is_numeric($key)) { 24 | $email = $value; 25 | $variables = []; 26 | } else { 27 | $email = $key; 28 | $variables = is_array($value) ? $value : ['full_name' => $value]; 29 | } 30 | $emails[] = new EmailAddress($email, $variables); 31 | } 32 | 33 | return $emails; 34 | } 35 | 36 | /** 37 | * @var string email address. 38 | */ 39 | public $email; 40 | 41 | /** 42 | * @param array $variables { 43 | * @var string $id If used with BatchMessage 44 | * @var string $full_name 45 | * @var string $first 46 | * @var string $last 47 | * } 48 | */ 49 | public $variables; 50 | 51 | function __construct(string $email, array $variables = []) { 52 | $this->email = $email; 53 | $this->variables = $variables; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Mailer.php: -------------------------------------------------------------------------------- 1 | [ 16 | * ... 17 | * 'mailer' => [ 18 | * 'class' => 'boundstate\mailgun\Mailer', 19 | * 'key' => 'key-example', 20 | * 'domain' => 'mg.example.com', 21 | * ], 22 | * ... 23 | * ], 24 | * ~~~ 25 | * 26 | * To send an email, you may use the following code: 27 | * 28 | * ~~~ 29 | * Yii::$app->mailer->compose('contact/html', ['contactForm' => $form]) 30 | * ->setFrom('from@domain.com') 31 | * ->setTo($form->email) 32 | * ->setSubject($form->subject) 33 | * ->send(); 34 | * ~~~ 35 | */ 36 | class Mailer extends BaseMailer 37 | { 38 | /** 39 | * @var string message default class name. 40 | */ 41 | public $messageClass = 'boundstate\mailgun\Message'; 42 | 43 | /** 44 | * @var string Mailgun API credentials. 45 | */ 46 | public $key; 47 | 48 | /** 49 | * @var string Mailgun domain. 50 | */ 51 | public $domain; 52 | 53 | /** 54 | * @var string Mailgun endpoint. 55 | */ 56 | public $endpoint = null; 57 | 58 | /** 59 | * @var Mailgun Mailgun instance. 60 | */ 61 | private $_mailgun; 62 | 63 | /** 64 | * @return Mailgun Mailgun instance. 65 | */ 66 | public function getMailgun() 67 | { 68 | if (!is_object($this->_mailgun)) { 69 | $this->_mailgun = $this->createMailgun(); 70 | } 71 | 72 | return $this->_mailgun; 73 | } 74 | 75 | /** 76 | * @inheritdoc 77 | * @param Message $message the message to be sent 78 | */ 79 | protected function sendMessage($message) 80 | { 81 | Yii::info('Sending email', __METHOD__); 82 | 83 | if ($message instanceof BatchMessage) { 84 | $message->getMessageBuilder()->finalize(); 85 | } else { 86 | $this->getMailgun()->messages()->send( 87 | $this->domain, 88 | $message->getMessageBuilder()->getMessage() 89 | ); 90 | } 91 | 92 | return true; 93 | } 94 | 95 | /** 96 | * Creates Mailgun instance. 97 | * @return Mailgun Mailgun instance. 98 | * @throws InvalidConfigException if required params are not set. 99 | */ 100 | protected function createMailgun() 101 | { 102 | if (!$this->key) { 103 | throw new InvalidConfigException('Mailer::key must be set.'); 104 | } 105 | if (!$this->domain) { 106 | throw new InvalidConfigException('Mailer::domain must be set.'); 107 | } 108 | return $this->endpoint ? Mailgun::create($this->key, $this->endpoint) : Mailgun::create($this->key); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/Message.php: -------------------------------------------------------------------------------- 1 | _messageBuilder)) { 27 | $this->_messageBuilder = $this->createMessageBuilder(); 28 | } 29 | 30 | return $this->_messageBuilder; 31 | } 32 | 33 | /** 34 | * @inheritdoc 35 | */ 36 | public function getCharset() 37 | { 38 | return 'utf8'; 39 | } 40 | 41 | /** 42 | * @inheritdoc 43 | * @deprecated Mailgun only supports UTF8 44 | */ 45 | public function setCharset($charset) 46 | { 47 | throw new NotSupportedException(); 48 | } 49 | 50 | /** 51 | * @inheritdoc 52 | */ 53 | public function getFrom() 54 | { 55 | $message = $this->getMessageBuilder()->getMessage(); 56 | return !empty($message['from']) ? $message['from'] : null; 57 | } 58 | 59 | /** 60 | * @inheritdoc 61 | */ 62 | public function setFrom($from) 63 | { 64 | $addresses = EmailAddress::parse($from); 65 | 66 | foreach ($addresses as $address) { 67 | $this->getMessageBuilder()->setFromAddress($address->email, $address->variables); 68 | } 69 | 70 | return $this; 71 | } 72 | 73 | /** 74 | * @inheritdoc 75 | */ 76 | public function getReplyTo() 77 | { 78 | $message = $this->getMessageBuilder()->getMessage(); 79 | return !empty($message['h:reply-to']) ? $message['h:reply-to'] : null; 80 | } 81 | 82 | /** 83 | * @inheritdoc 84 | * @throws NotSupportedException if multiple addresses are provided (Mailgun only supports one) 85 | */ 86 | public function setReplyTo($replyTo) 87 | { 88 | $addresses = EmailAddress::parse($replyTo); 89 | 90 | if (count($addresses) !== 1) { 91 | throw new NotSupportedException('Mailgun only supports one reply-to address'); 92 | } 93 | 94 | $this->getMessageBuilder()->setReplyToAddress($addresses[0]->email, $addresses[0]->variables); 95 | 96 | return $this; 97 | } 98 | 99 | /** 100 | * @inheritdoc 101 | */ 102 | public function getTo() 103 | { 104 | $message = $this->getMessageBuilder()->getMessage(); 105 | return !empty($message['to']) ? $message['to'] : null; 106 | } 107 | 108 | /** 109 | * @inheritdoc 110 | */ 111 | public function setTo($to) 112 | { 113 | $addresses = EmailAddress::parse($to); 114 | 115 | foreach ($addresses as $address) { 116 | $this->getMessageBuilder()->addToRecipient($address->email, $address->variables); 117 | } 118 | 119 | return $this; 120 | } 121 | 122 | /** 123 | * @inheritdoc 124 | */ 125 | public function getCc() 126 | { 127 | $message = $this->getMessageBuilder()->getMessage(); 128 | return !empty($message['cc']) ? $message['cc'] : null; 129 | } 130 | 131 | /** 132 | * @inheritdoc 133 | */ 134 | public function setCc($cc) 135 | { 136 | $addresses = EmailAddress::parse($cc); 137 | 138 | foreach ($addresses as $address) { 139 | $this->getMessageBuilder()->addCcRecipient($address->email, $address->variables); 140 | } 141 | 142 | return $this; 143 | } 144 | 145 | /** 146 | * @inheritdoc 147 | */ 148 | public function getBcc() 149 | { 150 | $message = $this->getMessageBuilder()->getMessage(); 151 | return !empty($message['bcc']) ? $message['bcc'] : null; 152 | } 153 | 154 | /** 155 | * @inheritdoc 156 | */ 157 | public function setBcc($bcc) 158 | { 159 | $addresses = EmailAddress::parse($bcc); 160 | 161 | foreach ($addresses as $address) { 162 | $this->getMessageBuilder()->addBccRecipient($address->email, $address->variables); 163 | } 164 | 165 | return $this; 166 | } 167 | 168 | /** 169 | * @inheritdoc 170 | */ 171 | public function getSubject() 172 | { 173 | $message = $this->getMessageBuilder()->getMessage(); 174 | return !empty($message['subject']) ? $message['subject'] : null; 175 | } 176 | 177 | /** 178 | * @inheritdoc 179 | */ 180 | public function setSubject($subject) 181 | { 182 | $this->getMessageBuilder()->setSubject($subject); 183 | 184 | return $this; 185 | } 186 | 187 | /** 188 | * @inheritdoc 189 | */ 190 | public function setTextBody($text) 191 | { 192 | $this->getMessageBuilder()->setTextBody($text); 193 | 194 | return $this; 195 | } 196 | 197 | /** 198 | * @inheritdoc 199 | */ 200 | public function setHtmlBody($html) 201 | { 202 | $this->getMessageBuilder()->setHtmlBody($html); 203 | 204 | return $this; 205 | } 206 | 207 | /** 208 | * @inheritdoc 209 | */ 210 | public function attach($fileName, array $options = []) 211 | { 212 | $attachmentName = !empty($options['fileName']) ? $options['fileName'] : null; 213 | $this->getMessageBuilder()->addAttachment("@{$fileName}", $attachmentName); 214 | 215 | return $this; 216 | } 217 | 218 | /** 219 | * @inheritdoc 220 | */ 221 | public function attachContent($content, array $options = []) 222 | { 223 | $attachmentName = !empty($options['fileName']) ? $options['fileName'] : null; 224 | $message = $this->getMessageBuilder()->getMessage(); 225 | 226 | if (!isset($message['attachment'])) { 227 | $message['attachment'] = []; 228 | } 229 | 230 | $message['attachment'][] = [ 231 | 'fileContent' => $content, 232 | 'filename' => $attachmentName, 233 | ]; 234 | $this->getMessageBuilder()->setMessage($message); 235 | 236 | return $this; 237 | } 238 | 239 | /** 240 | * @inheritdoc 241 | */ 242 | public function embed($fileName, array $options = []) 243 | { 244 | $attachmentName = !empty($options['fileName']) ? $options['fileName'] : basename($fileName); 245 | $this->getMessageBuilder()->addInlineImage("@{$fileName}", $attachmentName); 246 | return 'cid:'.$attachmentName; 247 | } 248 | 249 | /** 250 | * @inheritdoc 251 | * @deprecated Embedding content is not supported by Mailgun. 252 | */ 253 | public function embedContent($content, array $options = []) 254 | { 255 | throw new NotSupportedException('Embedding content is not supported'); 256 | } 257 | 258 | /** 259 | * @inheritdoc 260 | */ 261 | public function toString() 262 | { 263 | return VarDumper::dumpAsString($this->getMessageBuilder()->getMessage()); 264 | } 265 | 266 | /** 267 | * Sets whether to send the message in test mode. 268 | * @param bool $enabled Mailgun will accept the message but will not send it. This is useful for testing purposes. 269 | * @return Message self reference. 270 | */ 271 | public function setTestMode(bool $enabled): self { 272 | $this->getMessageBuilder()->setTestMode($enabled); 273 | 274 | return $this; 275 | } 276 | 277 | /** 278 | * Creates the Mailgun message builder. 279 | * @return MessageBuilder message builder. 280 | */ 281 | protected function createMessageBuilder() 282 | { 283 | return new MessageBuilder; 284 | } 285 | } 286 | -------------------------------------------------------------------------------- /tests/BatchMessageTest.php: -------------------------------------------------------------------------------- 1 | mockApplication([ 13 | 'components' => [ 14 | 'mailer' => [ 15 | 'class' => 'boundstate\mailgun\Mailer', 16 | 'messageClass' => 'boundstate\mailgun\BatchMessage', 17 | 'key' => getenv('MAILGUN_KEY'), 18 | 'domain' => getenv('MAILGUN_DOMAIN'), 19 | ], 20 | ] 21 | ]); 22 | } 23 | 24 | public function testCompose(): void 25 | { 26 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']); 27 | $html = $message->getMessageBuilder()->getMessage()['html']; 28 | 29 | $this->assertEquals('

Hi John!

', $html); 30 | } 31 | 32 | public function testSingleTo(): void 33 | { 34 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 35 | ->setTo('a@example.com'); 36 | $this->assertEquals(['a@example.com'], $message->getTo()); 37 | } 38 | 39 | public function testMultiTo(): void 40 | { 41 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 42 | ->setTo(['a@example.com', 'b@example.com']); 43 | $this->assertEquals(['a@example.com', 'b@example.com'], $message->getTo()); 44 | } 45 | 46 | public function testMultiToWithNames(): void 47 | { 48 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 49 | ->setTo([ 50 | 'a@example.com' => 'Anne', 51 | 'b@example.com' => 'Billy' 52 | ]); 53 | $this->assertEquals(['"Anne" ', '"Billy" '], $message->getTo()); 54 | } 55 | 56 | public function testMultiToWithVariables(): void 57 | { 58 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 59 | ->setTo([ 60 | 'a@example.com' => ['full_name' => 'Anne', 'id' => 3], 61 | 'b@example.com' => ['full_name' => 'Billy', 'id' => 4] 62 | ]); 63 | $this->assertEquals(['"Anne" ', '"Billy" '], $message->getTo()); 64 | } 65 | 66 | public function testSend(): void 67 | { 68 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 69 | ->setTo(getenv('TEST_RECIPIENT')) 70 | ->setFrom('test@example.com') 71 | ->setSubject('Test') 72 | ->setTestMode(true); 73 | 74 | $this->assertTrue($message->send()); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /tests/EmailAddressTest.php: -------------------------------------------------------------------------------- 1 | assertCount(1, $addresses); 12 | $this->assertInstanceOf(EmailAddress::class, $addresses[0]); 13 | $this->assertEquals('jon@example.com', $addresses[0]->email); 14 | $this->assertEquals([], $addresses[0]->variables); 15 | } 16 | 17 | public function testParseSimpleArray(): void 18 | { 19 | $addresses = EmailAddress::parse(['jake@example.com', 'sally@example.com']); 20 | $this->assertCount(2, $addresses); 21 | $this->assertInstanceOf(EmailAddress::class, $addresses[0]); 22 | $this->assertEquals('jake@example.com', $addresses[0]->email); 23 | $this->assertEquals([], $addresses[0]->variables); 24 | $this->assertEquals('sally@example.com', $addresses[1]->email); 25 | $this->assertEquals([], $addresses[1]->variables); 26 | } 27 | 28 | public function testParseArrayWithNames(): void 29 | { 30 | $addresses = EmailAddress::parse([ 31 | 'jake@example.com' => 'Jake', 32 | 'sally@example.com' => 'Sally' 33 | ]); 34 | $this->assertCount(2, $addresses); 35 | $this->assertInstanceOf(EmailAddress::class, $addresses[0]); 36 | $this->assertEquals('jake@example.com', $addresses[0]->email); 37 | $this->assertEquals(['full_name' => 'Jake'], $addresses[0]->variables); 38 | $this->assertEquals('sally@example.com', $addresses[1]->email); 39 | $this->assertEquals(['full_name' => 'Sally'], $addresses[1]->variables); 40 | } 41 | 42 | public function testParseArrayWithVariables(): void 43 | { 44 | $addresses = EmailAddress::parse([ 45 | 'jake@example.com' => ['full_name' => 'Jake', 'id' => 5], 46 | 'sally@example.com' => ['full_name' => 'Sally', 'id' => 6] 47 | ]); 48 | $this->assertCount(2, $addresses); 49 | $this->assertInstanceOf(EmailAddress::class, $addresses[0]); 50 | $this->assertEquals('jake@example.com', $addresses[0]->email); 51 | $this->assertEquals(['full_name' => 'Jake', 'id' => 5], $addresses[0]->variables); 52 | $this->assertEquals('sally@example.com', $addresses[1]->email); 53 | $this->assertEquals(['full_name' => 'Sally', 'id' => 6], $addresses[1]->variables); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /tests/MailerTest.php: -------------------------------------------------------------------------------- 1 | mockApplication([ 13 | 'components' => [ 14 | 'mailer' => [ 15 | 'class' => 'boundstate\mailgun\Mailer', 16 | 'key' => 'key-example', 17 | 'domain' => 'mg.example.com', 18 | ], 19 | ] 20 | ]); 21 | } 22 | 23 | public function testGetMailgun(): void 24 | { 25 | $mailgun = Yii::$app->mailer->getMailgun(); 26 | $this->assertInstanceOf(\Mailgun\Mailgun::class, $mailgun); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tests/MessageTest.php: -------------------------------------------------------------------------------- 1 | mockApplication([ 13 | 'components' => [ 14 | 'mailer' => [ 15 | 'class' => 'boundstate\mailgun\Mailer', 16 | 'key' => getenv('MAILGUN_KEY'), 17 | 'domain' => getenv('MAILGUN_DOMAIN'), 18 | ], 19 | ] 20 | ]); 21 | } 22 | 23 | public function testCompose(): void 24 | { 25 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']); 26 | $html = $message->getMessageBuilder()->getMessage()['html']; 27 | 28 | $this->assertEquals('

Hi John!

', $html); 29 | } 30 | 31 | public function testSingleTo(): void 32 | { 33 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 34 | ->setTo('a@example.com'); 35 | $this->assertEquals(['a@example.com'], $message->getTo()); 36 | } 37 | 38 | public function testMultiTo(): void 39 | { 40 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 41 | ->setTo(['a@example.com', 'b@example.com']); 42 | $this->assertEquals(['a@example.com', 'b@example.com'], $message->getTo()); 43 | } 44 | 45 | public function testMultiToWithNames(): void 46 | { 47 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 48 | ->setTo([ 49 | 'a@example.com' => 'Anne', 50 | 'b@example.com' => 'Billy' 51 | ]); 52 | $this->assertEquals(['"Anne" ', '"Billy" '], $message->getTo()); 53 | } 54 | 55 | public function testSend(): void 56 | { 57 | $message = Yii::$app->mailer->compose('example', ['name' => 'John']) 58 | ->setTo(getenv('TEST_RECIPIENT')) 59 | ->setFrom('test@example.com') 60 | ->setSubject('Test') 61 | ->setTestMode(true); 62 | 63 | $this->assertTrue($message->send()); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | destroyApplication(); 16 | } 17 | 18 | /** 19 | * Populates Yii::$app with a new application 20 | * The application will be destroyed on tearDown() automatically. 21 | * @param array $config The application configuration, if needed 22 | * @param string $appClass name of the application class to create 23 | */ 24 | protected function mockApplication($config = [], $appClass = '\yii\console\Application') 25 | { 26 | new $appClass(ArrayHelper::merge([ 27 | 'id' => 'testapp', 28 | 'basePath' => __DIR__, 29 | 'vendorPath' => $this->getVendorPath(), 30 | ], $config)); 31 | } 32 | 33 | protected function getVendorPath() 34 | { 35 | $vendor = dirname(dirname(__DIR__)) . '/vendor'; 36 | if (!is_dir($vendor)) { 37 | $vendor = dirname(dirname(dirname(dirname(__DIR__)))); 38 | } 39 | return $vendor; 40 | } 41 | 42 | /** 43 | * Destroys application in Yii::$app by setting it to null. 44 | */ 45 | protected function destroyApplication() 46 | { 47 | \Yii::$app = null; 48 | } 49 | } -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | load(); 20 | $dotenv->required(['MAILGUN_DOMAIN', 'MAILGUN_KEY', 'TEST_RECIPIENT']); 21 | } -------------------------------------------------------------------------------- /tests/mail/example.php: -------------------------------------------------------------------------------- 1 |

Hi !

-------------------------------------------------------------------------------- /tests/mail/layouts/html.php: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------