├── .gitignore ├── LICENSE ├── README.md ├── composer.json ├── composer.lock └── src ├── SocketAck.php ├── SocketEnvelope.php └── SocketServer.php /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /.idea/ 3 | /.php-cs-fixer.cache 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jeremy Lindblom 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Slack PHP – Socket Mode 2 | 3 | This package provides a slack-php `AppServer` implementation that allows an application written for the 4 | [Slack App Framework for PHP][1] to be run in [Socket Mode][2]. Socket Mode uses the websocket protocol to communicate 5 | with Slack, and allows you to run an app (even locally) without having to expose it via a public HTTP endpoint. This can 6 | be very useful for testing Slack apps in a way that does not violate most work-related firewall restrictions. 7 | 8 | **This package should be used for testing only, and is not designed for production use.** 9 | 10 | > This Socket Mode implementation uses the [`amphp/websocket-client`][3] package from [Amp][4], an awesome collection of 11 | PHP packages that make async and event loop style programming in PHP possible. Check it out sometime. 12 | 13 | ## Installation 14 | 15 | - Requires PHP 7.4+ 16 | - Use Composer to install: `composer require slack-php/slack-socket-mode` 17 | 18 | ## Usage 19 | 20 | When using Socket Mode, there is no web server serving your app. When you run an app configured for Socket Mode, it 21 | establishes a connection to Slack as a websocket client. It maintains that connection to listen for Slack events until 22 | it is explicitly terminated (e.g., via `CTRL+C`), Socket Mode is disabled in your app configuration, or an unrecoverable 23 | error occurs. This is a different way of running PHP than many aren't used to, so please pay close attention. 24 | 25 | When running an app in Slack Mode, you need an "App Token" instead of the typical "Signing Secret". The App Token is 26 | specially purposed for making the web socket connection. You can read more about [Socket Mode][2] in the Slack 27 | documentation to learn how to get an App Token. 28 | 29 | ### Example 30 | 31 | This small app responds to the `/cool` slash command. 32 | 33 | > Assumptions: 34 | > 35 | > - You have required the Composer autoloader to enable autoloading of the framework files. 36 | > - You have set `SLACK_APP_TOKEN` in the environment (e.g., `putenv("SLACK_APP_TOKEN=foo");`) 37 | 38 | ```php 39 | command('cool', function (Context $ctx) { 47 | $ctx->ack(':thumbsup: That is so cool!'); 48 | }) 49 | ->withLogger(new StderrLogger(LogLevel::DEBUG)) 50 | ->run(new SocketServer()); 51 | ``` 52 | 53 | ### Switching Servers 54 | 55 | The relationship between app and server can also be flipped, which might be helpful if you bootstrap script toggles 56 | between the Socket and HTTP server. 57 | 58 | ```php 59 | command('cool', function (Context $ctx) { 68 | $ctx->ack(':thumbsup: That is so cool!'); 69 | }); 70 | 71 | if (getenv('SOCKET_MODE')) { 72 | $server = SocketServer::new()->withLogger(new StderrLogger(LogLevel::DEBUG)); 73 | } else { 74 | $server = HttpServer::new()->withLogger(new StderrLogger(LogLevel::NOTICE)); 75 | } 76 | 77 | $server->withApp($app)->start(); 78 | ``` 79 | 80 | [1]: https://github.com/slack-php/slack-php-app-framework 81 | [2]: https://api.slack.com/apis/connections/socket 82 | [3]: https://amphp.org/websocket-client/ 83 | [4]: https://amphp.org/ 84 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slack-php/slack-socket-mode", 3 | "type": "library", 4 | "license": "MIT", 5 | "description": "Provides a a slack-php Socket Mode implementation", 6 | "authors": [ 7 | { 8 | "name": "Jeremy Lindblom", 9 | "email": "jeremeamia@gmail.com" 10 | } 11 | ], 12 | "config": { 13 | "sort-packages": true, 14 | "platform": { 15 | "php": "7.4" 16 | } 17 | }, 18 | "require": { 19 | "amphp/websocket-client": "^1.0", 20 | "slack-php/slack-app-framework": ">=0.5.0" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "SlackPhp\\SocketMode\\": "src/" 25 | } 26 | }, 27 | "require-dev": { 28 | "friendsofphp/php-cs-fixer": "^3.0", 29 | "phpstan/phpstan": "^0.12.90" 30 | }, 31 | "scripts": { 32 | "style": "php-cs-fixer fix --dry-run --verbose --show-progress=none src", 33 | "style-fix": "php-cs-fixer fix src", 34 | "stan": "phpstan analyse --level=5 src", 35 | "qa": ["@style", "@stan"] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /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": "e71a903f9e5fff9a6ecd8836b6c89a97", 8 | "packages": [ 9 | { 10 | "name": "amphp/amp", 11 | "version": "v2.5.2", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/amphp/amp.git", 15 | "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/amphp/amp/zipball/efca2b32a7580087adb8aabbff6be1dc1bb924a9", 20 | "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=7" 25 | }, 26 | "require-dev": { 27 | "amphp/php-cs-fixer-config": "dev-master", 28 | "amphp/phpunit-util": "^1", 29 | "ext-json": "*", 30 | "jetbrains/phpstorm-stubs": "^2019.3", 31 | "phpunit/phpunit": "^6.0.9 | ^7", 32 | "psalm/phar": "^3.11@dev", 33 | "react/promise": "^2" 34 | }, 35 | "type": "library", 36 | "extra": { 37 | "branch-alias": { 38 | "dev-master": "2.x-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Amp\\": "lib" 44 | }, 45 | "files": [ 46 | "lib/functions.php", 47 | "lib/Internal/functions.php" 48 | ] 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Daniel Lowrey", 57 | "email": "rdlowrey@php.net" 58 | }, 59 | { 60 | "name": "Aaron Piotrowski", 61 | "email": "aaron@trowski.com" 62 | }, 63 | { 64 | "name": "Bob Weinand", 65 | "email": "bobwei9@hotmail.com" 66 | }, 67 | { 68 | "name": "Niklas Keller", 69 | "email": "me@kelunik.com" 70 | } 71 | ], 72 | "description": "A non-blocking concurrency framework for PHP applications.", 73 | "homepage": "http://amphp.org/amp", 74 | "keywords": [ 75 | "async", 76 | "asynchronous", 77 | "awaitable", 78 | "concurrency", 79 | "event", 80 | "event-loop", 81 | "future", 82 | "non-blocking", 83 | "promise" 84 | ], 85 | "support": { 86 | "irc": "irc://irc.freenode.org/amphp", 87 | "issues": "https://github.com/amphp/amp/issues", 88 | "source": "https://github.com/amphp/amp/tree/v2.5.2" 89 | }, 90 | "funding": [ 91 | { 92 | "url": "https://github.com/amphp", 93 | "type": "github" 94 | } 95 | ], 96 | "time": "2021-01-10T17:06:37+00:00" 97 | }, 98 | { 99 | "name": "amphp/byte-stream", 100 | "version": "v1.8.1", 101 | "source": { 102 | "type": "git", 103 | "url": "https://github.com/amphp/byte-stream.git", 104 | "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" 105 | }, 106 | "dist": { 107 | "type": "zip", 108 | "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", 109 | "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", 110 | "shasum": "" 111 | }, 112 | "require": { 113 | "amphp/amp": "^2", 114 | "php": ">=7.1" 115 | }, 116 | "require-dev": { 117 | "amphp/php-cs-fixer-config": "dev-master", 118 | "amphp/phpunit-util": "^1.4", 119 | "friendsofphp/php-cs-fixer": "^2.3", 120 | "jetbrains/phpstorm-stubs": "^2019.3", 121 | "phpunit/phpunit": "^6 || ^7 || ^8", 122 | "psalm/phar": "^3.11.4" 123 | }, 124 | "type": "library", 125 | "extra": { 126 | "branch-alias": { 127 | "dev-master": "1.x-dev" 128 | } 129 | }, 130 | "autoload": { 131 | "psr-4": { 132 | "Amp\\ByteStream\\": "lib" 133 | }, 134 | "files": [ 135 | "lib/functions.php" 136 | ] 137 | }, 138 | "notification-url": "https://packagist.org/downloads/", 139 | "license": [ 140 | "MIT" 141 | ], 142 | "authors": [ 143 | { 144 | "name": "Aaron Piotrowski", 145 | "email": "aaron@trowski.com" 146 | }, 147 | { 148 | "name": "Niklas Keller", 149 | "email": "me@kelunik.com" 150 | } 151 | ], 152 | "description": "A stream abstraction to make working with non-blocking I/O simple.", 153 | "homepage": "http://amphp.org/byte-stream", 154 | "keywords": [ 155 | "amp", 156 | "amphp", 157 | "async", 158 | "io", 159 | "non-blocking", 160 | "stream" 161 | ], 162 | "support": { 163 | "irc": "irc://irc.freenode.org/amphp", 164 | "issues": "https://github.com/amphp/byte-stream/issues", 165 | "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" 166 | }, 167 | "funding": [ 168 | { 169 | "url": "https://github.com/amphp", 170 | "type": "github" 171 | } 172 | ], 173 | "time": "2021-03-30T17:13:30+00:00" 174 | }, 175 | { 176 | "name": "amphp/cache", 177 | "version": "v1.5.0", 178 | "source": { 179 | "type": "git", 180 | "url": "https://github.com/amphp/cache.git", 181 | "reference": "2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28" 182 | }, 183 | "dist": { 184 | "type": "zip", 185 | "url": "https://api.github.com/repos/amphp/cache/zipball/2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28", 186 | "reference": "2b6b5dbb70e54cc914df9952ba7c012bc4cbcd28", 187 | "shasum": "" 188 | }, 189 | "require": { 190 | "amphp/amp": "^2", 191 | "amphp/serialization": "^1", 192 | "amphp/sync": "^1.2", 193 | "php": ">=7.1" 194 | }, 195 | "conflict": { 196 | "amphp/file": "<0.2 || >=3" 197 | }, 198 | "require-dev": { 199 | "amphp/file": "^1 || ^2", 200 | "amphp/php-cs-fixer-config": "dev-master", 201 | "amphp/phpunit-util": "^1.1", 202 | "phpunit/phpunit": "^6 | ^7 | ^8 | ^9", 203 | "vimeo/psalm": "^4" 204 | }, 205 | "type": "library", 206 | "autoload": { 207 | "psr-4": { 208 | "Amp\\Cache\\": "lib" 209 | } 210 | }, 211 | "notification-url": "https://packagist.org/downloads/", 212 | "license": [ 213 | "MIT" 214 | ], 215 | "authors": [ 216 | { 217 | "name": "Niklas Keller", 218 | "email": "me@kelunik.com" 219 | }, 220 | { 221 | "name": "Daniel Lowrey", 222 | "email": "rdlowrey@php.net" 223 | } 224 | ], 225 | "description": "A promise-aware caching API for Amp.", 226 | "homepage": "https://github.com/amphp/cache", 227 | "support": { 228 | "irc": "irc://irc.freenode.org/amphp", 229 | "issues": "https://github.com/amphp/cache/issues", 230 | "source": "https://github.com/amphp/cache/tree/v1.5.0" 231 | }, 232 | "funding": [ 233 | { 234 | "url": "https://github.com/amphp", 235 | "type": "github" 236 | } 237 | ], 238 | "time": "2021-06-29T17:12:43+00:00" 239 | }, 240 | { 241 | "name": "amphp/dns", 242 | "version": "v1.2.3", 243 | "source": { 244 | "type": "git", 245 | "url": "https://github.com/amphp/dns.git", 246 | "reference": "852292532294d7972c729a96b49756d781f7c59d" 247 | }, 248 | "dist": { 249 | "type": "zip", 250 | "url": "https://api.github.com/repos/amphp/dns/zipball/852292532294d7972c729a96b49756d781f7c59d", 251 | "reference": "852292532294d7972c729a96b49756d781f7c59d", 252 | "shasum": "" 253 | }, 254 | "require": { 255 | "amphp/amp": "^2", 256 | "amphp/byte-stream": "^1.1", 257 | "amphp/cache": "^1.2", 258 | "amphp/parser": "^1", 259 | "amphp/windows-registry": "^0.3", 260 | "daverandom/libdns": "^2.0.1", 261 | "ext-filter": "*", 262 | "ext-json": "*", 263 | "php": ">=7.0" 264 | }, 265 | "require-dev": { 266 | "amphp/php-cs-fixer-config": "dev-master", 267 | "amphp/phpunit-util": "^1", 268 | "phpunit/phpunit": "^6 || ^7 || ^8 || ^9" 269 | }, 270 | "type": "library", 271 | "autoload": { 272 | "psr-4": { 273 | "Amp\\Dns\\": "lib" 274 | }, 275 | "files": [ 276 | "lib/functions.php" 277 | ] 278 | }, 279 | "notification-url": "https://packagist.org/downloads/", 280 | "license": [ 281 | "MIT" 282 | ], 283 | "authors": [ 284 | { 285 | "name": "Chris Wright", 286 | "email": "addr@daverandom.com" 287 | }, 288 | { 289 | "name": "Daniel Lowrey", 290 | "email": "rdlowrey@php.net" 291 | }, 292 | { 293 | "name": "Bob Weinand", 294 | "email": "bobwei9@hotmail.com" 295 | }, 296 | { 297 | "name": "Niklas Keller", 298 | "email": "me@kelunik.com" 299 | }, 300 | { 301 | "name": "Aaron Piotrowski", 302 | "email": "aaron@trowski.com" 303 | } 304 | ], 305 | "description": "Async DNS resolution for Amp.", 306 | "homepage": "https://github.com/amphp/dns", 307 | "keywords": [ 308 | "amp", 309 | "amphp", 310 | "async", 311 | "client", 312 | "dns", 313 | "resolve" 314 | ], 315 | "support": { 316 | "issues": "https://github.com/amphp/dns/issues", 317 | "source": "https://github.com/amphp/dns/tree/v1.2.3" 318 | }, 319 | "funding": [ 320 | { 321 | "url": "https://github.com/amphp", 322 | "type": "github" 323 | } 324 | ], 325 | "time": "2020-07-21T19:04:57+00:00" 326 | }, 327 | { 328 | "name": "amphp/hpack", 329 | "version": "v3.1.1", 330 | "source": { 331 | "type": "git", 332 | "url": "https://github.com/amphp/hpack.git", 333 | "reference": "cf4f1663e9fd58f60258c06177098655ca6377a5" 334 | }, 335 | "dist": { 336 | "type": "zip", 337 | "url": "https://api.github.com/repos/amphp/hpack/zipball/cf4f1663e9fd58f60258c06177098655ca6377a5", 338 | "reference": "cf4f1663e9fd58f60258c06177098655ca6377a5", 339 | "shasum": "" 340 | }, 341 | "require": { 342 | "php": ">=7.1" 343 | }, 344 | "require-dev": { 345 | "amphp/php-cs-fixer-config": "dev-master", 346 | "http2jp/hpack-test-case": "^1", 347 | "phpunit/phpunit": "^6 | ^7" 348 | }, 349 | "type": "library", 350 | "extra": { 351 | "branch-alias": { 352 | "dev-master": "3.x-dev" 353 | } 354 | }, 355 | "autoload": { 356 | "psr-4": { 357 | "Amp\\Http\\": "src" 358 | } 359 | }, 360 | "notification-url": "https://packagist.org/downloads/", 361 | "license": [ 362 | "MIT" 363 | ], 364 | "authors": [ 365 | { 366 | "name": "Daniel Lowrey", 367 | "email": "rdlowrey@php.net" 368 | }, 369 | { 370 | "name": "Bob Weinand" 371 | }, 372 | { 373 | "name": "Niklas Keller", 374 | "email": "me@kelunik.com" 375 | }, 376 | { 377 | "name": "Aaron Piotrowski", 378 | "email": "aaron@trowski.com" 379 | } 380 | ], 381 | "description": "HTTP/2 HPack implementation.", 382 | "homepage": "https://github.com/amphp/hpack", 383 | "keywords": [ 384 | "headers", 385 | "hpack", 386 | "http-2" 387 | ], 388 | "support": { 389 | "issues": "https://github.com/amphp/hpack/issues", 390 | "source": "https://github.com/amphp/hpack/tree/v3.1.1" 391 | }, 392 | "funding": [ 393 | { 394 | "url": "https://github.com/amphp", 395 | "type": "github" 396 | } 397 | ], 398 | "time": "2021-06-11T20:03:34+00:00" 399 | }, 400 | { 401 | "name": "amphp/http", 402 | "version": "v1.6.3", 403 | "source": { 404 | "type": "git", 405 | "url": "https://github.com/amphp/http.git", 406 | "reference": "e2b75561011a9596e4574cc867e07a706d56394b" 407 | }, 408 | "dist": { 409 | "type": "zip", 410 | "url": "https://api.github.com/repos/amphp/http/zipball/e2b75561011a9596e4574cc867e07a706d56394b", 411 | "reference": "e2b75561011a9596e4574cc867e07a706d56394b", 412 | "shasum": "" 413 | }, 414 | "require": { 415 | "amphp/hpack": "^3", 416 | "php": ">=7.1" 417 | }, 418 | "require-dev": { 419 | "amphp/php-cs-fixer-config": "dev-master", 420 | "phpunit/phpunit": "^7 || ^6.5" 421 | }, 422 | "type": "library", 423 | "extra": { 424 | "branch-alias": { 425 | "dev-master": "1.x-dev" 426 | } 427 | }, 428 | "autoload": { 429 | "psr-4": { 430 | "Amp\\Http\\": "src" 431 | }, 432 | "files": [ 433 | "src/functions.php" 434 | ] 435 | }, 436 | "notification-url": "https://packagist.org/downloads/", 437 | "license": [ 438 | "MIT" 439 | ], 440 | "authors": [ 441 | { 442 | "name": "Niklas Keller", 443 | "email": "me@kelunik.com" 444 | } 445 | ], 446 | "description": "Basic HTTP primitives which can be shared by servers and clients.", 447 | "support": { 448 | "issues": "https://github.com/amphp/http/issues", 449 | "source": "https://github.com/amphp/http/tree/v1.6.3" 450 | }, 451 | "funding": [ 452 | { 453 | "url": "https://github.com/amphp", 454 | "type": "github" 455 | } 456 | ], 457 | "time": "2020-11-28T17:04:34+00:00" 458 | }, 459 | { 460 | "name": "amphp/http-client", 461 | "version": "v4.6.0", 462 | "source": { 463 | "type": "git", 464 | "url": "https://github.com/amphp/http-client.git", 465 | "reference": "039059413110990c5a65ddeab4a58e0d3fa5f051" 466 | }, 467 | "dist": { 468 | "type": "zip", 469 | "url": "https://api.github.com/repos/amphp/http-client/zipball/039059413110990c5a65ddeab4a58e0d3fa5f051", 470 | "reference": "039059413110990c5a65ddeab4a58e0d3fa5f051", 471 | "shasum": "" 472 | }, 473 | "require": { 474 | "amphp/amp": "^2.4", 475 | "amphp/byte-stream": "^1.6", 476 | "amphp/hpack": "^3", 477 | "amphp/http": "^1.6", 478 | "amphp/socket": "^1", 479 | "amphp/sync": "^1.3", 480 | "league/uri": "^6", 481 | "php": ">=7.2", 482 | "psr/http-message": "^1" 483 | }, 484 | "conflict": { 485 | "amphp/file": "<0.2 || >=3" 486 | }, 487 | "require-dev": { 488 | "amphp/file": "^0.2 || ^0.3 || ^1 || ^2", 489 | "amphp/http-server": "^2", 490 | "amphp/php-cs-fixer-config": "dev-master", 491 | "amphp/phpunit-util": "^1.1", 492 | "amphp/react-adapter": "^2.1", 493 | "clue/socks-react": "^1.0", 494 | "ext-json": "*", 495 | "kelunik/link-header-rfc5988": "^1.0", 496 | "laminas/laminas-diactoros": "^2.3", 497 | "phpunit/phpunit": "^7 || ^8 || ^9", 498 | "vimeo/psalm": "^4" 499 | }, 500 | "suggest": { 501 | "amphp/file": "Required for file request bodies and HTTP archive logging", 502 | "ext-json": "Required for logging HTTP archives", 503 | "ext-zlib": "Allows using compression for response bodies." 504 | }, 505 | "type": "library", 506 | "extra": { 507 | "branch-alias": { 508 | "dev-master": "4.x-dev" 509 | } 510 | }, 511 | "autoload": { 512 | "psr-4": { 513 | "Amp\\Http\\Client\\": "src" 514 | }, 515 | "files": [ 516 | "src/Internal/functions.php" 517 | ] 518 | }, 519 | "notification-url": "https://packagist.org/downloads/", 520 | "license": [ 521 | "MIT" 522 | ], 523 | "authors": [ 524 | { 525 | "name": "Daniel Lowrey", 526 | "email": "rdlowrey@gmail.com" 527 | }, 528 | { 529 | "name": "Niklas Keller", 530 | "email": "me@kelunik.com" 531 | }, 532 | { 533 | "name": "Aaron Piotrowski", 534 | "email": "aaron@trowski.com" 535 | } 536 | ], 537 | "description": "Asynchronous concurrent HTTP/2 and HTTP/1.1 client built on the Amp concurrency framework", 538 | "homepage": "https://github.com/amphp/http-client", 539 | "keywords": [ 540 | "async", 541 | "client", 542 | "concurrent", 543 | "http", 544 | "non-blocking", 545 | "rest" 546 | ], 547 | "support": { 548 | "issues": "https://github.com/amphp/http-client/issues", 549 | "source": "https://github.com/amphp/http-client/tree/v4.6.0" 550 | }, 551 | "funding": [ 552 | { 553 | "url": "https://github.com/amphp", 554 | "type": "github" 555 | } 556 | ], 557 | "time": "2021-06-29T18:43:18+00:00" 558 | }, 559 | { 560 | "name": "amphp/parser", 561 | "version": "v1.0.0", 562 | "source": { 563 | "type": "git", 564 | "url": "https://github.com/amphp/parser.git", 565 | "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1" 566 | }, 567 | "dist": { 568 | "type": "zip", 569 | "url": "https://api.github.com/repos/amphp/parser/zipball/f83e68f03d5b8e8e0365b8792985a7f341c57ae1", 570 | "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1", 571 | "shasum": "" 572 | }, 573 | "require": { 574 | "php": ">=7" 575 | }, 576 | "require-dev": { 577 | "friendsofphp/php-cs-fixer": "^2.3", 578 | "phpunit/phpunit": "^6" 579 | }, 580 | "type": "library", 581 | "autoload": { 582 | "psr-4": { 583 | "Amp\\Parser\\": "lib" 584 | } 585 | }, 586 | "notification-url": "https://packagist.org/downloads/", 587 | "license": [ 588 | "MIT" 589 | ], 590 | "authors": [ 591 | { 592 | "name": "Niklas Keller", 593 | "email": "me@kelunik.com" 594 | }, 595 | { 596 | "name": "Aaron Piotrowski", 597 | "email": "aaron@trowski.com" 598 | } 599 | ], 600 | "description": "A generator parser to make streaming parsers simple.", 601 | "homepage": "https://github.com/amphp/parser", 602 | "keywords": [ 603 | "async", 604 | "non-blocking", 605 | "parser", 606 | "stream" 607 | ], 608 | "support": { 609 | "issues": "https://github.com/amphp/parser/issues", 610 | "source": "https://github.com/amphp/parser/tree/is-valid" 611 | }, 612 | "time": "2017-06-06T05:29:10+00:00" 613 | }, 614 | { 615 | "name": "amphp/process", 616 | "version": "v1.1.1", 617 | "source": { 618 | "type": "git", 619 | "url": "https://github.com/amphp/process.git", 620 | "reference": "b88c6aef75c0b22f6f021141dd2d5e7c5db4c124" 621 | }, 622 | "dist": { 623 | "type": "zip", 624 | "url": "https://api.github.com/repos/amphp/process/zipball/b88c6aef75c0b22f6f021141dd2d5e7c5db4c124", 625 | "reference": "b88c6aef75c0b22f6f021141dd2d5e7c5db4c124", 626 | "shasum": "" 627 | }, 628 | "require": { 629 | "amphp/amp": "^2", 630 | "amphp/byte-stream": "^1.4", 631 | "php": ">=7" 632 | }, 633 | "require-dev": { 634 | "amphp/php-cs-fixer-config": "dev-master", 635 | "amphp/phpunit-util": "^1", 636 | "phpunit/phpunit": "^6" 637 | }, 638 | "type": "library", 639 | "autoload": { 640 | "psr-4": { 641 | "Amp\\Process\\": "lib" 642 | }, 643 | "files": [ 644 | "lib/functions.php" 645 | ] 646 | }, 647 | "notification-url": "https://packagist.org/downloads/", 648 | "license": [ 649 | "MIT" 650 | ], 651 | "authors": [ 652 | { 653 | "name": "Bob Weinand", 654 | "email": "bobwei9@hotmail.com" 655 | }, 656 | { 657 | "name": "Aaron Piotrowski", 658 | "email": "aaron@trowski.com" 659 | }, 660 | { 661 | "name": "Niklas Keller", 662 | "email": "me@kelunik.com" 663 | } 664 | ], 665 | "description": "Asynchronous process manager.", 666 | "homepage": "https://github.com/amphp/process", 667 | "support": { 668 | "issues": "https://github.com/amphp/process/issues", 669 | "source": "https://github.com/amphp/process/tree/v1.1.1" 670 | }, 671 | "funding": [ 672 | { 673 | "url": "https://github.com/amphp", 674 | "type": "github" 675 | } 676 | ], 677 | "time": "2021-03-30T20:04:22+00:00" 678 | }, 679 | { 680 | "name": "amphp/serialization", 681 | "version": "v1.0.0", 682 | "source": { 683 | "type": "git", 684 | "url": "https://github.com/amphp/serialization.git", 685 | "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" 686 | }, 687 | "dist": { 688 | "type": "zip", 689 | "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", 690 | "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", 691 | "shasum": "" 692 | }, 693 | "require": { 694 | "php": ">=7.1" 695 | }, 696 | "require-dev": { 697 | "amphp/php-cs-fixer-config": "dev-master", 698 | "phpunit/phpunit": "^9 || ^8 || ^7" 699 | }, 700 | "type": "library", 701 | "autoload": { 702 | "psr-4": { 703 | "Amp\\Serialization\\": "src" 704 | }, 705 | "files": [ 706 | "src/functions.php" 707 | ] 708 | }, 709 | "notification-url": "https://packagist.org/downloads/", 710 | "license": [ 711 | "MIT" 712 | ], 713 | "authors": [ 714 | { 715 | "name": "Aaron Piotrowski", 716 | "email": "aaron@trowski.com" 717 | }, 718 | { 719 | "name": "Niklas Keller", 720 | "email": "me@kelunik.com" 721 | } 722 | ], 723 | "description": "Serialization tools for IPC and data storage in PHP.", 724 | "homepage": "https://github.com/amphp/serialization", 725 | "keywords": [ 726 | "async", 727 | "asynchronous", 728 | "serialization", 729 | "serialize" 730 | ], 731 | "support": { 732 | "issues": "https://github.com/amphp/serialization/issues", 733 | "source": "https://github.com/amphp/serialization/tree/master" 734 | }, 735 | "time": "2020-03-25T21:39:07+00:00" 736 | }, 737 | { 738 | "name": "amphp/socket", 739 | "version": "v1.2.0", 740 | "source": { 741 | "type": "git", 742 | "url": "https://github.com/amphp/socket.git", 743 | "reference": "a8af9f5d0a66c5fe9567da45a51509e592788fe6" 744 | }, 745 | "dist": { 746 | "type": "zip", 747 | "url": "https://api.github.com/repos/amphp/socket/zipball/a8af9f5d0a66c5fe9567da45a51509e592788fe6", 748 | "reference": "a8af9f5d0a66c5fe9567da45a51509e592788fe6", 749 | "shasum": "" 750 | }, 751 | "require": { 752 | "amphp/amp": "^2", 753 | "amphp/byte-stream": "^1.6", 754 | "amphp/dns": "^1 || ^0.9", 755 | "ext-openssl": "*", 756 | "kelunik/certificate": "^1.1", 757 | "league/uri-parser": "^1.4", 758 | "php": ">=7.1" 759 | }, 760 | "require-dev": { 761 | "amphp/php-cs-fixer-config": "dev-master", 762 | "amphp/phpunit-util": "^1", 763 | "phpunit/phpunit": "^6 || ^7 || ^8", 764 | "vimeo/psalm": "^3.9@dev" 765 | }, 766 | "type": "library", 767 | "extra": { 768 | "branch-alias": { 769 | "dev-master": "1.x-dev" 770 | } 771 | }, 772 | "autoload": { 773 | "psr-4": { 774 | "Amp\\Socket\\": "src" 775 | }, 776 | "files": [ 777 | "src/functions.php", 778 | "src/Internal/functions.php" 779 | ] 780 | }, 781 | "notification-url": "https://packagist.org/downloads/", 782 | "license": [ 783 | "MIT" 784 | ], 785 | "authors": [ 786 | { 787 | "name": "Daniel Lowrey", 788 | "email": "rdlowrey@gmail.com" 789 | }, 790 | { 791 | "name": "Aaron Piotrowski", 792 | "email": "aaron@trowski.com" 793 | }, 794 | { 795 | "name": "Niklas Keller", 796 | "email": "me@kelunik.com" 797 | } 798 | ], 799 | "description": "Async socket connection / server tools for Amp.", 800 | "homepage": "https://github.com/amphp/socket", 801 | "keywords": [ 802 | "amp", 803 | "async", 804 | "encryption", 805 | "non-blocking", 806 | "sockets", 807 | "tcp", 808 | "tls" 809 | ], 810 | "support": { 811 | "issues": "https://github.com/amphp/socket/issues", 812 | "source": "https://github.com/amphp/socket/tree/v1.2.0" 813 | }, 814 | "funding": [ 815 | { 816 | "url": "https://github.com/amphp", 817 | "type": "github" 818 | } 819 | ], 820 | "time": "2021-07-09T18:18:48+00:00" 821 | }, 822 | { 823 | "name": "amphp/sync", 824 | "version": "v1.4.0", 825 | "source": { 826 | "type": "git", 827 | "url": "https://github.com/amphp/sync.git", 828 | "reference": "613047ac54c025aa800a9cde5b05c3add7327ed4" 829 | }, 830 | "dist": { 831 | "type": "zip", 832 | "url": "https://api.github.com/repos/amphp/sync/zipball/613047ac54c025aa800a9cde5b05c3add7327ed4", 833 | "reference": "613047ac54c025aa800a9cde5b05c3add7327ed4", 834 | "shasum": "" 835 | }, 836 | "require": { 837 | "amphp/amp": "^2.2", 838 | "php": ">=7.1" 839 | }, 840 | "require-dev": { 841 | "amphp/php-cs-fixer-config": "dev-master", 842 | "amphp/phpunit-util": "^1.1", 843 | "phpunit/phpunit": "^9 || ^8 || ^7" 844 | }, 845 | "type": "library", 846 | "autoload": { 847 | "psr-4": { 848 | "Amp\\Sync\\": "src" 849 | }, 850 | "files": [ 851 | "src/functions.php", 852 | "src/ConcurrentIterator/functions.php" 853 | ] 854 | }, 855 | "notification-url": "https://packagist.org/downloads/", 856 | "license": [ 857 | "MIT" 858 | ], 859 | "authors": [ 860 | { 861 | "name": "Aaron Piotrowski", 862 | "email": "aaron@trowski.com" 863 | }, 864 | { 865 | "name": "Stephen Coakley", 866 | "email": "me@stephencoakley.com" 867 | } 868 | ], 869 | "description": "Mutex, Semaphore, and other synchronization tools for Amp.", 870 | "homepage": "https://github.com/amphp/sync", 871 | "keywords": [ 872 | "async", 873 | "asynchronous", 874 | "mutex", 875 | "semaphore", 876 | "synchronization" 877 | ], 878 | "support": { 879 | "issues": "https://github.com/amphp/sync/issues", 880 | "source": "https://github.com/amphp/sync/tree/v1.4.0" 881 | }, 882 | "time": "2020-05-07T18:57:50+00:00" 883 | }, 884 | { 885 | "name": "amphp/websocket", 886 | "version": "v1.0.1", 887 | "source": { 888 | "type": "git", 889 | "url": "https://github.com/amphp/websocket.git", 890 | "reference": "6752ecfcb4deba23b95ab3fbd0d427326fcac564" 891 | }, 892 | "dist": { 893 | "type": "zip", 894 | "url": "https://api.github.com/repos/amphp/websocket/zipball/6752ecfcb4deba23b95ab3fbd0d427326fcac564", 895 | "reference": "6752ecfcb4deba23b95ab3fbd0d427326fcac564", 896 | "shasum": "" 897 | }, 898 | "require": { 899 | "amphp/amp": "^2.2", 900 | "amphp/byte-stream": "^1.6.1", 901 | "amphp/socket": "^1", 902 | "cash/lrucache": "^1", 903 | "php": ">=7.1" 904 | }, 905 | "require-dev": { 906 | "amphp/php-cs-fixer-config": "dev-master", 907 | "amphp/phpunit-util": "^1.1.2", 908 | "phpunit/phpunit": "^8 || ^7", 909 | "vimeo/psalm": "^3.11@dev" 910 | }, 911 | "suggest": { 912 | "ext-zlib": "Required for compression" 913 | }, 914 | "type": "library", 915 | "autoload": { 916 | "psr-4": { 917 | "Amp\\Websocket\\": "src" 918 | }, 919 | "files": [ 920 | "src/functions.php" 921 | ] 922 | }, 923 | "notification-url": "https://packagist.org/downloads/", 924 | "license": [ 925 | "MIT" 926 | ], 927 | "authors": [ 928 | { 929 | "name": "Aaron Piotrowski", 930 | "email": "aaron@trowski.com" 931 | }, 932 | { 933 | "name": "Niklas Keller", 934 | "email": "me@kelunik.com" 935 | }, 936 | { 937 | "name": "Bob Weinand", 938 | "email": "bobwei9@hotmail.com" 939 | } 940 | ], 941 | "description": "Shared code for websocket servers and clients.", 942 | "homepage": "https://github.com/amphp/websocket", 943 | "keywords": [ 944 | "amp", 945 | "amphp", 946 | "async", 947 | "http", 948 | "non-blocking", 949 | "websocket" 950 | ], 951 | "support": { 952 | "issues": "https://github.com/amphp/websocket/issues", 953 | "source": "https://github.com/amphp/websocket/tree/v1.0.1" 954 | }, 955 | "funding": [ 956 | { 957 | "url": "https://github.com/amphp", 958 | "type": "github" 959 | } 960 | ], 961 | "time": "2020-11-13T05:54:54+00:00" 962 | }, 963 | { 964 | "name": "amphp/websocket-client", 965 | "version": "v1.0.0", 966 | "source": { 967 | "type": "git", 968 | "url": "https://github.com/amphp/websocket-client.git", 969 | "reference": "173b54137cdcd4288702f615f05c1029e613ba37" 970 | }, 971 | "dist": { 972 | "type": "zip", 973 | "url": "https://api.github.com/repos/amphp/websocket-client/zipball/173b54137cdcd4288702f615f05c1029e613ba37", 974 | "reference": "173b54137cdcd4288702f615f05c1029e613ba37", 975 | "shasum": "" 976 | }, 977 | "require": { 978 | "amphp/amp": "^2.2", 979 | "amphp/http": "^1.3", 980 | "amphp/http-client": "^4", 981 | "amphp/socket": "^1", 982 | "amphp/websocket": "^1", 983 | "league/uri": "^6", 984 | "php": ">=7.2", 985 | "psr/http-message": "^1" 986 | }, 987 | "require-dev": { 988 | "amphp/http-server": "^2", 989 | "amphp/php-cs-fixer-config": "dev-master", 990 | "amphp/phpunit-util": "^1.1", 991 | "amphp/websocket-server": "dev-master as 2.0-rc4", 992 | "phpunit/phpunit": "^8 || ^7", 993 | "psr/log": "^1", 994 | "vimeo/psalm": "^3.11@dev" 995 | }, 996 | "type": "library", 997 | "autoload": { 998 | "psr-4": { 999 | "Amp\\Websocket\\Client\\": "src" 1000 | }, 1001 | "files": [ 1002 | "src/functions.php" 1003 | ] 1004 | }, 1005 | "notification-url": "https://packagist.org/downloads/", 1006 | "license": [ 1007 | "MIT" 1008 | ], 1009 | "authors": [ 1010 | { 1011 | "name": "Bob Weinand", 1012 | "email": "bobwei9@hotmail.com" 1013 | }, 1014 | { 1015 | "name": "Aaron Piotrowski", 1016 | "email": "aaron@trowski.com" 1017 | }, 1018 | { 1019 | "name": "Niklas Keller", 1020 | "email": "me@kelunik.com" 1021 | } 1022 | ], 1023 | "description": "Async WebSocket client for PHP based on Amp.", 1024 | "keywords": [ 1025 | "amp", 1026 | "amphp", 1027 | "async", 1028 | "client", 1029 | "http", 1030 | "non-blocking", 1031 | "websocket" 1032 | ], 1033 | "support": { 1034 | "issues": "https://github.com/amphp/websocket-client/issues", 1035 | "source": "https://github.com/amphp/websocket-client/tree/v1.0.0" 1036 | }, 1037 | "time": "2020-07-05T17:36:04+00:00" 1038 | }, 1039 | { 1040 | "name": "amphp/windows-registry", 1041 | "version": "v0.3.3", 1042 | "source": { 1043 | "type": "git", 1044 | "url": "https://github.com/amphp/windows-registry.git", 1045 | "reference": "0f56438b9197e224325e88f305346f0221df1f71" 1046 | }, 1047 | "dist": { 1048 | "type": "zip", 1049 | "url": "https://api.github.com/repos/amphp/windows-registry/zipball/0f56438b9197e224325e88f305346f0221df1f71", 1050 | "reference": "0f56438b9197e224325e88f305346f0221df1f71", 1051 | "shasum": "" 1052 | }, 1053 | "require": { 1054 | "amphp/amp": "^2", 1055 | "amphp/byte-stream": "^1.4", 1056 | "amphp/process": "^1" 1057 | }, 1058 | "require-dev": { 1059 | "amphp/php-cs-fixer-config": "dev-master" 1060 | }, 1061 | "type": "library", 1062 | "autoload": { 1063 | "psr-4": { 1064 | "Amp\\WindowsRegistry\\": "lib" 1065 | } 1066 | }, 1067 | "notification-url": "https://packagist.org/downloads/", 1068 | "license": [ 1069 | "MIT" 1070 | ], 1071 | "authors": [ 1072 | { 1073 | "name": "Niklas Keller", 1074 | "email": "me@kelunik.com" 1075 | } 1076 | ], 1077 | "description": "Windows Registry Reader.", 1078 | "support": { 1079 | "issues": "https://github.com/amphp/windows-registry/issues", 1080 | "source": "https://github.com/amphp/windows-registry/tree/master" 1081 | }, 1082 | "funding": [ 1083 | { 1084 | "url": "https://github.com/amphp", 1085 | "type": "github" 1086 | } 1087 | ], 1088 | "time": "2020-07-10T16:13:29+00:00" 1089 | }, 1090 | { 1091 | "name": "cash/lrucache", 1092 | "version": "1.0.0", 1093 | "source": { 1094 | "type": "git", 1095 | "url": "https://github.com/cash/LRUCache.git", 1096 | "reference": "4fa4c6834cec59690b43526c4da41d6153026289" 1097 | }, 1098 | "dist": { 1099 | "type": "zip", 1100 | "url": "https://api.github.com/repos/cash/LRUCache/zipball/4fa4c6834cec59690b43526c4da41d6153026289", 1101 | "reference": "4fa4c6834cec59690b43526c4da41d6153026289", 1102 | "shasum": "" 1103 | }, 1104 | "require": { 1105 | "php": ">=5.3.0" 1106 | }, 1107 | "type": "library", 1108 | "autoload": { 1109 | "psr-0": { 1110 | "cash": "src/" 1111 | } 1112 | }, 1113 | "notification-url": "https://packagist.org/downloads/", 1114 | "license": [ 1115 | "MIT" 1116 | ], 1117 | "authors": [ 1118 | { 1119 | "name": "Cash Costello", 1120 | "email": "cash.costello@gmail.com" 1121 | } 1122 | ], 1123 | "description": "An efficient memory-based Least Recently Used (LRU) cache", 1124 | "homepage": "https://github.com/cash/LRUCache", 1125 | "keywords": [ 1126 | "cache", 1127 | "lru" 1128 | ], 1129 | "support": { 1130 | "issues": "https://github.com/cash/LRUCache/issues", 1131 | "source": "https://github.com/cash/LRUCache/tree/1.0.0" 1132 | }, 1133 | "time": "2013-09-20T18:59:12+00:00" 1134 | }, 1135 | { 1136 | "name": "daverandom/libdns", 1137 | "version": "v2.0.2", 1138 | "source": { 1139 | "type": "git", 1140 | "url": "https://github.com/DaveRandom/LibDNS.git", 1141 | "reference": "e8b6d6593d18ac3a6a14666d8a68a4703b2e05f9" 1142 | }, 1143 | "dist": { 1144 | "type": "zip", 1145 | "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/e8b6d6593d18ac3a6a14666d8a68a4703b2e05f9", 1146 | "reference": "e8b6d6593d18ac3a6a14666d8a68a4703b2e05f9", 1147 | "shasum": "" 1148 | }, 1149 | "require": { 1150 | "ext-ctype": "*", 1151 | "php": ">=7.0" 1152 | }, 1153 | "suggest": { 1154 | "ext-intl": "Required for IDN support" 1155 | }, 1156 | "type": "library", 1157 | "autoload": { 1158 | "psr-4": { 1159 | "LibDNS\\": "src/" 1160 | }, 1161 | "files": [ 1162 | "src/functions.php" 1163 | ] 1164 | }, 1165 | "notification-url": "https://packagist.org/downloads/", 1166 | "license": [ 1167 | "MIT" 1168 | ], 1169 | "description": "DNS protocol implementation written in pure PHP", 1170 | "keywords": [ 1171 | "dns" 1172 | ], 1173 | "support": { 1174 | "issues": "https://github.com/DaveRandom/LibDNS/issues", 1175 | "source": "https://github.com/DaveRandom/LibDNS/tree/v2.0.2" 1176 | }, 1177 | "time": "2019-12-03T09:12:46+00:00" 1178 | }, 1179 | { 1180 | "name": "kelunik/certificate", 1181 | "version": "v1.1.2", 1182 | "source": { 1183 | "type": "git", 1184 | "url": "https://github.com/kelunik/certificate.git", 1185 | "reference": "56542e62d51533d04d0a9713261fea546bff80f6" 1186 | }, 1187 | "dist": { 1188 | "type": "zip", 1189 | "url": "https://api.github.com/repos/kelunik/certificate/zipball/56542e62d51533d04d0a9713261fea546bff80f6", 1190 | "reference": "56542e62d51533d04d0a9713261fea546bff80f6", 1191 | "shasum": "" 1192 | }, 1193 | "require": { 1194 | "ext-openssl": "*", 1195 | "php": ">=5.4" 1196 | }, 1197 | "require-dev": { 1198 | "fabpot/php-cs-fixer": "^1.9", 1199 | "phpunit/phpunit": "^4.8" 1200 | }, 1201 | "type": "library", 1202 | "autoload": { 1203 | "psr-4": { 1204 | "Kelunik\\Certificate\\": "lib" 1205 | } 1206 | }, 1207 | "notification-url": "https://packagist.org/downloads/", 1208 | "license": [ 1209 | "MIT" 1210 | ], 1211 | "authors": [ 1212 | { 1213 | "name": "Niklas Keller", 1214 | "email": "me@kelunik.com" 1215 | } 1216 | ], 1217 | "description": "Access certificate details and transform between different formats.", 1218 | "keywords": [ 1219 | "DER", 1220 | "certificate", 1221 | "certificates", 1222 | "openssl", 1223 | "pem", 1224 | "x509" 1225 | ], 1226 | "support": { 1227 | "issues": "https://github.com/kelunik/certificate/issues", 1228 | "source": "https://github.com/kelunik/certificate/tree/v1.1.2" 1229 | }, 1230 | "time": "2019-05-29T19:02:31+00:00" 1231 | }, 1232 | { 1233 | "name": "league/uri", 1234 | "version": "6.4.0", 1235 | "source": { 1236 | "type": "git", 1237 | "url": "https://github.com/thephpleague/uri.git", 1238 | "reference": "09da64118eaf4c5d52f9923a1e6a5be1da52fd9a" 1239 | }, 1240 | "dist": { 1241 | "type": "zip", 1242 | "url": "https://api.github.com/repos/thephpleague/uri/zipball/09da64118eaf4c5d52f9923a1e6a5be1da52fd9a", 1243 | "reference": "09da64118eaf4c5d52f9923a1e6a5be1da52fd9a", 1244 | "shasum": "" 1245 | }, 1246 | "require": { 1247 | "ext-json": "*", 1248 | "league/uri-interfaces": "^2.1", 1249 | "php": ">=7.2", 1250 | "psr/http-message": "^1.0" 1251 | }, 1252 | "conflict": { 1253 | "league/uri-schemes": "^1.0" 1254 | }, 1255 | "require-dev": { 1256 | "friendsofphp/php-cs-fixer": "^2.16", 1257 | "phpstan/phpstan": "^0.12", 1258 | "phpstan/phpstan-phpunit": "^0.12", 1259 | "phpstan/phpstan-strict-rules": "^0.12", 1260 | "phpunit/phpunit": "^8.0 || ^9.0", 1261 | "psr/http-factory": "^1.0" 1262 | }, 1263 | "suggest": { 1264 | "ext-fileinfo": "Needed to create Data URI from a filepath", 1265 | "ext-intl": "Needed to improve host validation", 1266 | "league/uri-components": "Needed to easily manipulate URI objects", 1267 | "psr/http-factory": "Needed to use the URI factory" 1268 | }, 1269 | "type": "library", 1270 | "extra": { 1271 | "branch-alias": { 1272 | "dev-master": "6.x-dev" 1273 | } 1274 | }, 1275 | "autoload": { 1276 | "psr-4": { 1277 | "League\\Uri\\": "src" 1278 | } 1279 | }, 1280 | "notification-url": "https://packagist.org/downloads/", 1281 | "license": [ 1282 | "MIT" 1283 | ], 1284 | "authors": [ 1285 | { 1286 | "name": "Ignace Nyamagana Butera", 1287 | "email": "nyamsprod@gmail.com", 1288 | "homepage": "https://nyamsprod.com" 1289 | } 1290 | ], 1291 | "description": "URI manipulation library", 1292 | "homepage": "http://uri.thephpleague.com", 1293 | "keywords": [ 1294 | "data-uri", 1295 | "file-uri", 1296 | "ftp", 1297 | "hostname", 1298 | "http", 1299 | "https", 1300 | "middleware", 1301 | "parse_str", 1302 | "parse_url", 1303 | "psr-7", 1304 | "query-string", 1305 | "querystring", 1306 | "rfc3986", 1307 | "rfc3987", 1308 | "rfc6570", 1309 | "uri", 1310 | "uri-template", 1311 | "url", 1312 | "ws" 1313 | ], 1314 | "support": { 1315 | "docs": "https://uri.thephpleague.com", 1316 | "forum": "https://thephpleague.slack.com", 1317 | "issues": "https://github.com/thephpleague/uri/issues", 1318 | "source": "https://github.com/thephpleague/uri/tree/6.4.0" 1319 | }, 1320 | "funding": [ 1321 | { 1322 | "url": "https://github.com/sponsors/nyamsprod", 1323 | "type": "github" 1324 | } 1325 | ], 1326 | "time": "2020-11-22T14:29:11+00:00" 1327 | }, 1328 | { 1329 | "name": "league/uri-interfaces", 1330 | "version": "2.3.0", 1331 | "source": { 1332 | "type": "git", 1333 | "url": "https://github.com/thephpleague/uri-interfaces.git", 1334 | "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" 1335 | }, 1336 | "dist": { 1337 | "type": "zip", 1338 | "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", 1339 | "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", 1340 | "shasum": "" 1341 | }, 1342 | "require": { 1343 | "ext-json": "*", 1344 | "php": "^7.2 || ^8.0" 1345 | }, 1346 | "require-dev": { 1347 | "friendsofphp/php-cs-fixer": "^2.19", 1348 | "phpstan/phpstan": "^0.12.90", 1349 | "phpstan/phpstan-phpunit": "^0.12.19", 1350 | "phpstan/phpstan-strict-rules": "^0.12.9", 1351 | "phpunit/phpunit": "^8.5.15 || ^9.5" 1352 | }, 1353 | "suggest": { 1354 | "ext-intl": "to use the IDNA feature", 1355 | "symfony/intl": "to use the IDNA feature via Symfony Polyfill" 1356 | }, 1357 | "type": "library", 1358 | "extra": { 1359 | "branch-alias": { 1360 | "dev-master": "2.x-dev" 1361 | } 1362 | }, 1363 | "autoload": { 1364 | "psr-4": { 1365 | "League\\Uri\\": "src/" 1366 | } 1367 | }, 1368 | "notification-url": "https://packagist.org/downloads/", 1369 | "license": [ 1370 | "MIT" 1371 | ], 1372 | "authors": [ 1373 | { 1374 | "name": "Ignace Nyamagana Butera", 1375 | "email": "nyamsprod@gmail.com", 1376 | "homepage": "https://nyamsprod.com" 1377 | } 1378 | ], 1379 | "description": "Common interface for URI representation", 1380 | "homepage": "http://github.com/thephpleague/uri-interfaces", 1381 | "keywords": [ 1382 | "rfc3986", 1383 | "rfc3987", 1384 | "uri", 1385 | "url" 1386 | ], 1387 | "support": { 1388 | "issues": "https://github.com/thephpleague/uri-interfaces/issues", 1389 | "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" 1390 | }, 1391 | "funding": [ 1392 | { 1393 | "url": "https://github.com/sponsors/nyamsprod", 1394 | "type": "github" 1395 | } 1396 | ], 1397 | "time": "2021-06-28T04:27:21+00:00" 1398 | }, 1399 | { 1400 | "name": "league/uri-parser", 1401 | "version": "1.4.1", 1402 | "source": { 1403 | "type": "git", 1404 | "url": "https://github.com/thephpleague/uri-parser.git", 1405 | "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" 1406 | }, 1407 | "dist": { 1408 | "type": "zip", 1409 | "url": "https://api.github.com/repos/thephpleague/uri-parser/zipball/671548427e4c932352d9b9279fdfa345bf63fa00", 1410 | "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", 1411 | "shasum": "" 1412 | }, 1413 | "require": { 1414 | "php": ">=7.0.0" 1415 | }, 1416 | "require-dev": { 1417 | "friendsofphp/php-cs-fixer": "^2.0", 1418 | "phpstan/phpstan": "^0.9.2", 1419 | "phpstan/phpstan-phpunit": "^0.9.4", 1420 | "phpstan/phpstan-strict-rules": "^0.9.0", 1421 | "phpunit/phpunit": "^6.0" 1422 | }, 1423 | "suggest": { 1424 | "ext-intl": "Allow parsing RFC3987 compliant hosts", 1425 | "league/uri-schemes": "Allow validating and normalizing URI parsing results" 1426 | }, 1427 | "type": "library", 1428 | "extra": { 1429 | "branch-alias": { 1430 | "dev-master": "1.x-dev" 1431 | } 1432 | }, 1433 | "autoload": { 1434 | "psr-4": { 1435 | "League\\Uri\\": "src" 1436 | }, 1437 | "files": [ 1438 | "src/functions_include.php" 1439 | ] 1440 | }, 1441 | "notification-url": "https://packagist.org/downloads/", 1442 | "license": [ 1443 | "MIT" 1444 | ], 1445 | "authors": [ 1446 | { 1447 | "name": "Ignace Nyamagana Butera", 1448 | "email": "nyamsprod@gmail.com", 1449 | "homepage": "https://nyamsprod.com" 1450 | } 1451 | ], 1452 | "description": "userland URI parser RFC 3986 compliant", 1453 | "homepage": "https://github.com/thephpleague/uri-parser", 1454 | "keywords": [ 1455 | "parse_url", 1456 | "parser", 1457 | "rfc3986", 1458 | "rfc3987", 1459 | "uri", 1460 | "url" 1461 | ], 1462 | "support": { 1463 | "issues": "https://github.com/thephpleague/uri-parser/issues", 1464 | "source": "https://github.com/thephpleague/uri-parser/tree/master" 1465 | }, 1466 | "time": "2018-11-22T07:55:51+00:00" 1467 | }, 1468 | { 1469 | "name": "nyholm/psr7", 1470 | "version": "1.4.1", 1471 | "source": { 1472 | "type": "git", 1473 | "url": "https://github.com/Nyholm/psr7.git", 1474 | "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec" 1475 | }, 1476 | "dist": { 1477 | "type": "zip", 1478 | "url": "https://api.github.com/repos/Nyholm/psr7/zipball/2212385b47153ea71b1c1b1374f8cb5e4f7892ec", 1479 | "reference": "2212385b47153ea71b1c1b1374f8cb5e4f7892ec", 1480 | "shasum": "" 1481 | }, 1482 | "require": { 1483 | "php": ">=7.1", 1484 | "php-http/message-factory": "^1.0", 1485 | "psr/http-factory": "^1.0", 1486 | "psr/http-message": "^1.0" 1487 | }, 1488 | "provide": { 1489 | "psr/http-factory-implementation": "1.0", 1490 | "psr/http-message-implementation": "1.0" 1491 | }, 1492 | "require-dev": { 1493 | "http-interop/http-factory-tests": "^0.9", 1494 | "php-http/psr7-integration-tests": "^1.0", 1495 | "phpunit/phpunit": "^7.5 || 8.5 || 9.4", 1496 | "symfony/error-handler": "^4.4" 1497 | }, 1498 | "type": "library", 1499 | "extra": { 1500 | "branch-alias": { 1501 | "dev-master": "1.4-dev" 1502 | } 1503 | }, 1504 | "autoload": { 1505 | "psr-4": { 1506 | "Nyholm\\Psr7\\": "src/" 1507 | } 1508 | }, 1509 | "notification-url": "https://packagist.org/downloads/", 1510 | "license": [ 1511 | "MIT" 1512 | ], 1513 | "authors": [ 1514 | { 1515 | "name": "Tobias Nyholm", 1516 | "email": "tobias.nyholm@gmail.com" 1517 | }, 1518 | { 1519 | "name": "Martijn van der Ven", 1520 | "email": "martijn@vanderven.se" 1521 | } 1522 | ], 1523 | "description": "A fast PHP7 implementation of PSR-7", 1524 | "homepage": "https://tnyholm.se", 1525 | "keywords": [ 1526 | "psr-17", 1527 | "psr-7" 1528 | ], 1529 | "support": { 1530 | "issues": "https://github.com/Nyholm/psr7/issues", 1531 | "source": "https://github.com/Nyholm/psr7/tree/1.4.1" 1532 | }, 1533 | "funding": [ 1534 | { 1535 | "url": "https://github.com/Zegnat", 1536 | "type": "github" 1537 | }, 1538 | { 1539 | "url": "https://github.com/nyholm", 1540 | "type": "github" 1541 | } 1542 | ], 1543 | "time": "2021-07-02T08:32:20+00:00" 1544 | }, 1545 | { 1546 | "name": "nyholm/psr7-server", 1547 | "version": "1.0.2", 1548 | "source": { 1549 | "type": "git", 1550 | "url": "https://github.com/Nyholm/psr7-server.git", 1551 | "reference": "b846a689844cef114e8079d8c80f0afd96745ae3" 1552 | }, 1553 | "dist": { 1554 | "type": "zip", 1555 | "url": "https://api.github.com/repos/Nyholm/psr7-server/zipball/b846a689844cef114e8079d8c80f0afd96745ae3", 1556 | "reference": "b846a689844cef114e8079d8c80f0afd96745ae3", 1557 | "shasum": "" 1558 | }, 1559 | "require": { 1560 | "php": "^7.1 || ^8.0", 1561 | "psr/http-factory": "^1.0", 1562 | "psr/http-message": "^1.0" 1563 | }, 1564 | "require-dev": { 1565 | "nyholm/nsa": "^1.1", 1566 | "nyholm/psr7": "^1.3", 1567 | "phpunit/phpunit": "^7.0 || ^8.5 || ^9.3" 1568 | }, 1569 | "type": "library", 1570 | "autoload": { 1571 | "psr-4": { 1572 | "Nyholm\\Psr7Server\\": "src/" 1573 | } 1574 | }, 1575 | "notification-url": "https://packagist.org/downloads/", 1576 | "license": [ 1577 | "MIT" 1578 | ], 1579 | "authors": [ 1580 | { 1581 | "name": "Tobias Nyholm", 1582 | "email": "tobias.nyholm@gmail.com" 1583 | }, 1584 | { 1585 | "name": "Martijn van der Ven", 1586 | "email": "martijn@vanderven.se" 1587 | } 1588 | ], 1589 | "description": "Helper classes to handle PSR-7 server requests", 1590 | "homepage": "http://tnyholm.se", 1591 | "keywords": [ 1592 | "psr-17", 1593 | "psr-7" 1594 | ], 1595 | "support": { 1596 | "issues": "https://github.com/Nyholm/psr7-server/issues", 1597 | "source": "https://github.com/Nyholm/psr7-server/tree/1.0.2" 1598 | }, 1599 | "funding": [ 1600 | { 1601 | "url": "https://github.com/Zegnat", 1602 | "type": "github" 1603 | }, 1604 | { 1605 | "url": "https://github.com/nyholm", 1606 | "type": "github" 1607 | } 1608 | ], 1609 | "time": "2021-05-12T11:11:27+00:00" 1610 | }, 1611 | { 1612 | "name": "php-http/message-factory", 1613 | "version": "v1.0.2", 1614 | "source": { 1615 | "type": "git", 1616 | "url": "https://github.com/php-http/message-factory.git", 1617 | "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" 1618 | }, 1619 | "dist": { 1620 | "type": "zip", 1621 | "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", 1622 | "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", 1623 | "shasum": "" 1624 | }, 1625 | "require": { 1626 | "php": ">=5.4", 1627 | "psr/http-message": "^1.0" 1628 | }, 1629 | "type": "library", 1630 | "extra": { 1631 | "branch-alias": { 1632 | "dev-master": "1.0-dev" 1633 | } 1634 | }, 1635 | "autoload": { 1636 | "psr-4": { 1637 | "Http\\Message\\": "src/" 1638 | } 1639 | }, 1640 | "notification-url": "https://packagist.org/downloads/", 1641 | "license": [ 1642 | "MIT" 1643 | ], 1644 | "authors": [ 1645 | { 1646 | "name": "Márk Sági-Kazár", 1647 | "email": "mark.sagikazar@gmail.com" 1648 | } 1649 | ], 1650 | "description": "Factory interfaces for PSR-7 HTTP Message", 1651 | "homepage": "http://php-http.org", 1652 | "keywords": [ 1653 | "factory", 1654 | "http", 1655 | "message", 1656 | "stream", 1657 | "uri" 1658 | ], 1659 | "support": { 1660 | "issues": "https://github.com/php-http/message-factory/issues", 1661 | "source": "https://github.com/php-http/message-factory/tree/master" 1662 | }, 1663 | "time": "2015-12-19T14:08:53+00:00" 1664 | }, 1665 | { 1666 | "name": "psr/container", 1667 | "version": "1.1.1", 1668 | "source": { 1669 | "type": "git", 1670 | "url": "https://github.com/php-fig/container.git", 1671 | "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" 1672 | }, 1673 | "dist": { 1674 | "type": "zip", 1675 | "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", 1676 | "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", 1677 | "shasum": "" 1678 | }, 1679 | "require": { 1680 | "php": ">=7.2.0" 1681 | }, 1682 | "type": "library", 1683 | "autoload": { 1684 | "psr-4": { 1685 | "Psr\\Container\\": "src/" 1686 | } 1687 | }, 1688 | "notification-url": "https://packagist.org/downloads/", 1689 | "license": [ 1690 | "MIT" 1691 | ], 1692 | "authors": [ 1693 | { 1694 | "name": "PHP-FIG", 1695 | "homepage": "https://www.php-fig.org/" 1696 | } 1697 | ], 1698 | "description": "Common Container Interface (PHP FIG PSR-11)", 1699 | "homepage": "https://github.com/php-fig/container", 1700 | "keywords": [ 1701 | "PSR-11", 1702 | "container", 1703 | "container-interface", 1704 | "container-interop", 1705 | "psr" 1706 | ], 1707 | "support": { 1708 | "issues": "https://github.com/php-fig/container/issues", 1709 | "source": "https://github.com/php-fig/container/tree/1.1.1" 1710 | }, 1711 | "time": "2021-03-05T17:36:06+00:00" 1712 | }, 1713 | { 1714 | "name": "psr/http-factory", 1715 | "version": "1.0.1", 1716 | "source": { 1717 | "type": "git", 1718 | "url": "https://github.com/php-fig/http-factory.git", 1719 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" 1720 | }, 1721 | "dist": { 1722 | "type": "zip", 1723 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 1724 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 1725 | "shasum": "" 1726 | }, 1727 | "require": { 1728 | "php": ">=7.0.0", 1729 | "psr/http-message": "^1.0" 1730 | }, 1731 | "type": "library", 1732 | "extra": { 1733 | "branch-alias": { 1734 | "dev-master": "1.0.x-dev" 1735 | } 1736 | }, 1737 | "autoload": { 1738 | "psr-4": { 1739 | "Psr\\Http\\Message\\": "src/" 1740 | } 1741 | }, 1742 | "notification-url": "https://packagist.org/downloads/", 1743 | "license": [ 1744 | "MIT" 1745 | ], 1746 | "authors": [ 1747 | { 1748 | "name": "PHP-FIG", 1749 | "homepage": "http://www.php-fig.org/" 1750 | } 1751 | ], 1752 | "description": "Common interfaces for PSR-7 HTTP message factories", 1753 | "keywords": [ 1754 | "factory", 1755 | "http", 1756 | "message", 1757 | "psr", 1758 | "psr-17", 1759 | "psr-7", 1760 | "request", 1761 | "response" 1762 | ], 1763 | "support": { 1764 | "source": "https://github.com/php-fig/http-factory/tree/master" 1765 | }, 1766 | "time": "2019-04-30T12:38:16+00:00" 1767 | }, 1768 | { 1769 | "name": "psr/http-message", 1770 | "version": "1.0.1", 1771 | "source": { 1772 | "type": "git", 1773 | "url": "https://github.com/php-fig/http-message.git", 1774 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1775 | }, 1776 | "dist": { 1777 | "type": "zip", 1778 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1779 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1780 | "shasum": "" 1781 | }, 1782 | "require": { 1783 | "php": ">=5.3.0" 1784 | }, 1785 | "type": "library", 1786 | "extra": { 1787 | "branch-alias": { 1788 | "dev-master": "1.0.x-dev" 1789 | } 1790 | }, 1791 | "autoload": { 1792 | "psr-4": { 1793 | "Psr\\Http\\Message\\": "src/" 1794 | } 1795 | }, 1796 | "notification-url": "https://packagist.org/downloads/", 1797 | "license": [ 1798 | "MIT" 1799 | ], 1800 | "authors": [ 1801 | { 1802 | "name": "PHP-FIG", 1803 | "homepage": "http://www.php-fig.org/" 1804 | } 1805 | ], 1806 | "description": "Common interface for HTTP messages", 1807 | "homepage": "https://github.com/php-fig/http-message", 1808 | "keywords": [ 1809 | "http", 1810 | "http-message", 1811 | "psr", 1812 | "psr-7", 1813 | "request", 1814 | "response" 1815 | ], 1816 | "support": { 1817 | "source": "https://github.com/php-fig/http-message/tree/master" 1818 | }, 1819 | "time": "2016-08-06T14:39:51+00:00" 1820 | }, 1821 | { 1822 | "name": "psr/http-server-handler", 1823 | "version": "1.0.1", 1824 | "source": { 1825 | "type": "git", 1826 | "url": "https://github.com/php-fig/http-server-handler.git", 1827 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" 1828 | }, 1829 | "dist": { 1830 | "type": "zip", 1831 | "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 1832 | "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", 1833 | "shasum": "" 1834 | }, 1835 | "require": { 1836 | "php": ">=7.0", 1837 | "psr/http-message": "^1.0" 1838 | }, 1839 | "type": "library", 1840 | "extra": { 1841 | "branch-alias": { 1842 | "dev-master": "1.0.x-dev" 1843 | } 1844 | }, 1845 | "autoload": { 1846 | "psr-4": { 1847 | "Psr\\Http\\Server\\": "src/" 1848 | } 1849 | }, 1850 | "notification-url": "https://packagist.org/downloads/", 1851 | "license": [ 1852 | "MIT" 1853 | ], 1854 | "authors": [ 1855 | { 1856 | "name": "PHP-FIG", 1857 | "homepage": "http://www.php-fig.org/" 1858 | } 1859 | ], 1860 | "description": "Common interface for HTTP server-side request handler", 1861 | "keywords": [ 1862 | "handler", 1863 | "http", 1864 | "http-interop", 1865 | "psr", 1866 | "psr-15", 1867 | "psr-7", 1868 | "request", 1869 | "response", 1870 | "server" 1871 | ], 1872 | "support": { 1873 | "issues": "https://github.com/php-fig/http-server-handler/issues", 1874 | "source": "https://github.com/php-fig/http-server-handler/tree/master" 1875 | }, 1876 | "time": "2018-10-30T16:46:14+00:00" 1877 | }, 1878 | { 1879 | "name": "psr/http-server-middleware", 1880 | "version": "1.0.1", 1881 | "source": { 1882 | "type": "git", 1883 | "url": "https://github.com/php-fig/http-server-middleware.git", 1884 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" 1885 | }, 1886 | "dist": { 1887 | "type": "zip", 1888 | "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", 1889 | "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", 1890 | "shasum": "" 1891 | }, 1892 | "require": { 1893 | "php": ">=7.0", 1894 | "psr/http-message": "^1.0", 1895 | "psr/http-server-handler": "^1.0" 1896 | }, 1897 | "type": "library", 1898 | "extra": { 1899 | "branch-alias": { 1900 | "dev-master": "1.0.x-dev" 1901 | } 1902 | }, 1903 | "autoload": { 1904 | "psr-4": { 1905 | "Psr\\Http\\Server\\": "src/" 1906 | } 1907 | }, 1908 | "notification-url": "https://packagist.org/downloads/", 1909 | "license": [ 1910 | "MIT" 1911 | ], 1912 | "authors": [ 1913 | { 1914 | "name": "PHP-FIG", 1915 | "homepage": "http://www.php-fig.org/" 1916 | } 1917 | ], 1918 | "description": "Common interface for HTTP server-side middleware", 1919 | "keywords": [ 1920 | "http", 1921 | "http-interop", 1922 | "middleware", 1923 | "psr", 1924 | "psr-15", 1925 | "psr-7", 1926 | "request", 1927 | "response" 1928 | ], 1929 | "support": { 1930 | "issues": "https://github.com/php-fig/http-server-middleware/issues", 1931 | "source": "https://github.com/php-fig/http-server-middleware/tree/master" 1932 | }, 1933 | "time": "2018-10-30T17:12:04+00:00" 1934 | }, 1935 | { 1936 | "name": "psr/log", 1937 | "version": "1.1.4", 1938 | "source": { 1939 | "type": "git", 1940 | "url": "https://github.com/php-fig/log.git", 1941 | "reference": "d49695b909c3b7628b6289db5479a1c204601f11" 1942 | }, 1943 | "dist": { 1944 | "type": "zip", 1945 | "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", 1946 | "reference": "d49695b909c3b7628b6289db5479a1c204601f11", 1947 | "shasum": "" 1948 | }, 1949 | "require": { 1950 | "php": ">=5.3.0" 1951 | }, 1952 | "type": "library", 1953 | "extra": { 1954 | "branch-alias": { 1955 | "dev-master": "1.1.x-dev" 1956 | } 1957 | }, 1958 | "autoload": { 1959 | "psr-4": { 1960 | "Psr\\Log\\": "Psr/Log/" 1961 | } 1962 | }, 1963 | "notification-url": "https://packagist.org/downloads/", 1964 | "license": [ 1965 | "MIT" 1966 | ], 1967 | "authors": [ 1968 | { 1969 | "name": "PHP-FIG", 1970 | "homepage": "https://www.php-fig.org/" 1971 | } 1972 | ], 1973 | "description": "Common interface for logging libraries", 1974 | "homepage": "https://github.com/php-fig/log", 1975 | "keywords": [ 1976 | "log", 1977 | "psr", 1978 | "psr-3" 1979 | ], 1980 | "support": { 1981 | "source": "https://github.com/php-fig/log/tree/1.1.4" 1982 | }, 1983 | "time": "2021-05-03T11:20:27+00:00" 1984 | }, 1985 | { 1986 | "name": "slack-php/slack-app-framework", 1987 | "version": "0.5.0", 1988 | "source": { 1989 | "type": "git", 1990 | "url": "https://github.com/slack-php/slack-php-app-framework.git", 1991 | "reference": "79837c936a73aac1d3ca95752442a9a63e1ea159" 1992 | }, 1993 | "dist": { 1994 | "type": "zip", 1995 | "url": "https://api.github.com/repos/slack-php/slack-php-app-framework/zipball/79837c936a73aac1d3ca95752442a9a63e1ea159", 1996 | "reference": "79837c936a73aac1d3ca95752442a9a63e1ea159", 1997 | "shasum": "" 1998 | }, 1999 | "require": { 2000 | "ext-ctype": "*", 2001 | "ext-json": "*", 2002 | "nyholm/psr7": "^1.3", 2003 | "nyholm/psr7-server": "^1.0", 2004 | "php": ">=7.4", 2005 | "psr/container": "^1.0", 2006 | "psr/http-factory": "^1.0", 2007 | "psr/http-message": "^1.0", 2008 | "psr/http-server-handler": "^1.0", 2009 | "psr/http-server-middleware": "^1.0", 2010 | "psr/log": "^1.1", 2011 | "slack-php/slack-block-kit": "^0.19.0" 2012 | }, 2013 | "require-dev": { 2014 | "friendsofphp/php-cs-fixer": "^2.18", 2015 | "phpstan/phpstan": "^0.12.77", 2016 | "phpunit/phpunit": "^9.5" 2017 | }, 2018 | "type": "library", 2019 | "autoload": { 2020 | "psr-4": { 2021 | "SlackPhp\\Framework\\": "src/" 2022 | } 2023 | }, 2024 | "notification-url": "https://packagist.org/downloads/", 2025 | "license": [ 2026 | "MIT" 2027 | ], 2028 | "authors": [ 2029 | { 2030 | "name": "Jeremy Lindblom", 2031 | "email": "jeremeamia@gmail.com" 2032 | } 2033 | ], 2034 | "description": "Provides a foundation upon which to build a Slack application in PHP", 2035 | "support": { 2036 | "issues": "https://github.com/slack-php/slack-php-app-framework/issues", 2037 | "source": "https://github.com/slack-php/slack-php-app-framework/tree/0.5.0" 2038 | }, 2039 | "time": "2021-07-09T18:13:47+00:00" 2040 | }, 2041 | { 2042 | "name": "slack-php/slack-block-kit", 2043 | "version": "0.19.0", 2044 | "source": { 2045 | "type": "git", 2046 | "url": "https://github.com/slack-php/slack-php-block-kit.git", 2047 | "reference": "814d09010be4ad16376d8b4baf4474bf539a0b2e" 2048 | }, 2049 | "dist": { 2050 | "type": "zip", 2051 | "url": "https://api.github.com/repos/slack-php/slack-php-block-kit/zipball/814d09010be4ad16376d8b4baf4474bf539a0b2e", 2052 | "reference": "814d09010be4ad16376d8b4baf4474bf539a0b2e", 2053 | "shasum": "" 2054 | }, 2055 | "require": { 2056 | "ext-json": "*", 2057 | "php": ">=7.3" 2058 | }, 2059 | "require-dev": { 2060 | "phpstan/phpstan": "^0.12.0", 2061 | "phpunit/phpunit": "^9.0", 2062 | "squizlabs/php_codesniffer": "^3.5" 2063 | }, 2064 | "type": "library", 2065 | "autoload": { 2066 | "psr-4": { 2067 | "SlackPhp\\BlockKit\\": "src/" 2068 | } 2069 | }, 2070 | "notification-url": "https://packagist.org/downloads/", 2071 | "license": [ 2072 | "MIT" 2073 | ], 2074 | "description": "OOP interface for writing Slack Block Kit messages and modals", 2075 | "support": { 2076 | "issues": "https://github.com/slack-php/slack-php-block-kit/issues", 2077 | "source": "https://github.com/slack-php/slack-php-block-kit/tree/0.19.0" 2078 | }, 2079 | "time": "2021-06-18T20:14:24+00:00" 2080 | } 2081 | ], 2082 | "packages-dev": [ 2083 | { 2084 | "name": "composer/semver", 2085 | "version": "3.2.5", 2086 | "source": { 2087 | "type": "git", 2088 | "url": "https://github.com/composer/semver.git", 2089 | "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" 2090 | }, 2091 | "dist": { 2092 | "type": "zip", 2093 | "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", 2094 | "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", 2095 | "shasum": "" 2096 | }, 2097 | "require": { 2098 | "php": "^5.3.2 || ^7.0 || ^8.0" 2099 | }, 2100 | "require-dev": { 2101 | "phpstan/phpstan": "^0.12.54", 2102 | "symfony/phpunit-bridge": "^4.2 || ^5" 2103 | }, 2104 | "type": "library", 2105 | "extra": { 2106 | "branch-alias": { 2107 | "dev-main": "3.x-dev" 2108 | } 2109 | }, 2110 | "autoload": { 2111 | "psr-4": { 2112 | "Composer\\Semver\\": "src" 2113 | } 2114 | }, 2115 | "notification-url": "https://packagist.org/downloads/", 2116 | "license": [ 2117 | "MIT" 2118 | ], 2119 | "authors": [ 2120 | { 2121 | "name": "Nils Adermann", 2122 | "email": "naderman@naderman.de", 2123 | "homepage": "http://www.naderman.de" 2124 | }, 2125 | { 2126 | "name": "Jordi Boggiano", 2127 | "email": "j.boggiano@seld.be", 2128 | "homepage": "http://seld.be" 2129 | }, 2130 | { 2131 | "name": "Rob Bast", 2132 | "email": "rob.bast@gmail.com", 2133 | "homepage": "http://robbast.nl" 2134 | } 2135 | ], 2136 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 2137 | "keywords": [ 2138 | "semantic", 2139 | "semver", 2140 | "validation", 2141 | "versioning" 2142 | ], 2143 | "support": { 2144 | "irc": "irc://irc.freenode.org/composer", 2145 | "issues": "https://github.com/composer/semver/issues", 2146 | "source": "https://github.com/composer/semver/tree/3.2.5" 2147 | }, 2148 | "funding": [ 2149 | { 2150 | "url": "https://packagist.com", 2151 | "type": "custom" 2152 | }, 2153 | { 2154 | "url": "https://github.com/composer", 2155 | "type": "github" 2156 | }, 2157 | { 2158 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 2159 | "type": "tidelift" 2160 | } 2161 | ], 2162 | "time": "2021-05-24T12:41:47+00:00" 2163 | }, 2164 | { 2165 | "name": "composer/xdebug-handler", 2166 | "version": "2.0.1", 2167 | "source": { 2168 | "type": "git", 2169 | "url": "https://github.com/composer/xdebug-handler.git", 2170 | "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496" 2171 | }, 2172 | "dist": { 2173 | "type": "zip", 2174 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", 2175 | "reference": "964adcdd3a28bf9ed5d9ac6450064e0d71ed7496", 2176 | "shasum": "" 2177 | }, 2178 | "require": { 2179 | "php": "^5.3.2 || ^7.0 || ^8.0", 2180 | "psr/log": "^1.0" 2181 | }, 2182 | "require-dev": { 2183 | "phpstan/phpstan": "^0.12.55", 2184 | "symfony/phpunit-bridge": "^4.2 || ^5" 2185 | }, 2186 | "type": "library", 2187 | "autoload": { 2188 | "psr-4": { 2189 | "Composer\\XdebugHandler\\": "src" 2190 | } 2191 | }, 2192 | "notification-url": "https://packagist.org/downloads/", 2193 | "license": [ 2194 | "MIT" 2195 | ], 2196 | "authors": [ 2197 | { 2198 | "name": "John Stevenson", 2199 | "email": "john-stevenson@blueyonder.co.uk" 2200 | } 2201 | ], 2202 | "description": "Restarts a process without Xdebug.", 2203 | "keywords": [ 2204 | "Xdebug", 2205 | "performance" 2206 | ], 2207 | "support": { 2208 | "irc": "irc://irc.freenode.org/composer", 2209 | "issues": "https://github.com/composer/xdebug-handler/issues", 2210 | "source": "https://github.com/composer/xdebug-handler/tree/2.0.1" 2211 | }, 2212 | "funding": [ 2213 | { 2214 | "url": "https://packagist.com", 2215 | "type": "custom" 2216 | }, 2217 | { 2218 | "url": "https://github.com/composer", 2219 | "type": "github" 2220 | }, 2221 | { 2222 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 2223 | "type": "tidelift" 2224 | } 2225 | ], 2226 | "time": "2021-05-05T19:37:51+00:00" 2227 | }, 2228 | { 2229 | "name": "doctrine/annotations", 2230 | "version": "1.13.1", 2231 | "source": { 2232 | "type": "git", 2233 | "url": "https://github.com/doctrine/annotations.git", 2234 | "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" 2235 | }, 2236 | "dist": { 2237 | "type": "zip", 2238 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", 2239 | "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", 2240 | "shasum": "" 2241 | }, 2242 | "require": { 2243 | "doctrine/lexer": "1.*", 2244 | "ext-tokenizer": "*", 2245 | "php": "^7.1 || ^8.0", 2246 | "psr/cache": "^1 || ^2 || ^3" 2247 | }, 2248 | "require-dev": { 2249 | "doctrine/cache": "^1.11 || ^2.0", 2250 | "doctrine/coding-standard": "^6.0 || ^8.1", 2251 | "phpstan/phpstan": "^0.12.20", 2252 | "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", 2253 | "symfony/cache": "^4.4 || ^5.2" 2254 | }, 2255 | "type": "library", 2256 | "autoload": { 2257 | "psr-4": { 2258 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 2259 | } 2260 | }, 2261 | "notification-url": "https://packagist.org/downloads/", 2262 | "license": [ 2263 | "MIT" 2264 | ], 2265 | "authors": [ 2266 | { 2267 | "name": "Guilherme Blanco", 2268 | "email": "guilhermeblanco@gmail.com" 2269 | }, 2270 | { 2271 | "name": "Roman Borschel", 2272 | "email": "roman@code-factory.org" 2273 | }, 2274 | { 2275 | "name": "Benjamin Eberlei", 2276 | "email": "kontakt@beberlei.de" 2277 | }, 2278 | { 2279 | "name": "Jonathan Wage", 2280 | "email": "jonwage@gmail.com" 2281 | }, 2282 | { 2283 | "name": "Johannes Schmitt", 2284 | "email": "schmittjoh@gmail.com" 2285 | } 2286 | ], 2287 | "description": "Docblock Annotations Parser", 2288 | "homepage": "https://www.doctrine-project.org/projects/annotations.html", 2289 | "keywords": [ 2290 | "annotations", 2291 | "docblock", 2292 | "parser" 2293 | ], 2294 | "support": { 2295 | "issues": "https://github.com/doctrine/annotations/issues", 2296 | "source": "https://github.com/doctrine/annotations/tree/1.13.1" 2297 | }, 2298 | "time": "2021-05-16T18:07:53+00:00" 2299 | }, 2300 | { 2301 | "name": "doctrine/lexer", 2302 | "version": "1.2.1", 2303 | "source": { 2304 | "type": "git", 2305 | "url": "https://github.com/doctrine/lexer.git", 2306 | "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" 2307 | }, 2308 | "dist": { 2309 | "type": "zip", 2310 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", 2311 | "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", 2312 | "shasum": "" 2313 | }, 2314 | "require": { 2315 | "php": "^7.2 || ^8.0" 2316 | }, 2317 | "require-dev": { 2318 | "doctrine/coding-standard": "^6.0", 2319 | "phpstan/phpstan": "^0.11.8", 2320 | "phpunit/phpunit": "^8.2" 2321 | }, 2322 | "type": "library", 2323 | "extra": { 2324 | "branch-alias": { 2325 | "dev-master": "1.2.x-dev" 2326 | } 2327 | }, 2328 | "autoload": { 2329 | "psr-4": { 2330 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 2331 | } 2332 | }, 2333 | "notification-url": "https://packagist.org/downloads/", 2334 | "license": [ 2335 | "MIT" 2336 | ], 2337 | "authors": [ 2338 | { 2339 | "name": "Guilherme Blanco", 2340 | "email": "guilhermeblanco@gmail.com" 2341 | }, 2342 | { 2343 | "name": "Roman Borschel", 2344 | "email": "roman@code-factory.org" 2345 | }, 2346 | { 2347 | "name": "Johannes Schmitt", 2348 | "email": "schmittjoh@gmail.com" 2349 | } 2350 | ], 2351 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 2352 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 2353 | "keywords": [ 2354 | "annotations", 2355 | "docblock", 2356 | "lexer", 2357 | "parser", 2358 | "php" 2359 | ], 2360 | "support": { 2361 | "issues": "https://github.com/doctrine/lexer/issues", 2362 | "source": "https://github.com/doctrine/lexer/tree/1.2.1" 2363 | }, 2364 | "funding": [ 2365 | { 2366 | "url": "https://www.doctrine-project.org/sponsorship.html", 2367 | "type": "custom" 2368 | }, 2369 | { 2370 | "url": "https://www.patreon.com/phpdoctrine", 2371 | "type": "patreon" 2372 | }, 2373 | { 2374 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", 2375 | "type": "tidelift" 2376 | } 2377 | ], 2378 | "time": "2020-05-25T17:44:05+00:00" 2379 | }, 2380 | { 2381 | "name": "friendsofphp/php-cs-fixer", 2382 | "version": "v3.0.0", 2383 | "source": { 2384 | "type": "git", 2385 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", 2386 | "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167" 2387 | }, 2388 | "dist": { 2389 | "type": "zip", 2390 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c15377bdfa8d1ecf186f1deadec39c89984e1167", 2391 | "reference": "c15377bdfa8d1ecf186f1deadec39c89984e1167", 2392 | "shasum": "" 2393 | }, 2394 | "require": { 2395 | "composer/semver": "^3.2", 2396 | "composer/xdebug-handler": "^2.0", 2397 | "doctrine/annotations": "^1.12", 2398 | "ext-json": "*", 2399 | "ext-tokenizer": "*", 2400 | "php": "^7.1.3 || ^8.0", 2401 | "php-cs-fixer/diff": "^2.0", 2402 | "symfony/console": "^4.4.20 || ^5.1.3", 2403 | "symfony/event-dispatcher": "^4.4.20 || ^5.0", 2404 | "symfony/filesystem": "^4.4.20 || ^5.0", 2405 | "symfony/finder": "^4.4.20 || ^5.0", 2406 | "symfony/options-resolver": "^4.4.20 || ^5.0", 2407 | "symfony/polyfill-php72": "^1.22", 2408 | "symfony/process": "^4.4.20 || ^5.0", 2409 | "symfony/stopwatch": "^4.4.20 || ^5.0" 2410 | }, 2411 | "require-dev": { 2412 | "justinrainbow/json-schema": "^5.2", 2413 | "keradus/cli-executor": "^1.4", 2414 | "mikey179/vfsstream": "^1.6.8", 2415 | "php-coveralls/php-coveralls": "^2.4.3", 2416 | "php-cs-fixer/accessible-object": "^1.1", 2417 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", 2418 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", 2419 | "phpspec/prophecy": "^1.10.3", 2420 | "phpspec/prophecy-phpunit": "^1.1 || ^2.0", 2421 | "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5", 2422 | "phpunitgoodpractices/polyfill": "^1.5", 2423 | "phpunitgoodpractices/traits": "^1.9.1", 2424 | "symfony/phpunit-bridge": "^5.2.4", 2425 | "symfony/yaml": "^4.4.20 || ^5.0" 2426 | }, 2427 | "suggest": { 2428 | "ext-dom": "For handling output formats in XML", 2429 | "ext-mbstring": "For handling non-UTF8 characters.", 2430 | "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." 2431 | }, 2432 | "bin": [ 2433 | "php-cs-fixer" 2434 | ], 2435 | "type": "application", 2436 | "autoload": { 2437 | "psr-4": { 2438 | "PhpCsFixer\\": "src/" 2439 | } 2440 | }, 2441 | "notification-url": "https://packagist.org/downloads/", 2442 | "license": [ 2443 | "MIT" 2444 | ], 2445 | "authors": [ 2446 | { 2447 | "name": "Fabien Potencier", 2448 | "email": "fabien@symfony.com" 2449 | }, 2450 | { 2451 | "name": "Dariusz Rumiński", 2452 | "email": "dariusz.ruminski@gmail.com" 2453 | } 2454 | ], 2455 | "description": "A tool to automatically fix PHP code style", 2456 | "support": { 2457 | "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", 2458 | "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.0.0" 2459 | }, 2460 | "funding": [ 2461 | { 2462 | "url": "https://github.com/keradus", 2463 | "type": "github" 2464 | } 2465 | ], 2466 | "time": "2021-05-03T21:51:58+00:00" 2467 | }, 2468 | { 2469 | "name": "php-cs-fixer/diff", 2470 | "version": "v2.0.2", 2471 | "source": { 2472 | "type": "git", 2473 | "url": "https://github.com/PHP-CS-Fixer/diff.git", 2474 | "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3" 2475 | }, 2476 | "dist": { 2477 | "type": "zip", 2478 | "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3", 2479 | "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3", 2480 | "shasum": "" 2481 | }, 2482 | "require": { 2483 | "php": "^5.6 || ^7.0 || ^8.0" 2484 | }, 2485 | "require-dev": { 2486 | "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", 2487 | "symfony/process": "^3.3" 2488 | }, 2489 | "type": "library", 2490 | "autoload": { 2491 | "classmap": [ 2492 | "src/" 2493 | ] 2494 | }, 2495 | "notification-url": "https://packagist.org/downloads/", 2496 | "license": [ 2497 | "BSD-3-Clause" 2498 | ], 2499 | "authors": [ 2500 | { 2501 | "name": "Sebastian Bergmann", 2502 | "email": "sebastian@phpunit.de" 2503 | }, 2504 | { 2505 | "name": "Kore Nordmann", 2506 | "email": "mail@kore-nordmann.de" 2507 | } 2508 | ], 2509 | "description": "sebastian/diff v3 backport support for PHP 5.6+", 2510 | "homepage": "https://github.com/PHP-CS-Fixer", 2511 | "keywords": [ 2512 | "diff" 2513 | ], 2514 | "support": { 2515 | "issues": "https://github.com/PHP-CS-Fixer/diff/issues", 2516 | "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2" 2517 | }, 2518 | "time": "2020-10-14T08:32:19+00:00" 2519 | }, 2520 | { 2521 | "name": "phpstan/phpstan", 2522 | "version": "0.12.91", 2523 | "source": { 2524 | "type": "git", 2525 | "url": "https://github.com/phpstan/phpstan.git", 2526 | "reference": "8226701cd228a0d63c2df995de7ab6070c69ac6a" 2527 | }, 2528 | "dist": { 2529 | "type": "zip", 2530 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8226701cd228a0d63c2df995de7ab6070c69ac6a", 2531 | "reference": "8226701cd228a0d63c2df995de7ab6070c69ac6a", 2532 | "shasum": "" 2533 | }, 2534 | "require": { 2535 | "php": "^7.1|^8.0" 2536 | }, 2537 | "conflict": { 2538 | "phpstan/phpstan-shim": "*" 2539 | }, 2540 | "bin": [ 2541 | "phpstan", 2542 | "phpstan.phar" 2543 | ], 2544 | "type": "library", 2545 | "extra": { 2546 | "branch-alias": { 2547 | "dev-master": "0.12-dev" 2548 | } 2549 | }, 2550 | "autoload": { 2551 | "files": [ 2552 | "bootstrap.php" 2553 | ] 2554 | }, 2555 | "notification-url": "https://packagist.org/downloads/", 2556 | "license": [ 2557 | "MIT" 2558 | ], 2559 | "description": "PHPStan - PHP Static Analysis Tool", 2560 | "support": { 2561 | "issues": "https://github.com/phpstan/phpstan/issues", 2562 | "source": "https://github.com/phpstan/phpstan/tree/0.12.91" 2563 | }, 2564 | "funding": [ 2565 | { 2566 | "url": "https://github.com/ondrejmirtes", 2567 | "type": "github" 2568 | }, 2569 | { 2570 | "url": "https://github.com/phpstan", 2571 | "type": "github" 2572 | }, 2573 | { 2574 | "url": "https://www.patreon.com/phpstan", 2575 | "type": "patreon" 2576 | }, 2577 | { 2578 | "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", 2579 | "type": "tidelift" 2580 | } 2581 | ], 2582 | "time": "2021-07-04T15:31:48+00:00" 2583 | }, 2584 | { 2585 | "name": "psr/cache", 2586 | "version": "1.0.1", 2587 | "source": { 2588 | "type": "git", 2589 | "url": "https://github.com/php-fig/cache.git", 2590 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 2591 | }, 2592 | "dist": { 2593 | "type": "zip", 2594 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 2595 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 2596 | "shasum": "" 2597 | }, 2598 | "require": { 2599 | "php": ">=5.3.0" 2600 | }, 2601 | "type": "library", 2602 | "extra": { 2603 | "branch-alias": { 2604 | "dev-master": "1.0.x-dev" 2605 | } 2606 | }, 2607 | "autoload": { 2608 | "psr-4": { 2609 | "Psr\\Cache\\": "src/" 2610 | } 2611 | }, 2612 | "notification-url": "https://packagist.org/downloads/", 2613 | "license": [ 2614 | "MIT" 2615 | ], 2616 | "authors": [ 2617 | { 2618 | "name": "PHP-FIG", 2619 | "homepage": "http://www.php-fig.org/" 2620 | } 2621 | ], 2622 | "description": "Common interface for caching libraries", 2623 | "keywords": [ 2624 | "cache", 2625 | "psr", 2626 | "psr-6" 2627 | ], 2628 | "support": { 2629 | "source": "https://github.com/php-fig/cache/tree/master" 2630 | }, 2631 | "time": "2016-08-06T20:24:11+00:00" 2632 | }, 2633 | { 2634 | "name": "psr/event-dispatcher", 2635 | "version": "1.0.0", 2636 | "source": { 2637 | "type": "git", 2638 | "url": "https://github.com/php-fig/event-dispatcher.git", 2639 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 2640 | }, 2641 | "dist": { 2642 | "type": "zip", 2643 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 2644 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 2645 | "shasum": "" 2646 | }, 2647 | "require": { 2648 | "php": ">=7.2.0" 2649 | }, 2650 | "type": "library", 2651 | "extra": { 2652 | "branch-alias": { 2653 | "dev-master": "1.0.x-dev" 2654 | } 2655 | }, 2656 | "autoload": { 2657 | "psr-4": { 2658 | "Psr\\EventDispatcher\\": "src/" 2659 | } 2660 | }, 2661 | "notification-url": "https://packagist.org/downloads/", 2662 | "license": [ 2663 | "MIT" 2664 | ], 2665 | "authors": [ 2666 | { 2667 | "name": "PHP-FIG", 2668 | "homepage": "http://www.php-fig.org/" 2669 | } 2670 | ], 2671 | "description": "Standard interfaces for event handling.", 2672 | "keywords": [ 2673 | "events", 2674 | "psr", 2675 | "psr-14" 2676 | ], 2677 | "support": { 2678 | "issues": "https://github.com/php-fig/event-dispatcher/issues", 2679 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" 2680 | }, 2681 | "time": "2019-01-08T18:20:26+00:00" 2682 | }, 2683 | { 2684 | "name": "symfony/console", 2685 | "version": "v5.3.2", 2686 | "source": { 2687 | "type": "git", 2688 | "url": "https://github.com/symfony/console.git", 2689 | "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1" 2690 | }, 2691 | "dist": { 2692 | "type": "zip", 2693 | "url": "https://api.github.com/repos/symfony/console/zipball/649730483885ff2ca99ca0560ef0e5f6b03f2ac1", 2694 | "reference": "649730483885ff2ca99ca0560ef0e5f6b03f2ac1", 2695 | "shasum": "" 2696 | }, 2697 | "require": { 2698 | "php": ">=7.2.5", 2699 | "symfony/deprecation-contracts": "^2.1", 2700 | "symfony/polyfill-mbstring": "~1.0", 2701 | "symfony/polyfill-php73": "^1.8", 2702 | "symfony/polyfill-php80": "^1.15", 2703 | "symfony/service-contracts": "^1.1|^2", 2704 | "symfony/string": "^5.1" 2705 | }, 2706 | "conflict": { 2707 | "symfony/dependency-injection": "<4.4", 2708 | "symfony/dotenv": "<5.1", 2709 | "symfony/event-dispatcher": "<4.4", 2710 | "symfony/lock": "<4.4", 2711 | "symfony/process": "<4.4" 2712 | }, 2713 | "provide": { 2714 | "psr/log-implementation": "1.0" 2715 | }, 2716 | "require-dev": { 2717 | "psr/log": "~1.0", 2718 | "symfony/config": "^4.4|^5.0", 2719 | "symfony/dependency-injection": "^4.4|^5.0", 2720 | "symfony/event-dispatcher": "^4.4|^5.0", 2721 | "symfony/lock": "^4.4|^5.0", 2722 | "symfony/process": "^4.4|^5.0", 2723 | "symfony/var-dumper": "^4.4|^5.0" 2724 | }, 2725 | "suggest": { 2726 | "psr/log": "For using the console logger", 2727 | "symfony/event-dispatcher": "", 2728 | "symfony/lock": "", 2729 | "symfony/process": "" 2730 | }, 2731 | "type": "library", 2732 | "autoload": { 2733 | "psr-4": { 2734 | "Symfony\\Component\\Console\\": "" 2735 | }, 2736 | "exclude-from-classmap": [ 2737 | "/Tests/" 2738 | ] 2739 | }, 2740 | "notification-url": "https://packagist.org/downloads/", 2741 | "license": [ 2742 | "MIT" 2743 | ], 2744 | "authors": [ 2745 | { 2746 | "name": "Fabien Potencier", 2747 | "email": "fabien@symfony.com" 2748 | }, 2749 | { 2750 | "name": "Symfony Community", 2751 | "homepage": "https://symfony.com/contributors" 2752 | } 2753 | ], 2754 | "description": "Eases the creation of beautiful and testable command line interfaces", 2755 | "homepage": "https://symfony.com", 2756 | "keywords": [ 2757 | "cli", 2758 | "command line", 2759 | "console", 2760 | "terminal" 2761 | ], 2762 | "support": { 2763 | "source": "https://github.com/symfony/console/tree/v5.3.2" 2764 | }, 2765 | "funding": [ 2766 | { 2767 | "url": "https://symfony.com/sponsor", 2768 | "type": "custom" 2769 | }, 2770 | { 2771 | "url": "https://github.com/fabpot", 2772 | "type": "github" 2773 | }, 2774 | { 2775 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2776 | "type": "tidelift" 2777 | } 2778 | ], 2779 | "time": "2021-06-12T09:42:48+00:00" 2780 | }, 2781 | { 2782 | "name": "symfony/deprecation-contracts", 2783 | "version": "v2.4.0", 2784 | "source": { 2785 | "type": "git", 2786 | "url": "https://github.com/symfony/deprecation-contracts.git", 2787 | "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" 2788 | }, 2789 | "dist": { 2790 | "type": "zip", 2791 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", 2792 | "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", 2793 | "shasum": "" 2794 | }, 2795 | "require": { 2796 | "php": ">=7.1" 2797 | }, 2798 | "type": "library", 2799 | "extra": { 2800 | "branch-alias": { 2801 | "dev-main": "2.4-dev" 2802 | }, 2803 | "thanks": { 2804 | "name": "symfony/contracts", 2805 | "url": "https://github.com/symfony/contracts" 2806 | } 2807 | }, 2808 | "autoload": { 2809 | "files": [ 2810 | "function.php" 2811 | ] 2812 | }, 2813 | "notification-url": "https://packagist.org/downloads/", 2814 | "license": [ 2815 | "MIT" 2816 | ], 2817 | "authors": [ 2818 | { 2819 | "name": "Nicolas Grekas", 2820 | "email": "p@tchwork.com" 2821 | }, 2822 | { 2823 | "name": "Symfony Community", 2824 | "homepage": "https://symfony.com/contributors" 2825 | } 2826 | ], 2827 | "description": "A generic function and convention to trigger deprecation notices", 2828 | "homepage": "https://symfony.com", 2829 | "support": { 2830 | "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" 2831 | }, 2832 | "funding": [ 2833 | { 2834 | "url": "https://symfony.com/sponsor", 2835 | "type": "custom" 2836 | }, 2837 | { 2838 | "url": "https://github.com/fabpot", 2839 | "type": "github" 2840 | }, 2841 | { 2842 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2843 | "type": "tidelift" 2844 | } 2845 | ], 2846 | "time": "2021-03-23T23:28:01+00:00" 2847 | }, 2848 | { 2849 | "name": "symfony/event-dispatcher", 2850 | "version": "v5.3.0", 2851 | "source": { 2852 | "type": "git", 2853 | "url": "https://github.com/symfony/event-dispatcher.git", 2854 | "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" 2855 | }, 2856 | "dist": { 2857 | "type": "zip", 2858 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", 2859 | "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", 2860 | "shasum": "" 2861 | }, 2862 | "require": { 2863 | "php": ">=7.2.5", 2864 | "symfony/deprecation-contracts": "^2.1", 2865 | "symfony/event-dispatcher-contracts": "^2", 2866 | "symfony/polyfill-php80": "^1.15" 2867 | }, 2868 | "conflict": { 2869 | "symfony/dependency-injection": "<4.4" 2870 | }, 2871 | "provide": { 2872 | "psr/event-dispatcher-implementation": "1.0", 2873 | "symfony/event-dispatcher-implementation": "2.0" 2874 | }, 2875 | "require-dev": { 2876 | "psr/log": "~1.0", 2877 | "symfony/config": "^4.4|^5.0", 2878 | "symfony/dependency-injection": "^4.4|^5.0", 2879 | "symfony/error-handler": "^4.4|^5.0", 2880 | "symfony/expression-language": "^4.4|^5.0", 2881 | "symfony/http-foundation": "^4.4|^5.0", 2882 | "symfony/service-contracts": "^1.1|^2", 2883 | "symfony/stopwatch": "^4.4|^5.0" 2884 | }, 2885 | "suggest": { 2886 | "symfony/dependency-injection": "", 2887 | "symfony/http-kernel": "" 2888 | }, 2889 | "type": "library", 2890 | "autoload": { 2891 | "psr-4": { 2892 | "Symfony\\Component\\EventDispatcher\\": "" 2893 | }, 2894 | "exclude-from-classmap": [ 2895 | "/Tests/" 2896 | ] 2897 | }, 2898 | "notification-url": "https://packagist.org/downloads/", 2899 | "license": [ 2900 | "MIT" 2901 | ], 2902 | "authors": [ 2903 | { 2904 | "name": "Fabien Potencier", 2905 | "email": "fabien@symfony.com" 2906 | }, 2907 | { 2908 | "name": "Symfony Community", 2909 | "homepage": "https://symfony.com/contributors" 2910 | } 2911 | ], 2912 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 2913 | "homepage": "https://symfony.com", 2914 | "support": { 2915 | "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" 2916 | }, 2917 | "funding": [ 2918 | { 2919 | "url": "https://symfony.com/sponsor", 2920 | "type": "custom" 2921 | }, 2922 | { 2923 | "url": "https://github.com/fabpot", 2924 | "type": "github" 2925 | }, 2926 | { 2927 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2928 | "type": "tidelift" 2929 | } 2930 | ], 2931 | "time": "2021-05-26T17:43:10+00:00" 2932 | }, 2933 | { 2934 | "name": "symfony/event-dispatcher-contracts", 2935 | "version": "v2.4.0", 2936 | "source": { 2937 | "type": "git", 2938 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 2939 | "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" 2940 | }, 2941 | "dist": { 2942 | "type": "zip", 2943 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", 2944 | "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", 2945 | "shasum": "" 2946 | }, 2947 | "require": { 2948 | "php": ">=7.2.5", 2949 | "psr/event-dispatcher": "^1" 2950 | }, 2951 | "suggest": { 2952 | "symfony/event-dispatcher-implementation": "" 2953 | }, 2954 | "type": "library", 2955 | "extra": { 2956 | "branch-alias": { 2957 | "dev-main": "2.4-dev" 2958 | }, 2959 | "thanks": { 2960 | "name": "symfony/contracts", 2961 | "url": "https://github.com/symfony/contracts" 2962 | } 2963 | }, 2964 | "autoload": { 2965 | "psr-4": { 2966 | "Symfony\\Contracts\\EventDispatcher\\": "" 2967 | } 2968 | }, 2969 | "notification-url": "https://packagist.org/downloads/", 2970 | "license": [ 2971 | "MIT" 2972 | ], 2973 | "authors": [ 2974 | { 2975 | "name": "Nicolas Grekas", 2976 | "email": "p@tchwork.com" 2977 | }, 2978 | { 2979 | "name": "Symfony Community", 2980 | "homepage": "https://symfony.com/contributors" 2981 | } 2982 | ], 2983 | "description": "Generic abstractions related to dispatching event", 2984 | "homepage": "https://symfony.com", 2985 | "keywords": [ 2986 | "abstractions", 2987 | "contracts", 2988 | "decoupling", 2989 | "interfaces", 2990 | "interoperability", 2991 | "standards" 2992 | ], 2993 | "support": { 2994 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" 2995 | }, 2996 | "funding": [ 2997 | { 2998 | "url": "https://symfony.com/sponsor", 2999 | "type": "custom" 3000 | }, 3001 | { 3002 | "url": "https://github.com/fabpot", 3003 | "type": "github" 3004 | }, 3005 | { 3006 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3007 | "type": "tidelift" 3008 | } 3009 | ], 3010 | "time": "2021-03-23T23:28:01+00:00" 3011 | }, 3012 | { 3013 | "name": "symfony/filesystem", 3014 | "version": "v5.3.3", 3015 | "source": { 3016 | "type": "git", 3017 | "url": "https://github.com/symfony/filesystem.git", 3018 | "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9" 3019 | }, 3020 | "dist": { 3021 | "type": "zip", 3022 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/19b71c8f313b411172dd5f470fd61f24466d79a9", 3023 | "reference": "19b71c8f313b411172dd5f470fd61f24466d79a9", 3024 | "shasum": "" 3025 | }, 3026 | "require": { 3027 | "php": ">=7.2.5", 3028 | "symfony/polyfill-ctype": "~1.8" 3029 | }, 3030 | "type": "library", 3031 | "autoload": { 3032 | "psr-4": { 3033 | "Symfony\\Component\\Filesystem\\": "" 3034 | }, 3035 | "exclude-from-classmap": [ 3036 | "/Tests/" 3037 | ] 3038 | }, 3039 | "notification-url": "https://packagist.org/downloads/", 3040 | "license": [ 3041 | "MIT" 3042 | ], 3043 | "authors": [ 3044 | { 3045 | "name": "Fabien Potencier", 3046 | "email": "fabien@symfony.com" 3047 | }, 3048 | { 3049 | "name": "Symfony Community", 3050 | "homepage": "https://symfony.com/contributors" 3051 | } 3052 | ], 3053 | "description": "Provides basic utilities for the filesystem", 3054 | "homepage": "https://symfony.com", 3055 | "support": { 3056 | "source": "https://github.com/symfony/filesystem/tree/v5.3.3" 3057 | }, 3058 | "funding": [ 3059 | { 3060 | "url": "https://symfony.com/sponsor", 3061 | "type": "custom" 3062 | }, 3063 | { 3064 | "url": "https://github.com/fabpot", 3065 | "type": "github" 3066 | }, 3067 | { 3068 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3069 | "type": "tidelift" 3070 | } 3071 | ], 3072 | "time": "2021-06-30T07:27:52+00:00" 3073 | }, 3074 | { 3075 | "name": "symfony/finder", 3076 | "version": "v5.3.0", 3077 | "source": { 3078 | "type": "git", 3079 | "url": "https://github.com/symfony/finder.git", 3080 | "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" 3081 | }, 3082 | "dist": { 3083 | "type": "zip", 3084 | "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", 3085 | "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", 3086 | "shasum": "" 3087 | }, 3088 | "require": { 3089 | "php": ">=7.2.5" 3090 | }, 3091 | "type": "library", 3092 | "autoload": { 3093 | "psr-4": { 3094 | "Symfony\\Component\\Finder\\": "" 3095 | }, 3096 | "exclude-from-classmap": [ 3097 | "/Tests/" 3098 | ] 3099 | }, 3100 | "notification-url": "https://packagist.org/downloads/", 3101 | "license": [ 3102 | "MIT" 3103 | ], 3104 | "authors": [ 3105 | { 3106 | "name": "Fabien Potencier", 3107 | "email": "fabien@symfony.com" 3108 | }, 3109 | { 3110 | "name": "Symfony Community", 3111 | "homepage": "https://symfony.com/contributors" 3112 | } 3113 | ], 3114 | "description": "Finds files and directories via an intuitive fluent interface", 3115 | "homepage": "https://symfony.com", 3116 | "support": { 3117 | "source": "https://github.com/symfony/finder/tree/v5.3.0" 3118 | }, 3119 | "funding": [ 3120 | { 3121 | "url": "https://symfony.com/sponsor", 3122 | "type": "custom" 3123 | }, 3124 | { 3125 | "url": "https://github.com/fabpot", 3126 | "type": "github" 3127 | }, 3128 | { 3129 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3130 | "type": "tidelift" 3131 | } 3132 | ], 3133 | "time": "2021-05-26T12:52:38+00:00" 3134 | }, 3135 | { 3136 | "name": "symfony/options-resolver", 3137 | "version": "v5.3.0", 3138 | "source": { 3139 | "type": "git", 3140 | "url": "https://github.com/symfony/options-resolver.git", 3141 | "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" 3142 | }, 3143 | "dist": { 3144 | "type": "zip", 3145 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", 3146 | "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", 3147 | "shasum": "" 3148 | }, 3149 | "require": { 3150 | "php": ">=7.2.5", 3151 | "symfony/deprecation-contracts": "^2.1", 3152 | "symfony/polyfill-php73": "~1.0", 3153 | "symfony/polyfill-php80": "^1.15" 3154 | }, 3155 | "type": "library", 3156 | "autoload": { 3157 | "psr-4": { 3158 | "Symfony\\Component\\OptionsResolver\\": "" 3159 | }, 3160 | "exclude-from-classmap": [ 3161 | "/Tests/" 3162 | ] 3163 | }, 3164 | "notification-url": "https://packagist.org/downloads/", 3165 | "license": [ 3166 | "MIT" 3167 | ], 3168 | "authors": [ 3169 | { 3170 | "name": "Fabien Potencier", 3171 | "email": "fabien@symfony.com" 3172 | }, 3173 | { 3174 | "name": "Symfony Community", 3175 | "homepage": "https://symfony.com/contributors" 3176 | } 3177 | ], 3178 | "description": "Provides an improved replacement for the array_replace PHP function", 3179 | "homepage": "https://symfony.com", 3180 | "keywords": [ 3181 | "config", 3182 | "configuration", 3183 | "options" 3184 | ], 3185 | "support": { 3186 | "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" 3187 | }, 3188 | "funding": [ 3189 | { 3190 | "url": "https://symfony.com/sponsor", 3191 | "type": "custom" 3192 | }, 3193 | { 3194 | "url": "https://github.com/fabpot", 3195 | "type": "github" 3196 | }, 3197 | { 3198 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3199 | "type": "tidelift" 3200 | } 3201 | ], 3202 | "time": "2021-05-26T17:43:10+00:00" 3203 | }, 3204 | { 3205 | "name": "symfony/polyfill-ctype", 3206 | "version": "v1.23.0", 3207 | "source": { 3208 | "type": "git", 3209 | "url": "https://github.com/symfony/polyfill-ctype.git", 3210 | "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" 3211 | }, 3212 | "dist": { 3213 | "type": "zip", 3214 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", 3215 | "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", 3216 | "shasum": "" 3217 | }, 3218 | "require": { 3219 | "php": ">=7.1" 3220 | }, 3221 | "suggest": { 3222 | "ext-ctype": "For best performance" 3223 | }, 3224 | "type": "library", 3225 | "extra": { 3226 | "branch-alias": { 3227 | "dev-main": "1.23-dev" 3228 | }, 3229 | "thanks": { 3230 | "name": "symfony/polyfill", 3231 | "url": "https://github.com/symfony/polyfill" 3232 | } 3233 | }, 3234 | "autoload": { 3235 | "psr-4": { 3236 | "Symfony\\Polyfill\\Ctype\\": "" 3237 | }, 3238 | "files": [ 3239 | "bootstrap.php" 3240 | ] 3241 | }, 3242 | "notification-url": "https://packagist.org/downloads/", 3243 | "license": [ 3244 | "MIT" 3245 | ], 3246 | "authors": [ 3247 | { 3248 | "name": "Gert de Pagter", 3249 | "email": "BackEndTea@gmail.com" 3250 | }, 3251 | { 3252 | "name": "Symfony Community", 3253 | "homepage": "https://symfony.com/contributors" 3254 | } 3255 | ], 3256 | "description": "Symfony polyfill for ctype functions", 3257 | "homepage": "https://symfony.com", 3258 | "keywords": [ 3259 | "compatibility", 3260 | "ctype", 3261 | "polyfill", 3262 | "portable" 3263 | ], 3264 | "support": { 3265 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" 3266 | }, 3267 | "funding": [ 3268 | { 3269 | "url": "https://symfony.com/sponsor", 3270 | "type": "custom" 3271 | }, 3272 | { 3273 | "url": "https://github.com/fabpot", 3274 | "type": "github" 3275 | }, 3276 | { 3277 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3278 | "type": "tidelift" 3279 | } 3280 | ], 3281 | "time": "2021-02-19T12:13:01+00:00" 3282 | }, 3283 | { 3284 | "name": "symfony/polyfill-intl-grapheme", 3285 | "version": "v1.23.0", 3286 | "source": { 3287 | "type": "git", 3288 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 3289 | "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" 3290 | }, 3291 | "dist": { 3292 | "type": "zip", 3293 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", 3294 | "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", 3295 | "shasum": "" 3296 | }, 3297 | "require": { 3298 | "php": ">=7.1" 3299 | }, 3300 | "suggest": { 3301 | "ext-intl": "For best performance" 3302 | }, 3303 | "type": "library", 3304 | "extra": { 3305 | "branch-alias": { 3306 | "dev-main": "1.23-dev" 3307 | }, 3308 | "thanks": { 3309 | "name": "symfony/polyfill", 3310 | "url": "https://github.com/symfony/polyfill" 3311 | } 3312 | }, 3313 | "autoload": { 3314 | "psr-4": { 3315 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 3316 | }, 3317 | "files": [ 3318 | "bootstrap.php" 3319 | ] 3320 | }, 3321 | "notification-url": "https://packagist.org/downloads/", 3322 | "license": [ 3323 | "MIT" 3324 | ], 3325 | "authors": [ 3326 | { 3327 | "name": "Nicolas Grekas", 3328 | "email": "p@tchwork.com" 3329 | }, 3330 | { 3331 | "name": "Symfony Community", 3332 | "homepage": "https://symfony.com/contributors" 3333 | } 3334 | ], 3335 | "description": "Symfony polyfill for intl's grapheme_* functions", 3336 | "homepage": "https://symfony.com", 3337 | "keywords": [ 3338 | "compatibility", 3339 | "grapheme", 3340 | "intl", 3341 | "polyfill", 3342 | "portable", 3343 | "shim" 3344 | ], 3345 | "support": { 3346 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" 3347 | }, 3348 | "funding": [ 3349 | { 3350 | "url": "https://symfony.com/sponsor", 3351 | "type": "custom" 3352 | }, 3353 | { 3354 | "url": "https://github.com/fabpot", 3355 | "type": "github" 3356 | }, 3357 | { 3358 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3359 | "type": "tidelift" 3360 | } 3361 | ], 3362 | "time": "2021-05-27T09:17:38+00:00" 3363 | }, 3364 | { 3365 | "name": "symfony/polyfill-intl-normalizer", 3366 | "version": "v1.23.0", 3367 | "source": { 3368 | "type": "git", 3369 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 3370 | "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" 3371 | }, 3372 | "dist": { 3373 | "type": "zip", 3374 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", 3375 | "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", 3376 | "shasum": "" 3377 | }, 3378 | "require": { 3379 | "php": ">=7.1" 3380 | }, 3381 | "suggest": { 3382 | "ext-intl": "For best performance" 3383 | }, 3384 | "type": "library", 3385 | "extra": { 3386 | "branch-alias": { 3387 | "dev-main": "1.23-dev" 3388 | }, 3389 | "thanks": { 3390 | "name": "symfony/polyfill", 3391 | "url": "https://github.com/symfony/polyfill" 3392 | } 3393 | }, 3394 | "autoload": { 3395 | "psr-4": { 3396 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 3397 | }, 3398 | "files": [ 3399 | "bootstrap.php" 3400 | ], 3401 | "classmap": [ 3402 | "Resources/stubs" 3403 | ] 3404 | }, 3405 | "notification-url": "https://packagist.org/downloads/", 3406 | "license": [ 3407 | "MIT" 3408 | ], 3409 | "authors": [ 3410 | { 3411 | "name": "Nicolas Grekas", 3412 | "email": "p@tchwork.com" 3413 | }, 3414 | { 3415 | "name": "Symfony Community", 3416 | "homepage": "https://symfony.com/contributors" 3417 | } 3418 | ], 3419 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 3420 | "homepage": "https://symfony.com", 3421 | "keywords": [ 3422 | "compatibility", 3423 | "intl", 3424 | "normalizer", 3425 | "polyfill", 3426 | "portable", 3427 | "shim" 3428 | ], 3429 | "support": { 3430 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" 3431 | }, 3432 | "funding": [ 3433 | { 3434 | "url": "https://symfony.com/sponsor", 3435 | "type": "custom" 3436 | }, 3437 | { 3438 | "url": "https://github.com/fabpot", 3439 | "type": "github" 3440 | }, 3441 | { 3442 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3443 | "type": "tidelift" 3444 | } 3445 | ], 3446 | "time": "2021-02-19T12:13:01+00:00" 3447 | }, 3448 | { 3449 | "name": "symfony/polyfill-mbstring", 3450 | "version": "v1.23.0", 3451 | "source": { 3452 | "type": "git", 3453 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3454 | "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" 3455 | }, 3456 | "dist": { 3457 | "type": "zip", 3458 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", 3459 | "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", 3460 | "shasum": "" 3461 | }, 3462 | "require": { 3463 | "php": ">=7.1" 3464 | }, 3465 | "suggest": { 3466 | "ext-mbstring": "For best performance" 3467 | }, 3468 | "type": "library", 3469 | "extra": { 3470 | "branch-alias": { 3471 | "dev-main": "1.23-dev" 3472 | }, 3473 | "thanks": { 3474 | "name": "symfony/polyfill", 3475 | "url": "https://github.com/symfony/polyfill" 3476 | } 3477 | }, 3478 | "autoload": { 3479 | "psr-4": { 3480 | "Symfony\\Polyfill\\Mbstring\\": "" 3481 | }, 3482 | "files": [ 3483 | "bootstrap.php" 3484 | ] 3485 | }, 3486 | "notification-url": "https://packagist.org/downloads/", 3487 | "license": [ 3488 | "MIT" 3489 | ], 3490 | "authors": [ 3491 | { 3492 | "name": "Nicolas Grekas", 3493 | "email": "p@tchwork.com" 3494 | }, 3495 | { 3496 | "name": "Symfony Community", 3497 | "homepage": "https://symfony.com/contributors" 3498 | } 3499 | ], 3500 | "description": "Symfony polyfill for the Mbstring extension", 3501 | "homepage": "https://symfony.com", 3502 | "keywords": [ 3503 | "compatibility", 3504 | "mbstring", 3505 | "polyfill", 3506 | "portable", 3507 | "shim" 3508 | ], 3509 | "support": { 3510 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" 3511 | }, 3512 | "funding": [ 3513 | { 3514 | "url": "https://symfony.com/sponsor", 3515 | "type": "custom" 3516 | }, 3517 | { 3518 | "url": "https://github.com/fabpot", 3519 | "type": "github" 3520 | }, 3521 | { 3522 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3523 | "type": "tidelift" 3524 | } 3525 | ], 3526 | "time": "2021-05-27T09:27:20+00:00" 3527 | }, 3528 | { 3529 | "name": "symfony/polyfill-php72", 3530 | "version": "v1.23.0", 3531 | "source": { 3532 | "type": "git", 3533 | "url": "https://github.com/symfony/polyfill-php72.git", 3534 | "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" 3535 | }, 3536 | "dist": { 3537 | "type": "zip", 3538 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", 3539 | "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", 3540 | "shasum": "" 3541 | }, 3542 | "require": { 3543 | "php": ">=7.1" 3544 | }, 3545 | "type": "library", 3546 | "extra": { 3547 | "branch-alias": { 3548 | "dev-main": "1.23-dev" 3549 | }, 3550 | "thanks": { 3551 | "name": "symfony/polyfill", 3552 | "url": "https://github.com/symfony/polyfill" 3553 | } 3554 | }, 3555 | "autoload": { 3556 | "psr-4": { 3557 | "Symfony\\Polyfill\\Php72\\": "" 3558 | }, 3559 | "files": [ 3560 | "bootstrap.php" 3561 | ] 3562 | }, 3563 | "notification-url": "https://packagist.org/downloads/", 3564 | "license": [ 3565 | "MIT" 3566 | ], 3567 | "authors": [ 3568 | { 3569 | "name": "Nicolas Grekas", 3570 | "email": "p@tchwork.com" 3571 | }, 3572 | { 3573 | "name": "Symfony Community", 3574 | "homepage": "https://symfony.com/contributors" 3575 | } 3576 | ], 3577 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 3578 | "homepage": "https://symfony.com", 3579 | "keywords": [ 3580 | "compatibility", 3581 | "polyfill", 3582 | "portable", 3583 | "shim" 3584 | ], 3585 | "support": { 3586 | "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" 3587 | }, 3588 | "funding": [ 3589 | { 3590 | "url": "https://symfony.com/sponsor", 3591 | "type": "custom" 3592 | }, 3593 | { 3594 | "url": "https://github.com/fabpot", 3595 | "type": "github" 3596 | }, 3597 | { 3598 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3599 | "type": "tidelift" 3600 | } 3601 | ], 3602 | "time": "2021-05-27T09:17:38+00:00" 3603 | }, 3604 | { 3605 | "name": "symfony/polyfill-php73", 3606 | "version": "v1.23.0", 3607 | "source": { 3608 | "type": "git", 3609 | "url": "https://github.com/symfony/polyfill-php73.git", 3610 | "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" 3611 | }, 3612 | "dist": { 3613 | "type": "zip", 3614 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", 3615 | "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", 3616 | "shasum": "" 3617 | }, 3618 | "require": { 3619 | "php": ">=7.1" 3620 | }, 3621 | "type": "library", 3622 | "extra": { 3623 | "branch-alias": { 3624 | "dev-main": "1.23-dev" 3625 | }, 3626 | "thanks": { 3627 | "name": "symfony/polyfill", 3628 | "url": "https://github.com/symfony/polyfill" 3629 | } 3630 | }, 3631 | "autoload": { 3632 | "psr-4": { 3633 | "Symfony\\Polyfill\\Php73\\": "" 3634 | }, 3635 | "files": [ 3636 | "bootstrap.php" 3637 | ], 3638 | "classmap": [ 3639 | "Resources/stubs" 3640 | ] 3641 | }, 3642 | "notification-url": "https://packagist.org/downloads/", 3643 | "license": [ 3644 | "MIT" 3645 | ], 3646 | "authors": [ 3647 | { 3648 | "name": "Nicolas Grekas", 3649 | "email": "p@tchwork.com" 3650 | }, 3651 | { 3652 | "name": "Symfony Community", 3653 | "homepage": "https://symfony.com/contributors" 3654 | } 3655 | ], 3656 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 3657 | "homepage": "https://symfony.com", 3658 | "keywords": [ 3659 | "compatibility", 3660 | "polyfill", 3661 | "portable", 3662 | "shim" 3663 | ], 3664 | "support": { 3665 | "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" 3666 | }, 3667 | "funding": [ 3668 | { 3669 | "url": "https://symfony.com/sponsor", 3670 | "type": "custom" 3671 | }, 3672 | { 3673 | "url": "https://github.com/fabpot", 3674 | "type": "github" 3675 | }, 3676 | { 3677 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3678 | "type": "tidelift" 3679 | } 3680 | ], 3681 | "time": "2021-02-19T12:13:01+00:00" 3682 | }, 3683 | { 3684 | "name": "symfony/polyfill-php80", 3685 | "version": "v1.23.0", 3686 | "source": { 3687 | "type": "git", 3688 | "url": "https://github.com/symfony/polyfill-php80.git", 3689 | "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" 3690 | }, 3691 | "dist": { 3692 | "type": "zip", 3693 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", 3694 | "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", 3695 | "shasum": "" 3696 | }, 3697 | "require": { 3698 | "php": ">=7.1" 3699 | }, 3700 | "type": "library", 3701 | "extra": { 3702 | "branch-alias": { 3703 | "dev-main": "1.23-dev" 3704 | }, 3705 | "thanks": { 3706 | "name": "symfony/polyfill", 3707 | "url": "https://github.com/symfony/polyfill" 3708 | } 3709 | }, 3710 | "autoload": { 3711 | "psr-4": { 3712 | "Symfony\\Polyfill\\Php80\\": "" 3713 | }, 3714 | "files": [ 3715 | "bootstrap.php" 3716 | ], 3717 | "classmap": [ 3718 | "Resources/stubs" 3719 | ] 3720 | }, 3721 | "notification-url": "https://packagist.org/downloads/", 3722 | "license": [ 3723 | "MIT" 3724 | ], 3725 | "authors": [ 3726 | { 3727 | "name": "Ion Bazan", 3728 | "email": "ion.bazan@gmail.com" 3729 | }, 3730 | { 3731 | "name": "Nicolas Grekas", 3732 | "email": "p@tchwork.com" 3733 | }, 3734 | { 3735 | "name": "Symfony Community", 3736 | "homepage": "https://symfony.com/contributors" 3737 | } 3738 | ], 3739 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 3740 | "homepage": "https://symfony.com", 3741 | "keywords": [ 3742 | "compatibility", 3743 | "polyfill", 3744 | "portable", 3745 | "shim" 3746 | ], 3747 | "support": { 3748 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" 3749 | }, 3750 | "funding": [ 3751 | { 3752 | "url": "https://symfony.com/sponsor", 3753 | "type": "custom" 3754 | }, 3755 | { 3756 | "url": "https://github.com/fabpot", 3757 | "type": "github" 3758 | }, 3759 | { 3760 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3761 | "type": "tidelift" 3762 | } 3763 | ], 3764 | "time": "2021-02-19T12:13:01+00:00" 3765 | }, 3766 | { 3767 | "name": "symfony/process", 3768 | "version": "v5.3.2", 3769 | "source": { 3770 | "type": "git", 3771 | "url": "https://github.com/symfony/process.git", 3772 | "reference": "714b47f9196de61a196d86c4bad5f09201b307df" 3773 | }, 3774 | "dist": { 3775 | "type": "zip", 3776 | "url": "https://api.github.com/repos/symfony/process/zipball/714b47f9196de61a196d86c4bad5f09201b307df", 3777 | "reference": "714b47f9196de61a196d86c4bad5f09201b307df", 3778 | "shasum": "" 3779 | }, 3780 | "require": { 3781 | "php": ">=7.2.5", 3782 | "symfony/polyfill-php80": "^1.15" 3783 | }, 3784 | "type": "library", 3785 | "autoload": { 3786 | "psr-4": { 3787 | "Symfony\\Component\\Process\\": "" 3788 | }, 3789 | "exclude-from-classmap": [ 3790 | "/Tests/" 3791 | ] 3792 | }, 3793 | "notification-url": "https://packagist.org/downloads/", 3794 | "license": [ 3795 | "MIT" 3796 | ], 3797 | "authors": [ 3798 | { 3799 | "name": "Fabien Potencier", 3800 | "email": "fabien@symfony.com" 3801 | }, 3802 | { 3803 | "name": "Symfony Community", 3804 | "homepage": "https://symfony.com/contributors" 3805 | } 3806 | ], 3807 | "description": "Executes commands in sub-processes", 3808 | "homepage": "https://symfony.com", 3809 | "support": { 3810 | "source": "https://github.com/symfony/process/tree/v5.3.2" 3811 | }, 3812 | "funding": [ 3813 | { 3814 | "url": "https://symfony.com/sponsor", 3815 | "type": "custom" 3816 | }, 3817 | { 3818 | "url": "https://github.com/fabpot", 3819 | "type": "github" 3820 | }, 3821 | { 3822 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3823 | "type": "tidelift" 3824 | } 3825 | ], 3826 | "time": "2021-06-12T10:15:01+00:00" 3827 | }, 3828 | { 3829 | "name": "symfony/service-contracts", 3830 | "version": "v2.4.0", 3831 | "source": { 3832 | "type": "git", 3833 | "url": "https://github.com/symfony/service-contracts.git", 3834 | "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" 3835 | }, 3836 | "dist": { 3837 | "type": "zip", 3838 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", 3839 | "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", 3840 | "shasum": "" 3841 | }, 3842 | "require": { 3843 | "php": ">=7.2.5", 3844 | "psr/container": "^1.1" 3845 | }, 3846 | "suggest": { 3847 | "symfony/service-implementation": "" 3848 | }, 3849 | "type": "library", 3850 | "extra": { 3851 | "branch-alias": { 3852 | "dev-main": "2.4-dev" 3853 | }, 3854 | "thanks": { 3855 | "name": "symfony/contracts", 3856 | "url": "https://github.com/symfony/contracts" 3857 | } 3858 | }, 3859 | "autoload": { 3860 | "psr-4": { 3861 | "Symfony\\Contracts\\Service\\": "" 3862 | } 3863 | }, 3864 | "notification-url": "https://packagist.org/downloads/", 3865 | "license": [ 3866 | "MIT" 3867 | ], 3868 | "authors": [ 3869 | { 3870 | "name": "Nicolas Grekas", 3871 | "email": "p@tchwork.com" 3872 | }, 3873 | { 3874 | "name": "Symfony Community", 3875 | "homepage": "https://symfony.com/contributors" 3876 | } 3877 | ], 3878 | "description": "Generic abstractions related to writing services", 3879 | "homepage": "https://symfony.com", 3880 | "keywords": [ 3881 | "abstractions", 3882 | "contracts", 3883 | "decoupling", 3884 | "interfaces", 3885 | "interoperability", 3886 | "standards" 3887 | ], 3888 | "support": { 3889 | "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" 3890 | }, 3891 | "funding": [ 3892 | { 3893 | "url": "https://symfony.com/sponsor", 3894 | "type": "custom" 3895 | }, 3896 | { 3897 | "url": "https://github.com/fabpot", 3898 | "type": "github" 3899 | }, 3900 | { 3901 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3902 | "type": "tidelift" 3903 | } 3904 | ], 3905 | "time": "2021-04-01T10:43:52+00:00" 3906 | }, 3907 | { 3908 | "name": "symfony/stopwatch", 3909 | "version": "v5.3.0", 3910 | "source": { 3911 | "type": "git", 3912 | "url": "https://github.com/symfony/stopwatch.git", 3913 | "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" 3914 | }, 3915 | "dist": { 3916 | "type": "zip", 3917 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", 3918 | "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", 3919 | "shasum": "" 3920 | }, 3921 | "require": { 3922 | "php": ">=7.2.5", 3923 | "symfony/service-contracts": "^1.0|^2" 3924 | }, 3925 | "type": "library", 3926 | "autoload": { 3927 | "psr-4": { 3928 | "Symfony\\Component\\Stopwatch\\": "" 3929 | }, 3930 | "exclude-from-classmap": [ 3931 | "/Tests/" 3932 | ] 3933 | }, 3934 | "notification-url": "https://packagist.org/downloads/", 3935 | "license": [ 3936 | "MIT" 3937 | ], 3938 | "authors": [ 3939 | { 3940 | "name": "Fabien Potencier", 3941 | "email": "fabien@symfony.com" 3942 | }, 3943 | { 3944 | "name": "Symfony Community", 3945 | "homepage": "https://symfony.com/contributors" 3946 | } 3947 | ], 3948 | "description": "Provides a way to profile code", 3949 | "homepage": "https://symfony.com", 3950 | "support": { 3951 | "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" 3952 | }, 3953 | "funding": [ 3954 | { 3955 | "url": "https://symfony.com/sponsor", 3956 | "type": "custom" 3957 | }, 3958 | { 3959 | "url": "https://github.com/fabpot", 3960 | "type": "github" 3961 | }, 3962 | { 3963 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3964 | "type": "tidelift" 3965 | } 3966 | ], 3967 | "time": "2021-05-26T17:43:10+00:00" 3968 | }, 3969 | { 3970 | "name": "symfony/string", 3971 | "version": "v5.3.3", 3972 | "source": { 3973 | "type": "git", 3974 | "url": "https://github.com/symfony/string.git", 3975 | "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" 3976 | }, 3977 | "dist": { 3978 | "type": "zip", 3979 | "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", 3980 | "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", 3981 | "shasum": "" 3982 | }, 3983 | "require": { 3984 | "php": ">=7.2.5", 3985 | "symfony/polyfill-ctype": "~1.8", 3986 | "symfony/polyfill-intl-grapheme": "~1.0", 3987 | "symfony/polyfill-intl-normalizer": "~1.0", 3988 | "symfony/polyfill-mbstring": "~1.0", 3989 | "symfony/polyfill-php80": "~1.15" 3990 | }, 3991 | "require-dev": { 3992 | "symfony/error-handler": "^4.4|^5.0", 3993 | "symfony/http-client": "^4.4|^5.0", 3994 | "symfony/translation-contracts": "^1.1|^2", 3995 | "symfony/var-exporter": "^4.4|^5.0" 3996 | }, 3997 | "type": "library", 3998 | "autoload": { 3999 | "psr-4": { 4000 | "Symfony\\Component\\String\\": "" 4001 | }, 4002 | "files": [ 4003 | "Resources/functions.php" 4004 | ], 4005 | "exclude-from-classmap": [ 4006 | "/Tests/" 4007 | ] 4008 | }, 4009 | "notification-url": "https://packagist.org/downloads/", 4010 | "license": [ 4011 | "MIT" 4012 | ], 4013 | "authors": [ 4014 | { 4015 | "name": "Nicolas Grekas", 4016 | "email": "p@tchwork.com" 4017 | }, 4018 | { 4019 | "name": "Symfony Community", 4020 | "homepage": "https://symfony.com/contributors" 4021 | } 4022 | ], 4023 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 4024 | "homepage": "https://symfony.com", 4025 | "keywords": [ 4026 | "grapheme", 4027 | "i18n", 4028 | "string", 4029 | "unicode", 4030 | "utf-8", 4031 | "utf8" 4032 | ], 4033 | "support": { 4034 | "source": "https://github.com/symfony/string/tree/v5.3.3" 4035 | }, 4036 | "funding": [ 4037 | { 4038 | "url": "https://symfony.com/sponsor", 4039 | "type": "custom" 4040 | }, 4041 | { 4042 | "url": "https://github.com/fabpot", 4043 | "type": "github" 4044 | }, 4045 | { 4046 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 4047 | "type": "tidelift" 4048 | } 4049 | ], 4050 | "time": "2021-06-27T11:44:38+00:00" 4051 | } 4052 | ], 4053 | "aliases": [], 4054 | "minimum-stability": "stable", 4055 | "stability-flags": [], 4056 | "prefer-stable": false, 4057 | "prefer-lowest": false, 4058 | "platform": [], 4059 | "platform-dev": [], 4060 | "platform-overrides": { 4061 | "php": "7.4" 4062 | }, 4063 | "plugin-api-version": "2.1.0" 4064 | } 4065 | -------------------------------------------------------------------------------- /src/SocketAck.php: -------------------------------------------------------------------------------- 1 | envelopeId = $envelopeId; 23 | $this->payload = $this->decodePayload($payload); 24 | } 25 | 26 | private function decodePayload(?string $payload): ?array 27 | { 28 | if ($payload === null) { 29 | return null; 30 | } 31 | 32 | try { 33 | return json_decode($payload, true, 512, JSON_THROW_ON_ERROR); 34 | } catch (JsonException $exception) { 35 | throw new Exception('Invalid ack payload JSON encountered while decoding', 0, $exception); 36 | } 37 | } 38 | 39 | private function encodeAck(): string 40 | { 41 | $data = []; 42 | $data['envelope_id'] = $this->envelopeId; 43 | if ($this->payload !== null) { 44 | $data['payload'] = $this->payload; 45 | } 46 | 47 | try { 48 | return json_encode($data, JSON_THROW_ON_ERROR); 49 | } catch (JsonException $exception) { 50 | throw new Exception('Invalid ack JSON encountered while encoding', 0, $exception); 51 | } 52 | } 53 | 54 | public function __toString(): string 55 | { 56 | return $this->encodeAck(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/SocketEnvelope.php: -------------------------------------------------------------------------------- 1 | self::TYPE_UNKNOWN, 20 | 'hello' => self::TYPE_CONNECTION, 21 | 'disconnect' => self::TYPE_DISCONNECT, 22 | 'slash_commands' => self::TYPE_EVENT, 23 | 'interactive' => self::TYPE_EVENT, 24 | 'events_api' => self::TYPE_EVENT, 25 | ]; 26 | 27 | protected array $data; 28 | protected int $type; 29 | 30 | public function __construct(string $content) 31 | { 32 | try { 33 | $this->data = json_decode($content, true, 512, JSON_THROW_ON_ERROR); 34 | } catch (JsonException $exception) { 35 | $this->throwException('Invalid envelope JSON', $exception); 36 | } 37 | 38 | $this->type = self::TYPE_MAP[$this->data['type'] ?? 'unknown'] ?? self::TYPE_UNKNOWN; 39 | if ($this->type === self::TYPE_UNKNOWN) { 40 | $this->throwException('Cannot determine type of envelope'); 41 | } 42 | 43 | if ($this->type === self::TYPE_DISCONNECT 44 | && isset($this->data['reason']) 45 | && in_array($this->data['reason'], ['warning', 'refresh_requested'], true) 46 | ) { 47 | $this->type = self::TYPE_RECONNECT; 48 | } 49 | } 50 | 51 | public function isConnection(): bool 52 | { 53 | return $this->type === self::TYPE_CONNECTION; 54 | } 55 | 56 | public function isDisconnect(): bool 57 | { 58 | return $this->type === self::TYPE_DISCONNECT; 59 | } 60 | 61 | public function isReconnect(): bool 62 | { 63 | return $this->type === self::TYPE_RECONNECT; 64 | } 65 | 66 | public function isAppEvent(): bool 67 | { 68 | return $this->type === self::TYPE_EVENT; 69 | } 70 | 71 | public function getPayload(): array 72 | { 73 | if (!isset($this->data['payload'])) { 74 | $this->throwException('Payload not available in this type of envelope'); 75 | } 76 | 77 | return $this->data['payload']; 78 | } 79 | 80 | public function getEnvelopeId(): string 81 | { 82 | if (!isset($this->data['envelope_id'])) { 83 | $this->throwException('Envelope ID not available in this type of envelope'); 84 | } 85 | 86 | return $this->data['envelope_id']; 87 | } 88 | 89 | public function getData(): array 90 | { 91 | return $this->data; 92 | } 93 | 94 | /** 95 | * @param string $message 96 | * @param Throwable|null $previous 97 | * @return never-returns 98 | */ 99 | private function throwException(string $message, ?Throwable $previous = null): void 100 | { 101 | throw new Exception("(Envelope) {$message}", 0, $previous, ['envelope' => $this->data]); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/SocketServer.php: -------------------------------------------------------------------------------- 1 | debugReconnects = true; 39 | 40 | return $this; 41 | } 42 | 43 | public function init(): void 44 | { 45 | $this->httpClient = HttpClientBuilder::buildDefault(); 46 | $this->debugReconnects = false; 47 | } 48 | 49 | /** 50 | * Starts receiving and processing events from Slack. 51 | */ 52 | public function start(): void 53 | { 54 | $logger = $this->getLogger(); 55 | Amp\Loop::run(function () use ($logger) { 56 | try { 57 | $this->connection = yield $this->createConnection(); 58 | $logger->debug('Socket Mode connection established'); 59 | while ($message = yield $this->connection->receive()) { 60 | /** @var Websocket\Message $message */ 61 | $content = yield $message->buffer(); 62 | $envelope = new SocketEnvelope($content); 63 | if ($envelope->isConnection()) { 64 | $logger->debug('Socket Mode connection acknowledged by Slack'); 65 | } elseif ($envelope->isReconnect()) { 66 | $expiredConn = $this->connection; 67 | $this->connection = yield $this->createConnection(); 68 | $logger->debug('Socket Mode connection re-established'); 69 | $expiredConn->close(); 70 | $logger->debug('Expired Socket Mode connection closed'); 71 | } elseif ($envelope->isDisconnect()) { 72 | $this->stop(); 73 | } elseif ($envelope->isAppEvent()) { 74 | yield $this->handleSlackAppEvent($envelope); 75 | } 76 | 77 | yield Amp\delay(250); 78 | } 79 | } catch (Throwable $exception) { 80 | $logger->error('Error occurred during Socket Mode', compact('exception')); 81 | $this->stop(); 82 | } 83 | }); 84 | } 85 | 86 | public function stop(): void 87 | { 88 | if (isset($this->connection)) { 89 | $this->connection->close(); 90 | } 91 | 92 | $this->getLogger()->debug('Socket Mode connection closed'); 93 | exit(); 94 | } 95 | 96 | /** 97 | * Uses the App to handle the incoming Slack event. 98 | * 99 | * @param SocketEnvelope $envelope 100 | * @return Amp\Promise 101 | */ 102 | private function handleSlackAppEvent(SocketEnvelope $envelope): Amp\Promise 103 | { 104 | return Amp\call(function () use ($envelope) { 105 | // Create the Context. 106 | $payload = new Payload($envelope->getPayload()); 107 | $context = new Context($payload, ['envelope' => $envelope]); 108 | 109 | // Let the app handle the Context. 110 | $app = $this->getApp(); 111 | $app->handle($context); 112 | if (!$context->isAcknowledged()) { 113 | throw new Exception('App did not ack for the context'); 114 | } 115 | 116 | // Ack back to Slack through the websocket. The envelope_id must be included. 117 | $ack = new SocketAck($envelope->getEnvelopeId(), $context->getAck()); 118 | yield $this->connection->send((string) $ack); 119 | 120 | // Pass the context back through the app a second time for any deferred (i.e., post-ack) logic. 121 | if ($context->isDeferred()) { 122 | $app->handle($context); 123 | } 124 | }); 125 | } 126 | 127 | /** 128 | * Creates a websocket connection to Slack for the app. 129 | * 130 | * @return Amp\Promise 131 | */ 132 | private function createConnection(): Amp\Promise 133 | { 134 | return Amp\call(function () { 135 | // Make sure an app token is available. 136 | $appToken = $this->getAppCredentials()->getAppToken(); 137 | if ($appToken === null) { 138 | throw new Exception('Cannot create a Socket Mode connection without a configured app token'); 139 | } 140 | 141 | // Prepare and send a request to the Slack API to get the Web Socket URL. 142 | $request = new Request('https://slack.com/api/apps.connections.open', 'POST'); 143 | $request->addHeader('Content-Type', 'application/x-www-form-urlencoded'); 144 | $request->addHeader('Authorization', "Bearer {$appToken}"); 145 | /** @var Response $response */ 146 | $response = yield $this->httpClient->request($request); 147 | if ($response->getStatus() !== 200) { 148 | throw new Exception('Request to get WSS URL failed'); 149 | } 150 | 151 | // Extract the Websocket URL from the response from the Slack API. 152 | $contents = yield $response->getBody()->buffer(); 153 | $result = json_decode($contents, true, 512, JSON_THROW_ON_ERROR); 154 | if (!isset($result['ok'], $result['url']) || !$result['ok']) { 155 | throw new Exception('Response containing WSS URL was invalid'); 156 | } 157 | $wssUrl = $result['url']; 158 | if ($this->debugReconnects) { 159 | $wssUrl .= '&debug_reconnects=true'; 160 | } 161 | 162 | // Establish and return a Connection to the Websocket. 163 | return Websocket\Client\connect($wssUrl); 164 | }); 165 | } 166 | } 167 | --------------------------------------------------------------------------------