Codebase list php-dflydev-fig-cookies / f2ab99e
Import upstream version 3.0.0+git20210430.1.6ba089b Debian Janitor 2 years ago
32 changed file(s) with 5446 addition(s) and 1649 deletion(s). Raw diff Collapse all Expand all
0 ; top-most EditorConfig file
1 root = true
2
3 # All files.
4 [*]
5 end_of_line = LF
6 indent_style = space
7 indent_size = 4
8 charset = utf-8
9 trim_trailing_whitespace = true
10 insert_final_newline = true
0 /tests export-ignore
1 .gitattributes export-ignore
2 .gitignore export-ignore
3 .scrutinizer.yml export-ignore
4 .travis.yml export-ignore
5 phpunit.xml.dist export-ignore
0 name: Tests
1
2 on:
3 push: ~
4 pull_request: ~
5
6 jobs:
7 phpcs:
8 name: PHPCS
9 runs-on: ubuntu-latest
10
11 steps:
12 - uses: actions/checkout@v2
13
14 - uses: shivammathur/setup-php@v2
15 with:
16 php-version: 8.0
17 extensions: curl, mbstring
18 coverage: none
19 tools: composer:v2, cs2pr
20
21 - run: composer update --no-progress
22
23 - run: vendor/bin/phpcs -q --report=checkstyle | cs2pr
24
25 phpunit:
26 name: PHPUnit on ${{ matrix.php }} ${{ matrix.composer-flags }}
27 runs-on: ubuntu-latest
28 strategy:
29 matrix:
30 php: ['7.3', '7.4']
31 coverage: [pcov]
32 composer-flags: ['']
33 include:
34 - php: '7.2'
35 coverage: false
36 - php: '8.0'
37 coverage: false
38 composer-flags: '--ignore-platform-req=php'
39
40 steps:
41 - uses: actions/checkout@v2
42 with:
43 fetch-depth: 0
44
45 - uses: shivammathur/setup-php@v2
46 with:
47 php-version: ${{ matrix.php }}
48 extensions: curl
49 coverage: ${{ matrix.coverage }}
50 tools: composer:v2
51
52 - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
53
54 - name: "Use PHPUnit 9.3+ on PHP 8"
55 run: composer require --no-update --dev phpunit/phpunit:^9.3
56 if: "matrix.php == '8.0'"
57
58 - run: composer update --no-progress ${{ matrix.composer-flags }}
59
60 - run: vendor/bin/phpunit --no-coverage
61 if: ${{ matrix.coverage == 'none' }}
62
63 - run: vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
64 if: ${{ matrix.coverage != 'none' }}
65
66 - run: php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover
67 if: ${{ matrix.coverage != 'none' }}
68
69 phpstan:
70 name: PHPStan
71 runs-on: ubuntu-latest
72
73 steps:
74 - uses: actions/checkout@v2
75
76 - uses: shivammathur/setup-php@v2
77 with:
78 php-version: 8.0
79 extensions: curl
80 coverage: none
81 tools: composer:v2
82
83 - run: composer update --no-progress
84
85 - run: vendor/bin/phpstan analyse --no-progress
86
87 - run: vendor/bin/phpstan analyse --no-progress -c phpstan.tests.neon
88
89 psalm:
90 name: Psalm
91 runs-on: ubuntu-latest
92
93 steps:
94 - uses: actions/checkout@v2
95
96 - uses: shivammathur/setup-php@v2
97 with:
98 php-version: 8.0
99 extensions: curl
100 coverage: none
101 tools: composer:v2
102
103 - run: composer update --no-progress
104
105 - run: vendor/bin/psalm --no-progress --output-format=github
0 /vendor/
0 tools:
1 external_code_coverage:
2 timeout: 600
3 php_mess_detector: true
4 php_code_sniffer: true
5 sensiolabs_security_checker: true
6 php_code_coverage: true
7 php_pdepend: true
8 php_loc:
9 enabled: true
10 excluded_dirs: [vendor, tests]
11 php_cpd:
12 enabled: true
13 excluded_dirs: [vendor, tests]
14 filter:
15 excluded_paths:
16 - tests/*
154154 [BC] CHANGED: The return type of Dflydev\FigCookies\Cookies::fromRequest() changed from no type to Dflydev\FigCookies\Cookies
155155 ```
156156
157 - [#31](https://github.com/dflydev/dflydev-fig-cookies/pull/32) A new abstraction was
157 - [#31](https://github.com/dflydev/dflydev-fig-cookies/pull/31) A new abstraction was
158158 introduced to support `SameSite=Lax` and `SameSite=Strict` `Set-Cookie` header modifiers.
159159
160160 ### Deprecated
167167
168168 ### Fixed
169169
170 - [#31](https://github.com/dflydev/dflydev-fig-cookies/pull/32) `SetCookie#withExpires()`
170 - [#32](https://github.com/dflydev/dflydev-fig-cookies/pull/32) `SetCookie#withExpires()`
171171 will now reject any expiry time that cannot be parsed into a timestamp.
172 - [#31](https://github.com/dflydev/dflydev-fig-cookies/pull/32) A `SetCookie` can no longer
172 - [#32](https://github.com/dflydev/dflydev-fig-cookies/pull/32) A `SetCookie` can no longer
173173 be constructed via `Dflydev\FigCookies\SetCookie::fromSetCookieString('')`: an empty string
174174 will now be rejected.
149149
150150 #### Remove a Request Cookie
151151
152 The `remove` method removes a cookie if it exists.
152 The `remove` method removes a cookie from the request headers if it exists.
153153
154154 ```php
155155 use Dflydev\FigCookies\FigRequestCookies;
158158 ```
159159
160160 Note that this does not cause the client to remove the cookie. Take a look at
161 `FigResponseCookies::expire` to do that.
161 the `SetCookie` class' `expire()` method to do that.
162162
163163 ### Response Cookies
164164
260260 The `expire` method sets a cookie with an expiry date in the far past. This
261261 causes the client to remove the cookie.
262262
263 ```php
264 use Dflydev\FigCookies\FigResponseCookies;
265
266 $response = FigResponseCookies::expire($response, 'session_cookie');
263 Note that in order to expire a cookie, you need to configure its `Set-Cookie`
264 header just like when you initially wrote the cookie (i.e. same domain/path).
265 The easiest way to do this is to re-use the same code for configuring the
266 header when setting as well as expiring the cookie:
267
268 ```php
269 use Dflydev\FigCookies\FigResponseCookies;
270 use Dflydev\FigCookies\SetCookie;
271
272 $setCookie = SetCookie::create('ba')
273 ->withValue('UQdfdafpJJ23k111m')
274 ->withPath('/')
275 ->withDomain('.example.com')
276 ;
277
278 FigResponseCookies::set($response, $setCookie->expire());
267279 ```
268280
269281
99 }
1010 ],
1111 "require": {
12 "php": "^7.2",
12 "php": "^7.2 || ^8.0",
1313 "ext-pcre": "*",
1414 "psr/http-message": "^1"
1515 },
1919 }
2020 },
2121 "require-dev": {
22 "phpunit/phpunit": "^7.2.6",
22 "phpunit/phpunit": "^7.2.6 || ^9",
2323 "squizlabs/php_codesniffer": "^3.3",
24 "doctrine/coding-standard": "^4",
25 "phpstan/phpstan": "^0.10.1"
24 "doctrine/coding-standard": "^8",
25 "phpstan/phpstan": "^0.12",
26 "phpstan/phpstan-phpunit": "^0.12.16",
27 "phpstan/extension-installer": "^1.0",
28 "scrutinizer/ocular": "^1.8",
29 "vimeo/psalm": "^4.4"
2630 },
2731 "autoload-dev": {
2832 "psr-4": {
3135 },
3236 "extra": {
3337 "branch-alias": {
34 "dev-master": "2.0.x-dev"
38 "dev-main": "3.0.x-dev"
3539 }
3640 }
3741 }
33 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
44 "This file is @generated automatically"
55 ],
6 "content-hash": "56de4a3ac9359be2740da28c02dc813b",
6 "content-hash": "cae0967e1f605bff394cf81b10ca3c43",
77 "packages": [
88 {
99 "name": "psr/http-message",
5353 "request",
5454 "response"
5555 ],
56 "support": {
57 "source": "https://github.com/php-fig/http-message/tree/master"
58 },
5659 "time": "2016-08-06T14:39:51+00:00"
5760 }
5861 ],
5962 "packages-dev": [
6063 {
64 "name": "amphp/amp",
65 "version": "v2.5.2",
66 "source": {
67 "type": "git",
68 "url": "https://github.com/amphp/amp.git",
69 "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9"
70 },
71 "dist": {
72 "type": "zip",
73 "url": "https://api.github.com/repos/amphp/amp/zipball/efca2b32a7580087adb8aabbff6be1dc1bb924a9",
74 "reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9",
75 "shasum": ""
76 },
77 "require": {
78 "php": ">=7"
79 },
80 "require-dev": {
81 "amphp/php-cs-fixer-config": "dev-master",
82 "amphp/phpunit-util": "^1",
83 "ext-json": "*",
84 "jetbrains/phpstorm-stubs": "^2019.3",
85 "phpunit/phpunit": "^6.0.9 | ^7",
86 "psalm/phar": "^3.11@dev",
87 "react/promise": "^2"
88 },
89 "type": "library",
90 "extra": {
91 "branch-alias": {
92 "dev-master": "2.x-dev"
93 }
94 },
95 "autoload": {
96 "psr-4": {
97 "Amp\\": "lib"
98 },
99 "files": [
100 "lib/functions.php",
101 "lib/Internal/functions.php"
102 ]
103 },
104 "notification-url": "https://packagist.org/downloads/",
105 "license": [
106 "MIT"
107 ],
108 "authors": [
109 {
110 "name": "Daniel Lowrey",
111 "email": "rdlowrey@php.net"
112 },
113 {
114 "name": "Aaron Piotrowski",
115 "email": "aaron@trowski.com"
116 },
117 {
118 "name": "Bob Weinand",
119 "email": "bobwei9@hotmail.com"
120 },
121 {
122 "name": "Niklas Keller",
123 "email": "me@kelunik.com"
124 }
125 ],
126 "description": "A non-blocking concurrency framework for PHP applications.",
127 "homepage": "http://amphp.org/amp",
128 "keywords": [
129 "async",
130 "asynchronous",
131 "awaitable",
132 "concurrency",
133 "event",
134 "event-loop",
135 "future",
136 "non-blocking",
137 "promise"
138 ],
139 "support": {
140 "irc": "irc://irc.freenode.org/amphp",
141 "issues": "https://github.com/amphp/amp/issues",
142 "source": "https://github.com/amphp/amp/tree/v2.5.2"
143 },
144 "funding": [
145 {
146 "url": "https://github.com/amphp",
147 "type": "github"
148 }
149 ],
150 "time": "2021-01-10T17:06:37+00:00"
151 },
152 {
153 "name": "amphp/byte-stream",
154 "version": "v1.8.0",
155 "source": {
156 "type": "git",
157 "url": "https://github.com/amphp/byte-stream.git",
158 "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088"
159 },
160 "dist": {
161 "type": "zip",
162 "url": "https://api.github.com/repos/amphp/byte-stream/zipball/f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
163 "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
164 "shasum": ""
165 },
166 "require": {
167 "amphp/amp": "^2",
168 "php": ">=7.1"
169 },
170 "require-dev": {
171 "amphp/php-cs-fixer-config": "dev-master",
172 "amphp/phpunit-util": "^1.4",
173 "friendsofphp/php-cs-fixer": "^2.3",
174 "jetbrains/phpstorm-stubs": "^2019.3",
175 "phpunit/phpunit": "^6 || ^7 || ^8",
176 "psalm/phar": "^3.11.4"
177 },
178 "type": "library",
179 "extra": {
180 "branch-alias": {
181 "dev-master": "1.x-dev"
182 }
183 },
184 "autoload": {
185 "psr-4": {
186 "Amp\\ByteStream\\": "lib"
187 },
188 "files": [
189 "lib/functions.php"
190 ]
191 },
192 "notification-url": "https://packagist.org/downloads/",
193 "license": [
194 "MIT"
195 ],
196 "authors": [
197 {
198 "name": "Aaron Piotrowski",
199 "email": "aaron@trowski.com"
200 },
201 {
202 "name": "Niklas Keller",
203 "email": "me@kelunik.com"
204 }
205 ],
206 "description": "A stream abstraction to make working with non-blocking I/O simple.",
207 "homepage": "http://amphp.org/byte-stream",
208 "keywords": [
209 "amp",
210 "amphp",
211 "async",
212 "io",
213 "non-blocking",
214 "stream"
215 ],
216 "support": {
217 "irc": "irc://irc.freenode.org/amphp",
218 "issues": "https://github.com/amphp/byte-stream/issues",
219 "source": "https://github.com/amphp/byte-stream/tree/master"
220 },
221 "time": "2020-06-29T18:35:05+00:00"
222 },
223 {
224 "name": "composer/package-versions-deprecated",
225 "version": "1.11.99.1",
226 "source": {
227 "type": "git",
228 "url": "https://github.com/composer/package-versions-deprecated.git",
229 "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6"
230 },
231 "dist": {
232 "type": "zip",
233 "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
234 "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
235 "shasum": ""
236 },
237 "require": {
238 "composer-plugin-api": "^1.1.0 || ^2.0",
239 "php": "^7 || ^8"
240 },
241 "replace": {
242 "ocramius/package-versions": "1.11.99"
243 },
244 "require-dev": {
245 "composer/composer": "^1.9.3 || ^2.0@dev",
246 "ext-zip": "^1.13",
247 "phpunit/phpunit": "^6.5 || ^7"
248 },
249 "type": "composer-plugin",
250 "extra": {
251 "class": "PackageVersions\\Installer",
252 "branch-alias": {
253 "dev-master": "1.x-dev"
254 }
255 },
256 "autoload": {
257 "psr-4": {
258 "PackageVersions\\": "src/PackageVersions"
259 }
260 },
261 "notification-url": "https://packagist.org/downloads/",
262 "license": [
263 "MIT"
264 ],
265 "authors": [
266 {
267 "name": "Marco Pivetta",
268 "email": "ocramius@gmail.com"
269 },
270 {
271 "name": "Jordi Boggiano",
272 "email": "j.boggiano@seld.be"
273 }
274 ],
275 "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
276 "support": {
277 "issues": "https://github.com/composer/package-versions-deprecated/issues",
278 "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1"
279 },
280 "funding": [
281 {
282 "url": "https://packagist.com",
283 "type": "custom"
284 },
285 {
286 "url": "https://github.com/composer",
287 "type": "github"
288 },
289 {
290 "url": "https://tidelift.com/funding/github/packagist/composer/composer",
291 "type": "tidelift"
292 }
293 ],
294 "time": "2020-11-11T10:22:58+00:00"
295 },
296 {
297 "name": "composer/semver",
298 "version": "3.2.4",
299 "source": {
300 "type": "git",
301 "url": "https://github.com/composer/semver.git",
302 "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464"
303 },
304 "dist": {
305 "type": "zip",
306 "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
307 "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
308 "shasum": ""
309 },
310 "require": {
311 "php": "^5.3.2 || ^7.0 || ^8.0"
312 },
313 "require-dev": {
314 "phpstan/phpstan": "^0.12.54",
315 "symfony/phpunit-bridge": "^4.2 || ^5"
316 },
317 "type": "library",
318 "extra": {
319 "branch-alias": {
320 "dev-main": "3.x-dev"
321 }
322 },
323 "autoload": {
324 "psr-4": {
325 "Composer\\Semver\\": "src"
326 }
327 },
328 "notification-url": "https://packagist.org/downloads/",
329 "license": [
330 "MIT"
331 ],
332 "authors": [
333 {
334 "name": "Nils Adermann",
335 "email": "naderman@naderman.de",
336 "homepage": "http://www.naderman.de"
337 },
338 {
339 "name": "Jordi Boggiano",
340 "email": "j.boggiano@seld.be",
341 "homepage": "http://seld.be"
342 },
343 {
344 "name": "Rob Bast",
345 "email": "rob.bast@gmail.com",
346 "homepage": "http://robbast.nl"
347 }
348 ],
349 "description": "Semver library that offers utilities, version constraint parsing and validation.",
350 "keywords": [
351 "semantic",
352 "semver",
353 "validation",
354 "versioning"
355 ],
356 "support": {
357 "irc": "irc://irc.freenode.org/composer",
358 "issues": "https://github.com/composer/semver/issues",
359 "source": "https://github.com/composer/semver/tree/3.2.4"
360 },
361 "funding": [
362 {
363 "url": "https://packagist.com",
364 "type": "custom"
365 },
366 {
367 "url": "https://github.com/composer",
368 "type": "github"
369 },
370 {
371 "url": "https://tidelift.com/funding/github/packagist/composer/composer",
372 "type": "tidelift"
373 }
374 ],
375 "time": "2020-11-13T08:59:24+00:00"
376 },
377 {
61378 "name": "composer/xdebug-handler",
62 "version": "1.1.0",
379 "version": "1.4.5",
63380 "source": {
64381 "type": "git",
65382 "url": "https://github.com/composer/xdebug-handler.git",
66 "reference": "c919dc6c62e221fc6406f861ea13433c0aa24f08"
67 },
68 "dist": {
69 "type": "zip",
70 "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/c919dc6c62e221fc6406f861ea13433c0aa24f08",
71 "reference": "c919dc6c62e221fc6406f861ea13433c0aa24f08",
72 "shasum": ""
73 },
74 "require": {
75 "php": "^5.3.2 || ^7.0",
383 "reference": "f28d44c286812c714741478d968104c5e604a1d4"
384 },
385 "dist": {
386 "type": "zip",
387 "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4",
388 "reference": "f28d44c286812c714741478d968104c5e604a1d4",
389 "shasum": ""
390 },
391 "require": {
392 "php": "^5.3.2 || ^7.0 || ^8.0",
76393 "psr/log": "^1.0"
77394 },
78395 "require-dev": {
79 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
396 "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
80397 },
81398 "type": "library",
82399 "autoload": {
94411 "email": "john-stevenson@blueyonder.co.uk"
95412 }
96413 ],
97 "description": "Restarts a process without xdebug.",
414 "description": "Restarts a process without Xdebug.",
98415 "keywords": [
99416 "Xdebug",
100417 "performance"
101418 ],
102 "time": "2018-04-11T15:42:36+00:00"
419 "support": {
420 "irc": "irc://irc.freenode.org/composer",
421 "issues": "https://github.com/composer/xdebug-handler/issues",
422 "source": "https://github.com/composer/xdebug-handler/tree/1.4.5"
423 },
424 "funding": [
425 {
426 "url": "https://packagist.com",
427 "type": "custom"
428 },
429 {
430 "url": "https://github.com/composer",
431 "type": "github"
432 },
433 {
434 "url": "https://tidelift.com/funding/github/packagist/composer/composer",
435 "type": "tidelift"
436 }
437 ],
438 "time": "2020-11-13T08:04:11+00:00"
103439 },
104440 {
105441 "name": "dealerdirect/phpcodesniffer-composer-installer",
106 "version": "v0.4.4",
442 "version": "v0.7.1",
107443 "source": {
108444 "type": "git",
109445 "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
110 "reference": "2e41850d5f7797cbb1af7b030d245b3b24e63a08"
111 },
112 "dist": {
113 "type": "zip",
114 "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/2e41850d5f7797cbb1af7b030d245b3b24e63a08",
115 "reference": "2e41850d5f7797cbb1af7b030d245b3b24e63a08",
116 "shasum": ""
117 },
118 "require": {
119 "composer-plugin-api": "^1.0",
120 "php": "^5.3|^7",
121 "squizlabs/php_codesniffer": "*"
446 "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
447 },
448 "dist": {
449 "type": "zip",
450 "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
451 "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
452 "shasum": ""
453 },
454 "require": {
455 "composer-plugin-api": "^1.0 || ^2.0",
456 "php": ">=5.3",
457 "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
122458 },
123459 "require-dev": {
124460 "composer/composer": "*",
125 "wimg/php-compatibility": "^8.0"
126 },
127 "suggest": {
128 "dealerdirect/qa-tools": "All the PHP QA tools you'll need"
461 "phpcompatibility/php-compatibility": "^9.0",
462 "sensiolabs/security-checker": "^4.1.0"
129463 },
130464 "type": "composer-plugin",
131465 "extra": {
143477 "authors": [
144478 {
145479 "name": "Franck Nijhof",
146 "email": "f.nijhof@dealerdirect.nl",
147 "homepage": "http://workingatdealerdirect.eu",
148 "role": "Developer"
480 "email": "franck.nijhof@dealerdirect.com",
481 "homepage": "http://www.frenck.nl",
482 "role": "Developer / IT Manager"
149483 }
150484 ],
151485 "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
152 "homepage": "http://workingatdealerdirect.eu",
486 "homepage": "http://www.dealerdirect.com",
153487 "keywords": [
154488 "PHPCodeSniffer",
155489 "PHP_CodeSniffer",
167501 "stylecheck",
168502 "tests"
169503 ],
170 "time": "2017-12-06T16:27:17+00:00"
171 },
172 {
173 "name": "doctrine/coding-standard",
174 "version": "4.0.0",
175 "source": {
176 "type": "git",
177 "url": "https://github.com/doctrine/coding-standard.git",
178 "reference": "0469c18a1a4724c278f2879c0dd7b1fa860b52de"
179 },
180 "dist": {
181 "type": "zip",
182 "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/0469c18a1a4724c278f2879c0dd7b1fa860b52de",
183 "reference": "0469c18a1a4724c278f2879c0dd7b1fa860b52de",
184 "shasum": ""
185 },
186 "require": {
187 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.2",
188 "php": "^7.1",
189 "slevomat/coding-standard": "^4.5.0",
190 "squizlabs/php_codesniffer": "^3.2.3"
191 },
192 "type": "phpcodesniffer-standard",
193 "extra": {
194 "branch-alias": {
195 "dev-master": "3.0.x-dev"
196 }
197 },
504 "support": {
505 "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
506 "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
507 },
508 "time": "2020-12-07T18:04:37+00:00"
509 },
510 {
511 "name": "dnoegel/php-xdg-base-dir",
512 "version": "v0.1.1",
513 "source": {
514 "type": "git",
515 "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
516 "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
517 },
518 "dist": {
519 "type": "zip",
520 "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
521 "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
522 "shasum": ""
523 },
524 "require": {
525 "php": ">=5.3.2"
526 },
527 "require-dev": {
528 "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
529 },
530 "type": "library",
198531 "autoload": {
199532 "psr-4": {
200 "Doctrine\\Sniffs\\": "lib/Doctrine/Sniffs"
533 "XdgBaseDir\\": "src/"
201534 }
202535 },
203536 "notification-url": "https://packagist.org/downloads/",
204537 "license": [
205538 "MIT"
206539 ],
207 "authors": [
540 "description": "implementation of xdg base directory specification for php",
541 "support": {
542 "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
543 "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
544 },
545 "time": "2019-12-04T15:06:13+00:00"
546 },
547 {
548 "name": "doctrine/annotations",
549 "version": "1.11.1",
550 "source": {
551 "type": "git",
552 "url": "https://github.com/doctrine/annotations.git",
553 "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad"
554 },
555 "dist": {
556 "type": "zip",
557 "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
558 "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
559 "shasum": ""
560 },
561 "require": {
562 "doctrine/lexer": "1.*",
563 "ext-tokenizer": "*",
564 "php": "^7.1 || ^8.0"
565 },
566 "require-dev": {
567 "doctrine/cache": "1.*",
568 "doctrine/coding-standard": "^6.0 || ^8.1",
569 "phpstan/phpstan": "^0.12.20",
570 "phpunit/phpunit": "^7.5 || ^9.1.5"
571 },
572 "type": "library",
573 "extra": {
574 "branch-alias": {
575 "dev-master": "1.11.x-dev"
576 }
577 },
578 "autoload": {
579 "psr-4": {
580 "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
581 }
582 },
583 "notification-url": "https://packagist.org/downloads/",
584 "license": [
585 "MIT"
586 ],
587 "authors": [
588 {
589 "name": "Guilherme Blanco",
590 "email": "guilhermeblanco@gmail.com"
591 },
592 {
593 "name": "Roman Borschel",
594 "email": "roman@code-factory.org"
595 },
208596 {
209597 "name": "Benjamin Eberlei",
210598 "email": "kontakt@beberlei.de"
211599 },
212600 {
601 "name": "Jonathan Wage",
602 "email": "jonwage@gmail.com"
603 },
604 {
605 "name": "Johannes Schmitt",
606 "email": "schmittjoh@gmail.com"
607 }
608 ],
609 "description": "Docblock Annotations Parser",
610 "homepage": "https://www.doctrine-project.org/projects/annotations.html",
611 "keywords": [
612 "annotations",
613 "docblock",
614 "parser"
615 ],
616 "support": {
617 "issues": "https://github.com/doctrine/annotations/issues",
618 "source": "https://github.com/doctrine/annotations/tree/1.11.1"
619 },
620 "time": "2020-10-26T10:28:16+00:00"
621 },
622 {
623 "name": "doctrine/coding-standard",
624 "version": "8.2.0",
625 "source": {
626 "type": "git",
627 "url": "https://github.com/doctrine/coding-standard.git",
628 "reference": "529d385bb3790431080493c0fe7adaec39df368a"
629 },
630 "dist": {
631 "type": "zip",
632 "url": "https://api.github.com/repos/doctrine/coding-standard/zipball/529d385bb3790431080493c0fe7adaec39df368a",
633 "reference": "529d385bb3790431080493c0fe7adaec39df368a",
634 "shasum": ""
635 },
636 "require": {
637 "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
638 "php": "^7.1 || ^8.0",
639 "slevomat/coding-standard": "^6.3.9",
640 "squizlabs/php_codesniffer": "^3.5.5"
641 },
642 "type": "phpcodesniffer-standard",
643 "notification-url": "https://packagist.org/downloads/",
644 "license": [
645 "MIT"
646 ],
647 "authors": [
648 {
649 "name": "Benjamin Eberlei",
650 "email": "kontakt@beberlei.de"
651 },
652 {
213653 "name": "Steve Müller",
214654 "email": "st.mueller@dzh-online.de"
215655 }
216656 ],
217 "description": "Doctrine Coding Standard",
218 "homepage": "http://www.doctrine-project.org",
657 "description": "The Doctrine Coding Standard is a set of PHPCS rules applied to all Doctrine projects.",
658 "homepage": "https://www.doctrine-project.org/projects/coding-standard.html",
219659 "keywords": [
660 "checks",
220661 "code",
221662 "coding",
222663 "cs",
223664 "doctrine",
665 "rules",
224666 "sniffer",
667 "sniffs",
225668 "standard",
226669 "style"
227670 ],
228 "time": "2018-03-03T23:49:15+00:00"
671 "support": {
672 "issues": "https://github.com/doctrine/coding-standard/issues",
673 "source": "https://github.com/doctrine/coding-standard/tree/8.2.0"
674 },
675 "time": "2020-10-25T14:56:19+00:00"
229676 },
230677 {
231678 "name": "doctrine/instantiator",
232 "version": "1.1.0",
679 "version": "1.4.0",
233680 "source": {
234681 "type": "git",
235682 "url": "https://github.com/doctrine/instantiator.git",
236 "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
237 },
238 "dist": {
239 "type": "zip",
240 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
241 "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
242 "shasum": ""
243 },
244 "require": {
245 "php": "^7.1"
246 },
247 "require-dev": {
248 "athletic/athletic": "~0.1.8",
683 "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
684 },
685 "dist": {
686 "type": "zip",
687 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
688 "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
689 "shasum": ""
690 },
691 "require": {
692 "php": "^7.1 || ^8.0"
693 },
694 "require-dev": {
695 "doctrine/coding-standard": "^8.0",
249696 "ext-pdo": "*",
250697 "ext-phar": "*",
251 "phpunit/phpunit": "^6.2.3",
252 "squizlabs/php_codesniffer": "^3.0.2"
253 },
254 "type": "library",
255 "extra": {
256 "branch-alias": {
257 "dev-master": "1.2.x-dev"
258 }
259 },
698 "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
699 "phpstan/phpstan": "^0.12",
700 "phpstan/phpstan-phpunit": "^0.12",
701 "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
702 },
703 "type": "library",
260704 "autoload": {
261705 "psr-4": {
262706 "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
270714 {
271715 "name": "Marco Pivetta",
272716 "email": "ocramius@gmail.com",
273 "homepage": "http://ocramius.github.com/"
717 "homepage": "https://ocramius.github.io/"
274718 }
275719 ],
276720 "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
277 "homepage": "https://github.com/doctrine/instantiator",
721 "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
278722 "keywords": [
279723 "constructor",
280724 "instantiate"
281725 ],
282 "time": "2017-07-22T11:58:36+00:00"
283 },
284 {
285 "name": "jean85/pretty-package-versions",
286 "version": "1.2",
287 "source": {
288 "type": "git",
289 "url": "https://github.com/Jean85/pretty-package-versions.git",
290 "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48"
291 },
292 "dist": {
293 "type": "zip",
294 "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48",
295 "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48",
296 "shasum": ""
297 },
298 "require": {
299 "ocramius/package-versions": "^1.2.0",
300 "php": "^7.0"
301 },
302 "require-dev": {
303 "phpunit/phpunit": "^6.0"
726 "support": {
727 "issues": "https://github.com/doctrine/instantiator/issues",
728 "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
729 },
730 "funding": [
731 {
732 "url": "https://www.doctrine-project.org/sponsorship.html",
733 "type": "custom"
734 },
735 {
736 "url": "https://www.patreon.com/phpdoctrine",
737 "type": "patreon"
738 },
739 {
740 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
741 "type": "tidelift"
742 }
743 ],
744 "time": "2020-11-10T18:47:58+00:00"
745 },
746 {
747 "name": "doctrine/lexer",
748 "version": "1.2.1",
749 "source": {
750 "type": "git",
751 "url": "https://github.com/doctrine/lexer.git",
752 "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
753 },
754 "dist": {
755 "type": "zip",
756 "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
757 "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
758 "shasum": ""
759 },
760 "require": {
761 "php": "^7.2 || ^8.0"
762 },
763 "require-dev": {
764 "doctrine/coding-standard": "^6.0",
765 "phpstan/phpstan": "^0.11.8",
766 "phpunit/phpunit": "^8.2"
767 },
768 "type": "library",
769 "extra": {
770 "branch-alias": {
771 "dev-master": "1.2.x-dev"
772 }
773 },
774 "autoload": {
775 "psr-4": {
776 "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
777 }
778 },
779 "notification-url": "https://packagist.org/downloads/",
780 "license": [
781 "MIT"
782 ],
783 "authors": [
784 {
785 "name": "Guilherme Blanco",
786 "email": "guilhermeblanco@gmail.com"
787 },
788 {
789 "name": "Roman Borschel",
790 "email": "roman@code-factory.org"
791 },
792 {
793 "name": "Johannes Schmitt",
794 "email": "schmittjoh@gmail.com"
795 }
796 ],
797 "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
798 "homepage": "https://www.doctrine-project.org/projects/lexer.html",
799 "keywords": [
800 "annotations",
801 "docblock",
802 "lexer",
803 "parser",
804 "php"
805 ],
806 "support": {
807 "issues": "https://github.com/doctrine/lexer/issues",
808 "source": "https://github.com/doctrine/lexer/tree/1.2.1"
809 },
810 "funding": [
811 {
812 "url": "https://www.doctrine-project.org/sponsorship.html",
813 "type": "custom"
814 },
815 {
816 "url": "https://www.patreon.com/phpdoctrine",
817 "type": "patreon"
818 },
819 {
820 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
821 "type": "tidelift"
822 }
823 ],
824 "time": "2020-05-25T17:44:05+00:00"
825 },
826 {
827 "name": "felixfbecker/advanced-json-rpc",
828 "version": "v3.2.0",
829 "source": {
830 "type": "git",
831 "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
832 "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e"
833 },
834 "dist": {
835 "type": "zip",
836 "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/06f0b06043c7438959dbdeed8bb3f699a19be22e",
837 "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e",
838 "shasum": ""
839 },
840 "require": {
841 "netresearch/jsonmapper": "^1.0 || ^2.0",
842 "php": "^7.1 || ^8.0",
843 "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
844 },
845 "require-dev": {
846 "phpunit/phpunit": "^7.0 || ^8.0"
847 },
848 "type": "library",
849 "autoload": {
850 "psr-4": {
851 "AdvancedJsonRpc\\": "lib/"
852 }
853 },
854 "notification-url": "https://packagist.org/downloads/",
855 "license": [
856 "ISC"
857 ],
858 "authors": [
859 {
860 "name": "Felix Becker",
861 "email": "felix.b@outlook.com"
862 }
863 ],
864 "description": "A more advanced JSONRPC implementation",
865 "support": {
866 "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
867 "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.0"
868 },
869 "time": "2021-01-10T17:48:47+00:00"
870 },
871 {
872 "name": "felixfbecker/language-server-protocol",
873 "version": "v1.5.0",
874 "source": {
875 "type": "git",
876 "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
877 "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541"
878 },
879 "dist": {
880 "type": "zip",
881 "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/85e83cacd2ed573238678c6875f8f0d7ec699541",
882 "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541",
883 "shasum": ""
884 },
885 "require": {
886 "php": ">=7.1"
887 },
888 "require-dev": {
889 "phpstan/phpstan": "*",
890 "squizlabs/php_codesniffer": "^3.1",
891 "vimeo/psalm": "^4.0"
304892 },
305893 "type": "library",
306894 "extra": {
310898 },
311899 "autoload": {
312900 "psr-4": {
313 "Jean85\\": "src/"
314 }
901 "LanguageServerProtocol\\": "src/"
902 }
903 },
904 "notification-url": "https://packagist.org/downloads/",
905 "license": [
906 "ISC"
907 ],
908 "authors": [
909 {
910 "name": "Felix Becker",
911 "email": "felix.b@outlook.com"
912 }
913 ],
914 "description": "PHP classes for the Language Server Protocol",
915 "keywords": [
916 "language",
917 "microsoft",
918 "php",
919 "server"
920 ],
921 "support": {
922 "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
923 "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.0"
924 },
925 "time": "2020-10-23T13:55:30+00:00"
926 },
927 {
928 "name": "guzzlehttp/guzzle",
929 "version": "7.2.0",
930 "source": {
931 "type": "git",
932 "url": "https://github.com/guzzle/guzzle.git",
933 "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79"
934 },
935 "dist": {
936 "type": "zip",
937 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79",
938 "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79",
939 "shasum": ""
940 },
941 "require": {
942 "ext-json": "*",
943 "guzzlehttp/promises": "^1.4",
944 "guzzlehttp/psr7": "^1.7",
945 "php": "^7.2.5 || ^8.0",
946 "psr/http-client": "^1.0"
947 },
948 "provide": {
949 "psr/http-client-implementation": "1.0"
950 },
951 "require-dev": {
952 "ext-curl": "*",
953 "php-http/client-integration-tests": "^3.0",
954 "phpunit/phpunit": "^8.5.5 || ^9.3.5",
955 "psr/log": "^1.1"
956 },
957 "suggest": {
958 "ext-curl": "Required for CURL handler support",
959 "ext-intl": "Required for Internationalized Domain Name (IDN) support",
960 "psr/log": "Required for using the Log middleware"
961 },
962 "type": "library",
963 "extra": {
964 "branch-alias": {
965 "dev-master": "7.1-dev"
966 }
967 },
968 "autoload": {
969 "psr-4": {
970 "GuzzleHttp\\": "src/"
971 },
972 "files": [
973 "src/functions_include.php"
974 ]
315975 },
316976 "notification-url": "https://packagist.org/downloads/",
317977 "license": [
319979 ],
320980 "authors": [
321981 {
322 "name": "Alessandro Lai",
323 "email": "alessandro.lai85@gmail.com"
324 }
325 ],
326 "description": "A wrapper for ocramius/package-versions to get pretty versions strings",
982 "name": "Michael Dowling",
983 "email": "mtdowling@gmail.com",
984 "homepage": "https://github.com/mtdowling"
985 },
986 {
987 "name": "Márk Sági-Kazár",
988 "email": "mark.sagikazar@gmail.com",
989 "homepage": "https://sagikazarmark.hu"
990 }
991 ],
992 "description": "Guzzle is a PHP HTTP client library",
993 "homepage": "http://guzzlephp.org/",
327994 "keywords": [
328 "composer",
329 "package",
330 "release",
331 "versions"
332 ],
333 "time": "2018-06-13T13:22:40+00:00"
995 "client",
996 "curl",
997 "framework",
998 "http",
999 "http client",
1000 "psr-18",
1001 "psr-7",
1002 "rest",
1003 "web service"
1004 ],
1005 "support": {
1006 "issues": "https://github.com/guzzle/guzzle/issues",
1007 "source": "https://github.com/guzzle/guzzle/tree/7.2.0"
1008 },
1009 "funding": [
1010 {
1011 "url": "https://github.com/GrahamCampbell",
1012 "type": "github"
1013 },
1014 {
1015 "url": "https://github.com/Nyholm",
1016 "type": "github"
1017 },
1018 {
1019 "url": "https://github.com/alexeyshockov",
1020 "type": "github"
1021 },
1022 {
1023 "url": "https://github.com/gmponos",
1024 "type": "github"
1025 }
1026 ],
1027 "time": "2020-10-10T11:47:56+00:00"
1028 },
1029 {
1030 "name": "guzzlehttp/promises",
1031 "version": "1.4.0",
1032 "source": {
1033 "type": "git",
1034 "url": "https://github.com/guzzle/promises.git",
1035 "reference": "60d379c243457e073cff02bc323a2a86cb355631"
1036 },
1037 "dist": {
1038 "type": "zip",
1039 "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631",
1040 "reference": "60d379c243457e073cff02bc323a2a86cb355631",
1041 "shasum": ""
1042 },
1043 "require": {
1044 "php": ">=5.5"
1045 },
1046 "require-dev": {
1047 "symfony/phpunit-bridge": "^4.4 || ^5.1"
1048 },
1049 "type": "library",
1050 "extra": {
1051 "branch-alias": {
1052 "dev-master": "1.4-dev"
1053 }
1054 },
1055 "autoload": {
1056 "psr-4": {
1057 "GuzzleHttp\\Promise\\": "src/"
1058 },
1059 "files": [
1060 "src/functions_include.php"
1061 ]
1062 },
1063 "notification-url": "https://packagist.org/downloads/",
1064 "license": [
1065 "MIT"
1066 ],
1067 "authors": [
1068 {
1069 "name": "Michael Dowling",
1070 "email": "mtdowling@gmail.com",
1071 "homepage": "https://github.com/mtdowling"
1072 }
1073 ],
1074 "description": "Guzzle promises library",
1075 "keywords": [
1076 "promise"
1077 ],
1078 "support": {
1079 "issues": "https://github.com/guzzle/promises/issues",
1080 "source": "https://github.com/guzzle/promises/tree/1.4.0"
1081 },
1082 "time": "2020-09-30T07:37:28+00:00"
1083 },
1084 {
1085 "name": "guzzlehttp/psr7",
1086 "version": "1.7.0",
1087 "source": {
1088 "type": "git",
1089 "url": "https://github.com/guzzle/psr7.git",
1090 "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
1091 },
1092 "dist": {
1093 "type": "zip",
1094 "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
1095 "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
1096 "shasum": ""
1097 },
1098 "require": {
1099 "php": ">=5.4.0",
1100 "psr/http-message": "~1.0",
1101 "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
1102 },
1103 "provide": {
1104 "psr/http-message-implementation": "1.0"
1105 },
1106 "require-dev": {
1107 "ext-zlib": "*",
1108 "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
1109 },
1110 "suggest": {
1111 "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
1112 },
1113 "type": "library",
1114 "extra": {
1115 "branch-alias": {
1116 "dev-master": "1.7-dev"
1117 }
1118 },
1119 "autoload": {
1120 "psr-4": {
1121 "GuzzleHttp\\Psr7\\": "src/"
1122 },
1123 "files": [
1124 "src/functions_include.php"
1125 ]
1126 },
1127 "notification-url": "https://packagist.org/downloads/",
1128 "license": [
1129 "MIT"
1130 ],
1131 "authors": [
1132 {
1133 "name": "Michael Dowling",
1134 "email": "mtdowling@gmail.com",
1135 "homepage": "https://github.com/mtdowling"
1136 },
1137 {
1138 "name": "Tobias Schultze",
1139 "homepage": "https://github.com/Tobion"
1140 }
1141 ],
1142 "description": "PSR-7 message implementation that also provides common utility methods",
1143 "keywords": [
1144 "http",
1145 "message",
1146 "psr-7",
1147 "request",
1148 "response",
1149 "stream",
1150 "uri",
1151 "url"
1152 ],
1153 "support": {
1154 "issues": "https://github.com/guzzle/psr7/issues",
1155 "source": "https://github.com/guzzle/psr7/tree/1.7.0"
1156 },
1157 "time": "2020-09-30T07:37:11+00:00"
1158 },
1159 {
1160 "name": "jms/metadata",
1161 "version": "1.7.0",
1162 "source": {
1163 "type": "git",
1164 "url": "https://github.com/schmittjoh/metadata.git",
1165 "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8"
1166 },
1167 "dist": {
1168 "type": "zip",
1169 "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8",
1170 "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8",
1171 "shasum": ""
1172 },
1173 "require": {
1174 "php": ">=5.3.0"
1175 },
1176 "require-dev": {
1177 "doctrine/cache": "~1.0",
1178 "symfony/cache": "~3.1"
1179 },
1180 "type": "library",
1181 "extra": {
1182 "branch-alias": {
1183 "dev-master": "1.5.x-dev"
1184 }
1185 },
1186 "autoload": {
1187 "psr-0": {
1188 "Metadata\\": "src/"
1189 }
1190 },
1191 "notification-url": "https://packagist.org/downloads/",
1192 "license": [
1193 "MIT"
1194 ],
1195 "authors": [
1196 {
1197 "name": "Asmir Mustafic",
1198 "email": "goetas@gmail.com"
1199 },
1200 {
1201 "name": "Johannes M. Schmitt",
1202 "email": "schmittjoh@gmail.com"
1203 }
1204 ],
1205 "description": "Class/method/property metadata management in PHP",
1206 "keywords": [
1207 "annotations",
1208 "metadata",
1209 "xml",
1210 "yaml"
1211 ],
1212 "support": {
1213 "issues": "https://github.com/schmittjoh/metadata/issues",
1214 "source": "https://github.com/schmittjoh/metadata/tree/1.x"
1215 },
1216 "time": "2018-10-26T12:40:10+00:00"
1217 },
1218 {
1219 "name": "jms/parser-lib",
1220 "version": "1.0.0",
1221 "source": {
1222 "type": "git",
1223 "url": "https://github.com/schmittjoh/parser-lib.git",
1224 "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d"
1225 },
1226 "dist": {
1227 "type": "zip",
1228 "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d",
1229 "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d",
1230 "shasum": ""
1231 },
1232 "require": {
1233 "phpoption/phpoption": ">=0.9,<2.0-dev"
1234 },
1235 "type": "library",
1236 "extra": {
1237 "branch-alias": {
1238 "dev-master": "1.0-dev"
1239 }
1240 },
1241 "autoload": {
1242 "psr-0": {
1243 "JMS\\": "src/"
1244 }
1245 },
1246 "notification-url": "https://packagist.org/downloads/",
1247 "license": [
1248 "Apache2"
1249 ],
1250 "description": "A library for easily creating recursive-descent parsers.",
1251 "support": {
1252 "issues": "https://github.com/schmittjoh/parser-lib/issues",
1253 "source": "https://github.com/schmittjoh/parser-lib/tree/1.0.0"
1254 },
1255 "time": "2012-11-18T18:08:43+00:00"
1256 },
1257 {
1258 "name": "jms/serializer",
1259 "version": "1.10.0",
1260 "source": {
1261 "type": "git",
1262 "url": "https://github.com/schmittjoh/serializer.git",
1263 "reference": "62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a"
1264 },
1265 "dist": {
1266 "type": "zip",
1267 "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a",
1268 "reference": "62c7ff6d61f8692eac8be024c542b3d9d0ab8c8a",
1269 "shasum": ""
1270 },
1271 "require": {
1272 "doctrine/annotations": "^1.0",
1273 "doctrine/instantiator": "^1.0.3",
1274 "jms/metadata": "~1.1",
1275 "jms/parser-lib": "1.*",
1276 "php": ">=5.5.0",
1277 "phpcollection/phpcollection": "~0.1",
1278 "phpoption/phpoption": "^1.1"
1279 },
1280 "conflict": {
1281 "jms/serializer-bundle": "<1.2.1",
1282 "twig/twig": "<1.12"
1283 },
1284 "require-dev": {
1285 "doctrine/orm": "~2.1",
1286 "doctrine/phpcr-odm": "^1.3|^2.0",
1287 "ext-pdo_sqlite": "*",
1288 "jackalope/jackalope-doctrine-dbal": "^1.1.5",
1289 "phpunit/phpunit": "^4.8|^5.0",
1290 "propel/propel1": "~1.7",
1291 "psr/container": "^1.0",
1292 "symfony/dependency-injection": "^2.7|^3.3|^4.0",
1293 "symfony/expression-language": "^2.6|^3.0",
1294 "symfony/filesystem": "^2.1",
1295 "symfony/form": "~2.1|^3.0",
1296 "symfony/translation": "^2.1|^3.0",
1297 "symfony/validator": "^2.2|^3.0",
1298 "symfony/yaml": "^2.1|^3.0",
1299 "twig/twig": "~1.12|~2.0"
1300 },
1301 "suggest": {
1302 "doctrine/cache": "Required if you like to use cache functionality.",
1303 "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.",
1304 "symfony/yaml": "Required if you'd like to serialize data to YAML format."
1305 },
1306 "type": "library",
1307 "extra": {
1308 "branch-alias": {
1309 "dev-master": "1.10-dev"
1310 }
1311 },
1312 "autoload": {
1313 "psr-0": {
1314 "JMS\\Serializer": "src/"
1315 }
1316 },
1317 "notification-url": "https://packagist.org/downloads/",
1318 "license": [
1319 "Apache-2.0"
1320 ],
1321 "authors": [
1322 {
1323 "name": "Asmir Mustafic",
1324 "email": "goetas@gmail.com"
1325 },
1326 {
1327 "name": "Johannes M. Schmitt",
1328 "email": "schmittjoh@gmail.com"
1329 }
1330 ],
1331 "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.",
1332 "homepage": "http://jmsyst.com/libs/serializer",
1333 "keywords": [
1334 "deserialization",
1335 "jaxb",
1336 "json",
1337 "serialization",
1338 "xml"
1339 ],
1340 "support": {
1341 "issues": "https://github.com/schmittjoh/serializer/issues",
1342 "source": "https://github.com/schmittjoh/serializer/tree/master"
1343 },
1344 "time": "2017-11-30T18:23:40+00:00"
3341345 },
3351346 {
3361347 "name": "myclabs/deep-copy",
337 "version": "1.8.1",
1348 "version": "1.10.2",
3381349 "source": {
3391350 "type": "git",
3401351 "url": "https://github.com/myclabs/DeepCopy.git",
341 "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8"
342 },
343 "dist": {
344 "type": "zip",
345 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
346 "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
347 "shasum": ""
348 },
349 "require": {
350 "php": "^7.1"
1352 "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
1353 },
1354 "dist": {
1355 "type": "zip",
1356 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
1357 "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
1358 "shasum": ""
1359 },
1360 "require": {
1361 "php": "^7.1 || ^8.0"
3511362 },
3521363 "replace": {
3531364 "myclabs/deep-copy": "self.version"
3781389 "object",
3791390 "object graph"
3801391 ],
381 "time": "2018-06-11T23:09:50+00:00"
382 },
383 {
384 "name": "nette/bootstrap",
385 "version": "v2.4.6",
386 "source": {
387 "type": "git",
388 "url": "https://github.com/nette/bootstrap.git",
389 "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543"
390 },
391 "dist": {
392 "type": "zip",
393 "url": "https://api.github.com/repos/nette/bootstrap/zipball/268816e3f1bb7426c3a4ceec2bd38a036b532543",
394 "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543",
395 "shasum": ""
396 },
397 "require": {
398 "nette/di": "~2.4.7",
399 "nette/utils": "~2.4",
400 "php": ">=5.6.0"
401 },
402 "conflict": {
403 "nette/nette": "<2.2"
404 },
405 "require-dev": {
406 "latte/latte": "~2.2",
407 "nette/application": "~2.3",
408 "nette/caching": "~2.3",
409 "nette/database": "~2.3",
410 "nette/forms": "~2.3",
411 "nette/http": "~2.4.0",
412 "nette/mail": "~2.3",
413 "nette/robot-loader": "^2.4.2 || ^3.0",
414 "nette/safe-stream": "~2.2",
415 "nette/security": "~2.3",
416 "nette/tester": "~2.0",
417 "tracy/tracy": "^2.4.1"
418 },
419 "suggest": {
420 "nette/robot-loader": "to use Configurator::createRobotLoader()",
421 "tracy/tracy": "to use Configurator::enableTracy()"
422 },
423 "type": "library",
424 "extra": {
425 "branch-alias": {
426 "dev-master": "2.4-dev"
427 }
428 },
429 "autoload": {
430 "classmap": [
431 "src/"
432 ]
433 },
434 "notification-url": "https://packagist.org/downloads/",
435 "license": [
436 "BSD-3-Clause",
437 "GPL-2.0",
438 "GPL-3.0"
439 ],
440 "authors": [
441 {
442 "name": "David Grudl",
443 "homepage": "https://davidgrudl.com"
444 },
445 {
446 "name": "Nette Community",
447 "homepage": "https://nette.org/contributors"
448 }
449 ],
450 "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
451 "homepage": "https://nette.org",
452 "keywords": [
453 "bootstrapping",
454 "configurator",
455 "nette"
456 ],
457 "time": "2018-05-17T12:52:20+00:00"
458 },
459 {
460 "name": "nette/di",
461 "version": "v2.4.13",
462 "source": {
463 "type": "git",
464 "url": "https://github.com/nette/di.git",
465 "reference": "3f8f212b02d5c17feb97a7e0a39ab306f40c06ca"
466 },
467 "dist": {
468 "type": "zip",
469 "url": "https://api.github.com/repos/nette/di/zipball/3f8f212b02d5c17feb97a7e0a39ab306f40c06ca",
470 "reference": "3f8f212b02d5c17feb97a7e0a39ab306f40c06ca",
471 "shasum": ""
472 },
473 "require": {
474 "ext-tokenizer": "*",
475 "nette/neon": "^2.3.3 || ~3.0.0",
476 "nette/php-generator": "^2.6.1 || ~3.0.0",
477 "nette/utils": "^2.4.3 || ~3.0.0",
478 "php": ">=5.6.0"
479 },
480 "conflict": {
481 "nette/bootstrap": "<2.4",
482 "nette/nette": "<2.2"
483 },
484 "require-dev": {
485 "nette/tester": "^2.0",
486 "tracy/tracy": "^2.3"
487 },
488 "type": "library",
489 "extra": {
490 "branch-alias": {
491 "dev-master": "2.4-dev"
492 }
493 },
494 "autoload": {
495 "classmap": [
496 "src/"
497 ]
498 },
499 "notification-url": "https://packagist.org/downloads/",
500 "license": [
501 "BSD-3-Clause",
502 "GPL-2.0",
503 "GPL-3.0"
504 ],
505 "authors": [
506 {
507 "name": "David Grudl",
508 "homepage": "https://davidgrudl.com"
509 },
510 {
511 "name": "Nette Community",
512 "homepage": "https://nette.org/contributors"
513 }
514 ],
515 "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.",
516 "homepage": "https://nette.org",
517 "keywords": [
518 "compiled",
519 "di",
520 "dic",
521 "factory",
522 "ioc",
523 "nette",
524 "static"
525 ],
526 "time": "2018-06-11T08:46:01+00:00"
527 },
528 {
529 "name": "nette/finder",
530 "version": "v2.4.2",
531 "source": {
532 "type": "git",
533 "url": "https://github.com/nette/finder.git",
534 "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0"
535 },
536 "dist": {
537 "type": "zip",
538 "url": "https://api.github.com/repos/nette/finder/zipball/ee951a656cb8ac622e5dd33474a01fd2470505a0",
539 "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0",
540 "shasum": ""
541 },
542 "require": {
543 "nette/utils": "~2.4",
544 "php": ">=5.6.0"
545 },
546 "conflict": {
547 "nette/nette": "<2.2"
548 },
549 "require-dev": {
550 "nette/tester": "~2.0",
551 "tracy/tracy": "^2.3"
552 },
553 "type": "library",
554 "extra": {
555 "branch-alias": {
556 "dev-master": "2.4-dev"
557 }
558 },
559 "autoload": {
560 "classmap": [
561 "src/"
562 ]
563 },
564 "notification-url": "https://packagist.org/downloads/",
565 "license": [
566 "BSD-3-Clause",
567 "GPL-2.0",
568 "GPL-3.0"
569 ],
570 "authors": [
571 {
572 "name": "David Grudl",
573 "homepage": "https://davidgrudl.com"
574 },
575 {
576 "name": "Nette Community",
577 "homepage": "https://nette.org/contributors"
578 }
579 ],
580 "description": "🔍 Nette Finder: find files and directories with an intuitive API.",
581 "homepage": "https://nette.org",
582 "keywords": [
583 "filesystem",
584 "glob",
585 "iterator",
586 "nette"
587 ],
588 "time": "2018-06-28T11:49:23+00:00"
589 },
590 {
591 "name": "nette/neon",
592 "version": "v2.4.3",
593 "source": {
594 "type": "git",
595 "url": "https://github.com/nette/neon.git",
596 "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398"
597 },
598 "dist": {
599 "type": "zip",
600 "url": "https://api.github.com/repos/nette/neon/zipball/5e72b1dd3e2d34f0863c5561139a19df6a1ef398",
601 "reference": "5e72b1dd3e2d34f0863c5561139a19df6a1ef398",
602 "shasum": ""
603 },
604 "require": {
605 "ext-iconv": "*",
1392 "support": {
1393 "issues": "https://github.com/myclabs/DeepCopy/issues",
1394 "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
1395 },
1396 "funding": [
1397 {
1398 "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
1399 "type": "tidelift"
1400 }
1401 ],
1402 "time": "2020-11-13T09:40:50+00:00"
1403 },
1404 {
1405 "name": "netresearch/jsonmapper",
1406 "version": "v2.1.0",
1407 "source": {
1408 "type": "git",
1409 "url": "https://github.com/cweiske/jsonmapper.git",
1410 "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e"
1411 },
1412 "dist": {
1413 "type": "zip",
1414 "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e",
1415 "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e",
1416 "shasum": ""
1417 },
1418 "require": {
6061419 "ext-json": "*",
607 "php": ">=5.6.0"
608 },
609 "require-dev": {
610 "nette/tester": "~2.0",
611 "tracy/tracy": "^2.3"
612 },
613 "type": "library",
614 "extra": {
615 "branch-alias": {
616 "dev-master": "2.4-dev"
617 }
618 },
619 "autoload": {
620 "classmap": [
621 "src/"
622 ]
623 },
624 "notification-url": "https://packagist.org/downloads/",
625 "license": [
626 "BSD-3-Clause",
627 "GPL-2.0",
628 "GPL-3.0"
629 ],
630 "authors": [
631 {
632 "name": "David Grudl",
633 "homepage": "https://davidgrudl.com"
634 },
635 {
636 "name": "Nette Community",
637 "homepage": "https://nette.org/contributors"
638 }
639 ],
640 "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
641 "homepage": "http://ne-on.org",
642 "keywords": [
643 "export",
644 "import",
645 "neon",
646 "nette",
647 "yaml"
648 ],
649 "time": "2018-03-21T12:12:21+00:00"
650 },
651 {
652 "name": "nette/php-generator",
653 "version": "v3.0.4",
654 "source": {
655 "type": "git",
656 "url": "https://github.com/nette/php-generator.git",
657 "reference": "b381ecacbf5a0b5f99cc0b303d5b0578d409f446"
658 },
659 "dist": {
660 "type": "zip",
661 "url": "https://api.github.com/repos/nette/php-generator/zipball/b381ecacbf5a0b5f99cc0b303d5b0578d409f446",
662 "reference": "b381ecacbf5a0b5f99cc0b303d5b0578d409f446",
663 "shasum": ""
664 },
665 "require": {
666 "nette/utils": "^2.4.2 || ~3.0.0",
667 "php": ">=7.0"
668 },
669 "conflict": {
670 "nette/nette": "<2.2"
671 },
672 "require-dev": {
673 "nette/tester": "^2.0",
674 "tracy/tracy": "^2.3"
675 },
676 "type": "library",
677 "extra": {
678 "branch-alias": {
679 "dev-master": "3.0-dev"
680 }
681 },
682 "autoload": {
683 "classmap": [
684 "src/"
685 ]
686 },
687 "notification-url": "https://packagist.org/downloads/",
688 "license": [
689 "BSD-3-Clause",
690 "GPL-2.0",
691 "GPL-3.0"
692 ],
693 "authors": [
694 {
695 "name": "David Grudl",
696 "homepage": "https://davidgrudl.com"
697 },
698 {
699 "name": "Nette Community",
700 "homepage": "https://nette.org/contributors"
701 }
702 ],
703 "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.2 features.",
704 "homepage": "https://nette.org",
705 "keywords": [
706 "code",
707 "nette",
708 "php",
709 "scaffolding"
710 ],
711 "time": "2018-04-26T16:48:20+00:00"
712 },
713 {
714 "name": "nette/robot-loader",
715 "version": "v3.0.4",
716 "source": {
717 "type": "git",
718 "url": "https://github.com/nette/robot-loader.git",
719 "reference": "3cf88781a05e0bf4618ae605361afcbaa4d5b392"
720 },
721 "dist": {
722 "type": "zip",
723 "url": "https://api.github.com/repos/nette/robot-loader/zipball/3cf88781a05e0bf4618ae605361afcbaa4d5b392",
724 "reference": "3cf88781a05e0bf4618ae605361afcbaa4d5b392",
725 "shasum": ""
726 },
727 "require": {
728 "ext-tokenizer": "*",
729 "nette/finder": "^2.3 || ^3.0",
730 "nette/utils": "^2.4 || ^3.0",
731 "php": ">=5.6.0"
732 },
733 "conflict": {
734 "nette/nette": "<2.2"
735 },
736 "require-dev": {
737 "nette/tester": "^2.0",
738 "tracy/tracy": "^2.3"
739 },
740 "type": "library",
741 "extra": {
742 "branch-alias": {
743 "dev-master": "3.0-dev"
744 }
745 },
746 "autoload": {
747 "classmap": [
748 "src/"
749 ]
750 },
751 "notification-url": "https://packagist.org/downloads/",
752 "license": [
753 "BSD-3-Clause",
754 "GPL-2.0",
755 "GPL-3.0"
756 ],
757 "authors": [
758 {
759 "name": "David Grudl",
760 "homepage": "https://davidgrudl.com"
761 },
762 {
763 "name": "Nette Community",
764 "homepage": "https://nette.org/contributors"
765 }
766 ],
767 "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
768 "homepage": "https://nette.org",
769 "keywords": [
770 "autoload",
771 "class",
772 "interface",
773 "nette",
774 "trait"
775 ],
776 "time": "2018-06-22T09:34:04+00:00"
777 },
778 {
779 "name": "nette/utils",
780 "version": "v2.5.2",
781 "source": {
782 "type": "git",
783 "url": "https://github.com/nette/utils.git",
784 "reference": "183069866dc477fcfbac393ed486aaa6d93d19a5"
785 },
786 "dist": {
787 "type": "zip",
788 "url": "https://api.github.com/repos/nette/utils/zipball/183069866dc477fcfbac393ed486aaa6d93d19a5",
789 "reference": "183069866dc477fcfbac393ed486aaa6d93d19a5",
790 "shasum": ""
791 },
792 "require": {
793 "php": ">=5.6.0"
794 },
795 "conflict": {
796 "nette/nette": "<2.2"
797 },
798 "require-dev": {
799 "nette/tester": "~2.0",
800 "tracy/tracy": "^2.3"
801 },
802 "suggest": {
803 "ext-gd": "to use Image",
804 "ext-iconv": "to use Strings::webalize() and toAscii()",
805 "ext-intl": "for script transliteration in Strings::webalize() and toAscii()",
806 "ext-json": "to use Nette\\Utils\\Json",
807 "ext-mbstring": "to use Strings::lower() etc...",
808 "ext-xml": "to use Strings::length() etc. when mbstring is not available"
809 },
810 "type": "library",
811 "extra": {
812 "branch-alias": {
813 "dev-master": "2.5-dev"
814 }
815 },
816 "autoload": {
817 "classmap": [
818 "src/"
819 ],
820 "files": [
821 "src/loader.php"
822 ]
823 },
824 "notification-url": "https://packagist.org/downloads/",
825 "license": [
826 "BSD-3-Clause",
827 "GPL-2.0",
828 "GPL-3.0"
829 ],
830 "authors": [
831 {
832 "name": "David Grudl",
833 "homepage": "https://davidgrudl.com"
834 },
835 {
836 "name": "Nette Community",
837 "homepage": "https://nette.org/contributors"
838 }
839 ],
840 "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
841 "homepage": "https://nette.org",
842 "keywords": [
843 "array",
844 "core",
845 "datetime",
846 "images",
847 "json",
848 "nette",
849 "paginator",
850 "password",
851 "slugify",
852 "string",
853 "unicode",
854 "utf-8",
855 "utility",
856 "validation"
857 ],
858 "time": "2018-05-02T17:16:08+00:00"
1420 "ext-pcre": "*",
1421 "ext-reflection": "*",
1422 "ext-spl": "*",
1423 "php": ">=5.6"
1424 },
1425 "require-dev": {
1426 "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0",
1427 "squizlabs/php_codesniffer": "~3.5"
1428 },
1429 "type": "library",
1430 "autoload": {
1431 "psr-0": {
1432 "JsonMapper": "src/"
1433 }
1434 },
1435 "notification-url": "https://packagist.org/downloads/",
1436 "license": [
1437 "OSL-3.0"
1438 ],
1439 "authors": [
1440 {
1441 "name": "Christian Weiske",
1442 "email": "cweiske@cweiske.de",
1443 "homepage": "http://github.com/cweiske/jsonmapper/",
1444 "role": "Developer"
1445 }
1446 ],
1447 "description": "Map nested JSON structures onto PHP classes",
1448 "support": {
1449 "email": "cweiske@cweiske.de",
1450 "issues": "https://github.com/cweiske/jsonmapper/issues",
1451 "source": "https://github.com/cweiske/jsonmapper/tree/master"
1452 },
1453 "time": "2020-04-16T18:48:43+00:00"
8591454 },
8601455 {
8611456 "name": "nikic/php-parser",
862 "version": "v4.0.2",
1457 "version": "v4.10.4",
8631458 "source": {
8641459 "type": "git",
8651460 "url": "https://github.com/nikic/PHP-Parser.git",
866 "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12"
867 },
868 "dist": {
869 "type": "zip",
870 "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/35b8caf75e791ba1b2d24fec1552168d72692b12",
871 "reference": "35b8caf75e791ba1b2d24fec1552168d72692b12",
1461 "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
1462 },
1463 "dist": {
1464 "type": "zip",
1465 "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
1466 "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
8721467 "shasum": ""
8731468 },
8741469 "require": {
8761471 "php": ">=7.0"
8771472 },
8781473 "require-dev": {
879 "phpunit/phpunit": "^6.5 || ^7.0"
1474 "ircmaxell/php-yacc": "^0.0.7",
1475 "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
8801476 },
8811477 "bin": [
8821478 "bin/php-parse"
8841480 "type": "library",
8851481 "extra": {
8861482 "branch-alias": {
887 "dev-master": "4.0-dev"
1483 "dev-master": "4.9-dev"
8881484 }
8891485 },
8901486 "autoload": {
9061502 "parser",
9071503 "php"
9081504 ],
909 "time": "2018-06-03T11:33:10+00:00"
910 },
911 {
912 "name": "ocramius/package-versions",
913 "version": "1.3.0",
914 "source": {
915 "type": "git",
916 "url": "https://github.com/Ocramius/PackageVersions.git",
917 "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f"
918 },
919 "dist": {
920 "type": "zip",
921 "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f",
922 "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f",
923 "shasum": ""
924 },
925 "require": {
926 "composer-plugin-api": "^1.0.0",
927 "php": "^7.1.0"
928 },
929 "require-dev": {
930 "composer/composer": "^1.6.3",
931 "ext-zip": "*",
932 "infection/infection": "^0.7.1",
933 "phpunit/phpunit": "^7.0.0"
934 },
935 "type": "composer-plugin",
936 "extra": {
937 "class": "PackageVersions\\Installer",
938 "branch-alias": {
939 "dev-master": "2.0.x-dev"
940 }
941 },
942 "autoload": {
943 "psr-4": {
944 "PackageVersions\\": "src/PackageVersions"
945 }
946 },
947 "notification-url": "https://packagist.org/downloads/",
948 "license": [
949 "MIT"
950 ],
951 "authors": [
952 {
953 "name": "Marco Pivetta",
954 "email": "ocramius@gmail.com"
955 }
956 ],
957 "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
958 "time": "2018-02-05T13:05:30+00:00"
1505 "support": {
1506 "issues": "https://github.com/nikic/PHP-Parser/issues",
1507 "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
1508 },
1509 "time": "2020-12-20T10:01:03+00:00"
1510 },
1511 {
1512 "name": "openlss/lib-array2xml",
1513 "version": "1.0.0",
1514 "source": {
1515 "type": "git",
1516 "url": "https://github.com/nullivex/lib-array2xml.git",
1517 "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90"
1518 },
1519 "dist": {
1520 "type": "zip",
1521 "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
1522 "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
1523 "shasum": ""
1524 },
1525 "require": {
1526 "php": ">=5.3.2"
1527 },
1528 "type": "library",
1529 "autoload": {
1530 "psr-0": {
1531 "LSS": ""
1532 }
1533 },
1534 "notification-url": "https://packagist.org/downloads/",
1535 "license": [
1536 "Apache-2.0"
1537 ],
1538 "authors": [
1539 {
1540 "name": "Bryan Tong",
1541 "email": "bryan@nullivex.com",
1542 "homepage": "https://www.nullivex.com"
1543 },
1544 {
1545 "name": "Tony Butler",
1546 "email": "spudz76@gmail.com",
1547 "homepage": "https://www.nullivex.com"
1548 }
1549 ],
1550 "description": "Array2XML conversion library credit to lalit.org",
1551 "homepage": "https://www.nullivex.com",
1552 "keywords": [
1553 "array",
1554 "array conversion",
1555 "xml",
1556 "xml conversion"
1557 ],
1558 "support": {
1559 "issues": "https://github.com/nullivex/lib-array2xml/issues",
1560 "source": "https://github.com/nullivex/lib-array2xml/tree/master"
1561 },
1562 "time": "2019-03-29T20:06:56+00:00"
9591563 },
9601564 {
9611565 "name": "phar-io/manifest",
962 "version": "1.0.1",
1566 "version": "2.0.1",
9631567 "source": {
9641568 "type": "git",
9651569 "url": "https://github.com/phar-io/manifest.git",
966 "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
967 },
968 "dist": {
969 "type": "zip",
970 "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
971 "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
1570 "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
1571 },
1572 "dist": {
1573 "type": "zip",
1574 "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
1575 "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
9721576 "shasum": ""
9731577 },
9741578 "require": {
9751579 "ext-dom": "*",
9761580 "ext-phar": "*",
977 "phar-io/version": "^1.0.1",
978 "php": "^5.6 || ^7.0"
979 },
980 "type": "library",
981 "extra": {
982 "branch-alias": {
983 "dev-master": "1.0.x-dev"
1581 "ext-xmlwriter": "*",
1582 "phar-io/version": "^3.0.1",
1583 "php": "^7.2 || ^8.0"
1584 },
1585 "type": "library",
1586 "extra": {
1587 "branch-alias": {
1588 "dev-master": "2.0.x-dev"
9841589 }
9851590 },
9861591 "autoload": {
10101615 }
10111616 ],
10121617 "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
1013 "time": "2017-03-05T18:14:27+00:00"
1618 "support": {
1619 "issues": "https://github.com/phar-io/manifest/issues",
1620 "source": "https://github.com/phar-io/manifest/tree/master"
1621 },
1622 "time": "2020-06-27T14:33:11+00:00"
10141623 },
10151624 {
10161625 "name": "phar-io/version",
1017 "version": "1.0.1",
1626 "version": "3.0.4",
10181627 "source": {
10191628 "type": "git",
10201629 "url": "https://github.com/phar-io/version.git",
1021 "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
1022 },
1023 "dist": {
1024 "type": "zip",
1025 "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
1026 "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
1027 "shasum": ""
1028 },
1029 "require": {
1030 "php": "^5.6 || ^7.0"
1630 "reference": "e4782611070e50613683d2b9a57730e9a3ba5451"
1631 },
1632 "dist": {
1633 "type": "zip",
1634 "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451",
1635 "reference": "e4782611070e50613683d2b9a57730e9a3ba5451",
1636 "shasum": ""
1637 },
1638 "require": {
1639 "php": "^7.2 || ^8.0"
10311640 },
10321641 "type": "library",
10331642 "autoload": {
10571666 }
10581667 ],
10591668 "description": "Library for handling version information and constraints",
1060 "time": "2017-03-05T17:38:23+00:00"
1669 "support": {
1670 "issues": "https://github.com/phar-io/version/issues",
1671 "source": "https://github.com/phar-io/version/tree/3.0.4"
1672 },
1673 "time": "2020-12-13T23:18:30+00:00"
1674 },
1675 {
1676 "name": "phpcollection/phpcollection",
1677 "version": "0.5.0",
1678 "source": {
1679 "type": "git",
1680 "url": "https://github.com/schmittjoh/php-collection.git",
1681 "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6"
1682 },
1683 "dist": {
1684 "type": "zip",
1685 "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
1686 "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
1687 "shasum": ""
1688 },
1689 "require": {
1690 "phpoption/phpoption": "1.*"
1691 },
1692 "type": "library",
1693 "extra": {
1694 "branch-alias": {
1695 "dev-master": "0.4-dev"
1696 }
1697 },
1698 "autoload": {
1699 "psr-0": {
1700 "PhpCollection": "src/"
1701 }
1702 },
1703 "notification-url": "https://packagist.org/downloads/",
1704 "license": [
1705 "Apache2"
1706 ],
1707 "authors": [
1708 {
1709 "name": "Johannes M. Schmitt",
1710 "email": "schmittjoh@gmail.com"
1711 }
1712 ],
1713 "description": "General-Purpose Collection Library for PHP",
1714 "keywords": [
1715 "collection",
1716 "list",
1717 "map",
1718 "sequence",
1719 "set"
1720 ],
1721 "support": {
1722 "issues": "https://github.com/schmittjoh/php-collection/issues",
1723 "source": "https://github.com/schmittjoh/php-collection/tree/master"
1724 },
1725 "time": "2015-05-17T12:39:23+00:00"
10611726 },
10621727 {
10631728 "name": "phpdocumentor/reflection-common",
1064 "version": "1.0.1",
1729 "version": "2.2.0",
10651730 "source": {
10661731 "type": "git",
10671732 "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
1068 "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
1069 },
1070 "dist": {
1071 "type": "zip",
1072 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
1073 "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
1074 "shasum": ""
1075 },
1076 "require": {
1077 "php": ">=5.5"
1078 },
1079 "require-dev": {
1080 "phpunit/phpunit": "^4.6"
1081 },
1082 "type": "library",
1083 "extra": {
1084 "branch-alias": {
1085 "dev-master": "1.0.x-dev"
1733 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
1734 },
1735 "dist": {
1736 "type": "zip",
1737 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1738 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
1739 "shasum": ""
1740 },
1741 "require": {
1742 "php": "^7.2 || ^8.0"
1743 },
1744 "type": "library",
1745 "extra": {
1746 "branch-alias": {
1747 "dev-2.x": "2.x-dev"
10861748 }
10871749 },
10881750 "autoload": {
10891751 "psr-4": {
1090 "phpDocumentor\\Reflection\\": [
1091 "src"
1092 ]
1752 "phpDocumentor\\Reflection\\": "src/"
10931753 }
10941754 },
10951755 "notification-url": "https://packagist.org/downloads/",
11111771 "reflection",
11121772 "static analysis"
11131773 ],
1114 "time": "2017-09-11T18:02:19+00:00"
1774 "support": {
1775 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
1776 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
1777 },
1778 "time": "2020-06-27T09:03:43+00:00"
11151779 },
11161780 {
11171781 "name": "phpdocumentor/reflection-docblock",
1118 "version": "4.3.0",
1782 "version": "5.2.2",
11191783 "source": {
11201784 "type": "git",
11211785 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
1122 "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
1123 },
1124 "dist": {
1125 "type": "zip",
1126 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
1127 "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
1128 "shasum": ""
1129 },
1130 "require": {
1131 "php": "^7.0",
1132 "phpdocumentor/reflection-common": "^1.0.0",
1133 "phpdocumentor/type-resolver": "^0.4.0",
1134 "webmozart/assert": "^1.0"
1135 },
1136 "require-dev": {
1137 "doctrine/instantiator": "~1.0.5",
1138 "mockery/mockery": "^1.0",
1139 "phpunit/phpunit": "^6.4"
1140 },
1141 "type": "library",
1142 "extra": {
1143 "branch-alias": {
1144 "dev-master": "4.x-dev"
1786 "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
1787 },
1788 "dist": {
1789 "type": "zip",
1790 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
1791 "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
1792 "shasum": ""
1793 },
1794 "require": {
1795 "ext-filter": "*",
1796 "php": "^7.2 || ^8.0",
1797 "phpdocumentor/reflection-common": "^2.2",
1798 "phpdocumentor/type-resolver": "^1.3",
1799 "webmozart/assert": "^1.9.1"
1800 },
1801 "require-dev": {
1802 "mockery/mockery": "~1.3.2"
1803 },
1804 "type": "library",
1805 "extra": {
1806 "branch-alias": {
1807 "dev-master": "5.x-dev"
11451808 }
11461809 },
11471810 "autoload": {
11481811 "psr-4": {
1149 "phpDocumentor\\Reflection\\": [
1150 "src/"
1151 ]
1812 "phpDocumentor\\Reflection\\": "src"
11521813 }
11531814 },
11541815 "notification-url": "https://packagist.org/downloads/",
11591820 {
11601821 "name": "Mike van Riel",
11611822 "email": "me@mikevanriel.com"
1823 },
1824 {
1825 "name": "Jaap van Otterdijk",
1826 "email": "account@ijaap.nl"
11621827 }
11631828 ],
11641829 "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
1165 "time": "2017-11-30T07:14:17+00:00"
1830 "support": {
1831 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
1832 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
1833 },
1834 "time": "2020-09-03T19:13:55+00:00"
11661835 },
11671836 {
11681837 "name": "phpdocumentor/type-resolver",
1169 "version": "0.4.0",
1838 "version": "1.4.0",
11701839 "source": {
11711840 "type": "git",
11721841 "url": "https://github.com/phpDocumentor/TypeResolver.git",
1173 "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
1174 },
1175 "dist": {
1176 "type": "zip",
1177 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
1178 "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
1179 "shasum": ""
1180 },
1181 "require": {
1182 "php": "^5.5 || ^7.0",
1183 "phpdocumentor/reflection-common": "^1.0"
1184 },
1185 "require-dev": {
1186 "mockery/mockery": "^0.9.4",
1187 "phpunit/phpunit": "^5.2||^4.8.24"
1188 },
1189 "type": "library",
1190 "extra": {
1191 "branch-alias": {
1192 "dev-master": "1.0.x-dev"
1842 "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
1843 },
1844 "dist": {
1845 "type": "zip",
1846 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
1847 "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
1848 "shasum": ""
1849 },
1850 "require": {
1851 "php": "^7.2 || ^8.0",
1852 "phpdocumentor/reflection-common": "^2.0"
1853 },
1854 "require-dev": {
1855 "ext-tokenizer": "*"
1856 },
1857 "type": "library",
1858 "extra": {
1859 "branch-alias": {
1860 "dev-1.x": "1.x-dev"
11931861 }
11941862 },
11951863 "autoload": {
11961864 "psr-4": {
1197 "phpDocumentor\\Reflection\\": [
1198 "src/"
1199 ]
1865 "phpDocumentor\\Reflection\\": "src"
12001866 }
12011867 },
12021868 "notification-url": "https://packagist.org/downloads/",
12091875 "email": "me@mikevanriel.com"
12101876 }
12111877 ],
1212 "time": "2017-07-14T14:27:02+00:00"
1878 "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
1879 "support": {
1880 "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
1881 "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
1882 },
1883 "time": "2020-09-17T18:55:26+00:00"
1884 },
1885 {
1886 "name": "phpoption/phpoption",
1887 "version": "1.7.5",
1888 "source": {
1889 "type": "git",
1890 "url": "https://github.com/schmittjoh/php-option.git",
1891 "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525"
1892 },
1893 "dist": {
1894 "type": "zip",
1895 "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525",
1896 "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525",
1897 "shasum": ""
1898 },
1899 "require": {
1900 "php": "^5.5.9 || ^7.0 || ^8.0"
1901 },
1902 "require-dev": {
1903 "bamarni/composer-bin-plugin": "^1.4.1",
1904 "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0"
1905 },
1906 "type": "library",
1907 "extra": {
1908 "branch-alias": {
1909 "dev-master": "1.7-dev"
1910 }
1911 },
1912 "autoload": {
1913 "psr-4": {
1914 "PhpOption\\": "src/PhpOption/"
1915 }
1916 },
1917 "notification-url": "https://packagist.org/downloads/",
1918 "license": [
1919 "Apache-2.0"
1920 ],
1921 "authors": [
1922 {
1923 "name": "Johannes M. Schmitt",
1924 "email": "schmittjoh@gmail.com"
1925 },
1926 {
1927 "name": "Graham Campbell",
1928 "email": "graham@alt-three.com"
1929 }
1930 ],
1931 "description": "Option Type for PHP",
1932 "keywords": [
1933 "language",
1934 "option",
1935 "php",
1936 "type"
1937 ],
1938 "support": {
1939 "issues": "https://github.com/schmittjoh/php-option/issues",
1940 "source": "https://github.com/schmittjoh/php-option/tree/1.7.5"
1941 },
1942 "funding": [
1943 {
1944 "url": "https://github.com/GrahamCampbell",
1945 "type": "github"
1946 },
1947 {
1948 "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
1949 "type": "tidelift"
1950 }
1951 ],
1952 "time": "2020-07-20T17:29:33+00:00"
12131953 },
12141954 {
12151955 "name": "phpspec/prophecy",
1216 "version": "1.7.6",
1956 "version": "1.12.2",
12171957 "source": {
12181958 "type": "git",
12191959 "url": "https://github.com/phpspec/prophecy.git",
1220 "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712"
1221 },
1222 "dist": {
1223 "type": "zip",
1224 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
1225 "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
1226 "shasum": ""
1227 },
1228 "require": {
1229 "doctrine/instantiator": "^1.0.2",
1230 "php": "^5.3|^7.0",
1231 "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
1232 "sebastian/comparator": "^1.1|^2.0|^3.0",
1233 "sebastian/recursion-context": "^1.0|^2.0|^3.0"
1234 },
1235 "require-dev": {
1236 "phpspec/phpspec": "^2.5|^3.2",
1237 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
1238 },
1239 "type": "library",
1240 "extra": {
1241 "branch-alias": {
1242 "dev-master": "1.7.x-dev"
1243 }
1244 },
1245 "autoload": {
1246 "psr-0": {
1247 "Prophecy\\": "src/"
1960 "reference": "245710e971a030f42e08f4912863805570f23d39"
1961 },
1962 "dist": {
1963 "type": "zip",
1964 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39",
1965 "reference": "245710e971a030f42e08f4912863805570f23d39",
1966 "shasum": ""
1967 },
1968 "require": {
1969 "doctrine/instantiator": "^1.2",
1970 "php": "^7.2 || ~8.0, <8.1",
1971 "phpdocumentor/reflection-docblock": "^5.2",
1972 "sebastian/comparator": "^3.0 || ^4.0",
1973 "sebastian/recursion-context": "^3.0 || ^4.0"
1974 },
1975 "require-dev": {
1976 "phpspec/phpspec": "^6.0",
1977 "phpunit/phpunit": "^8.0 || ^9.0"
1978 },
1979 "type": "library",
1980 "extra": {
1981 "branch-alias": {
1982 "dev-master": "1.11.x-dev"
1983 }
1984 },
1985 "autoload": {
1986 "psr-4": {
1987 "Prophecy\\": "src/Prophecy"
12481988 }
12491989 },
12501990 "notification-url": "https://packagist.org/downloads/",
12722012 "spy",
12732013 "stub"
12742014 ],
1275 "time": "2018-04-18T13:57:24+00:00"
2015 "support": {
2016 "issues": "https://github.com/phpspec/prophecy/issues",
2017 "source": "https://github.com/phpspec/prophecy/tree/1.12.2"
2018 },
2019 "time": "2020-12-19T10:15:11+00:00"
2020 },
2021 {
2022 "name": "phpstan/extension-installer",
2023 "version": "1.1.0",
2024 "source": {
2025 "type": "git",
2026 "url": "https://github.com/phpstan/extension-installer.git",
2027 "reference": "66c7adc9dfa38b6b5838a9fb728b68a7d8348051"
2028 },
2029 "dist": {
2030 "type": "zip",
2031 "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/66c7adc9dfa38b6b5838a9fb728b68a7d8348051",
2032 "reference": "66c7adc9dfa38b6b5838a9fb728b68a7d8348051",
2033 "shasum": ""
2034 },
2035 "require": {
2036 "composer-plugin-api": "^1.1 || ^2.0",
2037 "php": "^7.1 || ^8.0",
2038 "phpstan/phpstan": ">=0.11.6"
2039 },
2040 "require-dev": {
2041 "composer/composer": "^1.8",
2042 "phing/phing": "^2.16.3",
2043 "php-parallel-lint/php-parallel-lint": "^1.2.0",
2044 "phpstan/phpstan-strict-rules": "^0.11 || ^0.12"
2045 },
2046 "type": "composer-plugin",
2047 "extra": {
2048 "class": "PHPStan\\ExtensionInstaller\\Plugin"
2049 },
2050 "autoload": {
2051 "psr-4": {
2052 "PHPStan\\ExtensionInstaller\\": "src/"
2053 }
2054 },
2055 "notification-url": "https://packagist.org/downloads/",
2056 "license": [
2057 "MIT"
2058 ],
2059 "description": "Composer plugin for automatic installation of PHPStan extensions",
2060 "support": {
2061 "issues": "https://github.com/phpstan/extension-installer/issues",
2062 "source": "https://github.com/phpstan/extension-installer/tree/1.1.0"
2063 },
2064 "time": "2020-12-13T13:06:13+00:00"
12762065 },
12772066 {
12782067 "name": "phpstan/phpdoc-parser",
1279 "version": "0.3",
2068 "version": "0.4.9",
12802069 "source": {
12812070 "type": "git",
12822071 "url": "https://github.com/phpstan/phpdoc-parser.git",
1283 "reference": "ed3223362174b8067729930439e139794e9e514a"
1284 },
1285 "dist": {
1286 "type": "zip",
1287 "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ed3223362174b8067729930439e139794e9e514a",
1288 "reference": "ed3223362174b8067729930439e139794e9e514a",
1289 "shasum": ""
1290 },
1291 "require": {
1292 "php": "~7.1"
1293 },
1294 "require-dev": {
1295 "consistence/coding-standard": "^2.0.0",
2072 "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531"
2073 },
2074 "dist": {
2075 "type": "zip",
2076 "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531",
2077 "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531",
2078 "shasum": ""
2079 },
2080 "require": {
2081 "php": "^7.1 || ^8.0"
2082 },
2083 "require-dev": {
2084 "consistence/coding-standard": "^3.5",
2085 "ergebnis/composer-normalize": "^2.0.2",
12962086 "jakub-onderka/php-parallel-lint": "^0.9.2",
12972087 "phing/phing": "^2.16.0",
1298 "phpstan/phpstan": "^0.10@dev",
2088 "phpstan/extension-installer": "^1.0",
2089 "phpstan/phpstan": "^0.12.26",
2090 "phpstan/phpstan-strict-rules": "^0.12",
12992091 "phpunit/phpunit": "^6.3",
1300 "slevomat/coding-standard": "^3.3.0",
1301 "symfony/process": "^3.4 || ^4.0"
1302 },
1303 "type": "library",
1304 "extra": {
1305 "branch-alias": {
1306 "dev-master": "0.3-dev"
2092 "slevomat/coding-standard": "^4.7.2",
2093 "symfony/process": "^4.0"
2094 },
2095 "type": "library",
2096 "extra": {
2097 "branch-alias": {
2098 "dev-master": "0.4-dev"
13072099 }
13082100 },
13092101 "autoload": {
13182110 "MIT"
13192111 ],
13202112 "description": "PHPDoc parser with support for nullable, intersection and generic types",
1321 "time": "2018-06-20T17:48:01+00:00"
2113 "support": {
2114 "issues": "https://github.com/phpstan/phpdoc-parser/issues",
2115 "source": "https://github.com/phpstan/phpdoc-parser/tree/master"
2116 },
2117 "time": "2020-08-03T20:32:43+00:00"
13222118 },
13232119 {
13242120 "name": "phpstan/phpstan",
1325 "version": "0.10.1",
2121 "version": "0.12.68",
13262122 "source": {
13272123 "type": "git",
13282124 "url": "https://github.com/phpstan/phpstan.git",
1329 "reference": "3179cf27542e9e47acb548150e7ca21ca5ab92d6"
1330 },
1331 "dist": {
1332 "type": "zip",
1333 "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3179cf27542e9e47acb548150e7ca21ca5ab92d6",
1334 "reference": "3179cf27542e9e47acb548150e7ca21ca5ab92d6",
1335 "shasum": ""
1336 },
1337 "require": {
1338 "composer/xdebug-handler": "^1.0",
1339 "jean85/pretty-package-versions": "^1.0.3",
1340 "nette/bootstrap": "^2.4 || ^3.0",
1341 "nette/di": "^2.4.7 || ^3.0",
1342 "nette/robot-loader": "^3.0.1",
1343 "nette/utils": "^2.4.5 || ^3.0",
1344 "nikic/php-parser": "^4.0.2",
1345 "php": "~7.1",
1346 "phpstan/phpdoc-parser": "^0.3",
1347 "symfony/console": "~3.2 || ~4.0",
1348 "symfony/finder": "~3.2 || ~4.0"
1349 },
1350 "require-dev": {
1351 "brianium/paratest": "^2.0",
1352 "consistence/coding-standard": "^3.3",
1353 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
1354 "ext-gd": "*",
1355 "ext-intl": "*",
1356 "ext-mysqli": "*",
1357 "ext-zip": "*",
1358 "jakub-onderka/php-parallel-lint": "^1.0",
1359 "phing/phing": "^2.16.0",
1360 "phpstan/phpstan-deprecation-rules": "^0.10.2",
1361 "phpstan/phpstan-php-parser": "^0.10",
1362 "phpstan/phpstan-phpunit": "^0.10",
1363 "phpstan/phpstan-strict-rules": "^0.10",
1364 "phpunit/phpunit": "^7.0",
1365 "slevomat/coding-standard": "^4.6.2"
2125 "reference": "ddbe01af0706ee094c3f1ce9730b35aebb508d3d"
2126 },
2127 "dist": {
2128 "type": "zip",
2129 "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ddbe01af0706ee094c3f1ce9730b35aebb508d3d",
2130 "reference": "ddbe01af0706ee094c3f1ce9730b35aebb508d3d",
2131 "shasum": ""
2132 },
2133 "require": {
2134 "php": "^7.1|^8.0"
2135 },
2136 "conflict": {
2137 "phpstan/phpstan-shim": "*"
13662138 },
13672139 "bin": [
1368 "bin/phpstan"
1369 ],
1370 "type": "library",
1371 "extra": {
1372 "branch-alias": {
1373 "dev-master": "0.10-dev"
2140 "phpstan",
2141 "phpstan.phar"
2142 ],
2143 "type": "library",
2144 "extra": {
2145 "branch-alias": {
2146 "dev-master": "0.12-dev"
2147 }
2148 },
2149 "autoload": {
2150 "files": [
2151 "bootstrap.php"
2152 ]
2153 },
2154 "notification-url": "https://packagist.org/downloads/",
2155 "license": [
2156 "MIT"
2157 ],
2158 "description": "PHPStan - PHP Static Analysis Tool",
2159 "support": {
2160 "issues": "https://github.com/phpstan/phpstan/issues",
2161 "source": "https://github.com/phpstan/phpstan/tree/0.12.68"
2162 },
2163 "funding": [
2164 {
2165 "url": "https://github.com/ondrejmirtes",
2166 "type": "github"
2167 },
2168 {
2169 "url": "https://www.patreon.com/phpstan",
2170 "type": "patreon"
2171 },
2172 {
2173 "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
2174 "type": "tidelift"
2175 }
2176 ],
2177 "time": "2021-01-18T12:29:17+00:00"
2178 },
2179 {
2180 "name": "phpstan/phpstan-phpunit",
2181 "version": "0.12.17",
2182 "source": {
2183 "type": "git",
2184 "url": "https://github.com/phpstan/phpstan-phpunit.git",
2185 "reference": "432575b41cf2d4f44e460234acaf56119ed97d36"
2186 },
2187 "dist": {
2188 "type": "zip",
2189 "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/432575b41cf2d4f44e460234acaf56119ed97d36",
2190 "reference": "432575b41cf2d4f44e460234acaf56119ed97d36",
2191 "shasum": ""
2192 },
2193 "require": {
2194 "php": "^7.1 || ^8.0",
2195 "phpstan/phpstan": "^0.12.60"
2196 },
2197 "conflict": {
2198 "phpunit/phpunit": "<7.0"
2199 },
2200 "require-dev": {
2201 "phing/phing": "^2.16.3",
2202 "php-parallel-lint/php-parallel-lint": "^1.2",
2203 "phpstan/phpstan-strict-rules": "^0.12.6",
2204 "phpunit/phpunit": "^7.5.20"
2205 },
2206 "type": "phpstan-extension",
2207 "extra": {
2208 "branch-alias": {
2209 "dev-master": "0.12-dev"
2210 },
2211 "phpstan": {
2212 "includes": [
2213 "extension.neon",
2214 "rules.neon"
2215 ]
13742216 }
13752217 },
13762218 "autoload": {
13772219 "psr-4": {
1378 "PHPStan\\": [
1379 "src/",
1380 "build/PHPStan"
1381 ]
2220 "PHPStan\\": "src/"
13822221 }
13832222 },
13842223 "notification-url": "https://packagist.org/downloads/",
13852224 "license": [
13862225 "MIT"
13872226 ],
1388 "description": "PHPStan - PHP Static Analysis Tool",
1389 "time": "2018-07-01T18:22:12+00:00"
2227 "description": "PHPUnit extensions and rules for PHPStan",
2228 "support": {
2229 "issues": "https://github.com/phpstan/phpstan-phpunit/issues",
2230 "source": "https://github.com/phpstan/phpstan-phpunit/tree/0.12.17"
2231 },
2232 "time": "2020-12-13T12:12:51+00:00"
13902233 },
13912234 {
13922235 "name": "phpunit/php-code-coverage",
1393 "version": "6.0.7",
2236 "version": "9.2.5",
13942237 "source": {
13952238 "type": "git",
13962239 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1397 "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a"
1398 },
1399 "dist": {
1400 "type": "zip",
1401 "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a",
1402 "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a",
2240 "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1"
2241 },
2242 "dist": {
2243 "type": "zip",
2244 "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1",
2245 "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1",
14032246 "shasum": ""
14042247 },
14052248 "require": {
14062249 "ext-dom": "*",
2250 "ext-libxml": "*",
14072251 "ext-xmlwriter": "*",
1408 "php": "^7.1",
1409 "phpunit/php-file-iterator": "^2.0",
1410 "phpunit/php-text-template": "^1.2.1",
1411 "phpunit/php-token-stream": "^3.0",
1412 "sebastian/code-unit-reverse-lookup": "^1.0.1",
1413 "sebastian/environment": "^3.1",
1414 "sebastian/version": "^2.0.1",
1415 "theseer/tokenizer": "^1.1"
1416 },
1417 "require-dev": {
1418 "phpunit/phpunit": "^7.0"
2252 "nikic/php-parser": "^4.10.2",
2253 "php": ">=7.3",
2254 "phpunit/php-file-iterator": "^3.0.3",
2255 "phpunit/php-text-template": "^2.0.2",
2256 "sebastian/code-unit-reverse-lookup": "^2.0.2",
2257 "sebastian/complexity": "^2.0",
2258 "sebastian/environment": "^5.1.2",
2259 "sebastian/lines-of-code": "^1.0.3",
2260 "sebastian/version": "^3.0.1",
2261 "theseer/tokenizer": "^1.2.0"
2262 },
2263 "require-dev": {
2264 "phpunit/phpunit": "^9.3"
14192265 },
14202266 "suggest": {
1421 "ext-xdebug": "^2.6.0"
1422 },
1423 "type": "library",
1424 "extra": {
1425 "branch-alias": {
1426 "dev-master": "6.0-dev"
2267 "ext-pcov": "*",
2268 "ext-xdebug": "*"
2269 },
2270 "type": "library",
2271 "extra": {
2272 "branch-alias": {
2273 "dev-master": "9.2-dev"
14272274 }
14282275 },
14292276 "autoload": {
14492296 "testing",
14502297 "xunit"
14512298 ],
1452 "time": "2018-06-01T07:51:50+00:00"
2299 "support": {
2300 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
2301 "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5"
2302 },
2303 "funding": [
2304 {
2305 "url": "https://github.com/sebastianbergmann",
2306 "type": "github"
2307 }
2308 ],
2309 "time": "2020-11-28T06:44:49+00:00"
14532310 },
14542311 {
14552312 "name": "phpunit/php-file-iterator",
1456 "version": "2.0.1",
2313 "version": "3.0.5",
14572314 "source": {
14582315 "type": "git",
14592316 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
1460 "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c"
1461 },
1462 "dist": {
1463 "type": "zip",
1464 "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c",
1465 "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c",
1466 "shasum": ""
1467 },
1468 "require": {
1469 "php": "^7.1"
1470 },
1471 "type": "library",
1472 "extra": {
1473 "branch-alias": {
1474 "dev-master": "2.0.x-dev"
2317 "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
2318 },
2319 "dist": {
2320 "type": "zip",
2321 "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
2322 "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
2323 "shasum": ""
2324 },
2325 "require": {
2326 "php": ">=7.3"
2327 },
2328 "require-dev": {
2329 "phpunit/phpunit": "^9.3"
2330 },
2331 "type": "library",
2332 "extra": {
2333 "branch-alias": {
2334 "dev-master": "3.0-dev"
14752335 }
14762336 },
14772337 "autoload": {
14962356 "filesystem",
14972357 "iterator"
14982358 ],
1499 "time": "2018-06-11T11:44:00+00:00"
2359 "support": {
2360 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
2361 "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
2362 },
2363 "funding": [
2364 {
2365 "url": "https://github.com/sebastianbergmann",
2366 "type": "github"
2367 }
2368 ],
2369 "time": "2020-09-28T05:57:25+00:00"
2370 },
2371 {
2372 "name": "phpunit/php-invoker",
2373 "version": "3.1.1",
2374 "source": {
2375 "type": "git",
2376 "url": "https://github.com/sebastianbergmann/php-invoker.git",
2377 "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
2378 },
2379 "dist": {
2380 "type": "zip",
2381 "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
2382 "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
2383 "shasum": ""
2384 },
2385 "require": {
2386 "php": ">=7.3"
2387 },
2388 "require-dev": {
2389 "ext-pcntl": "*",
2390 "phpunit/phpunit": "^9.3"
2391 },
2392 "suggest": {
2393 "ext-pcntl": "*"
2394 },
2395 "type": "library",
2396 "extra": {
2397 "branch-alias": {
2398 "dev-master": "3.1-dev"
2399 }
2400 },
2401 "autoload": {
2402 "classmap": [
2403 "src/"
2404 ]
2405 },
2406 "notification-url": "https://packagist.org/downloads/",
2407 "license": [
2408 "BSD-3-Clause"
2409 ],
2410 "authors": [
2411 {
2412 "name": "Sebastian Bergmann",
2413 "email": "sebastian@phpunit.de",
2414 "role": "lead"
2415 }
2416 ],
2417 "description": "Invoke callables with a timeout",
2418 "homepage": "https://github.com/sebastianbergmann/php-invoker/",
2419 "keywords": [
2420 "process"
2421 ],
2422 "support": {
2423 "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
2424 "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
2425 },
2426 "funding": [
2427 {
2428 "url": "https://github.com/sebastianbergmann",
2429 "type": "github"
2430 }
2431 ],
2432 "time": "2020-09-28T05:58:55+00:00"
15002433 },
15012434 {
15022435 "name": "phpunit/php-text-template",
1503 "version": "1.2.1",
2436 "version": "2.0.4",
15042437 "source": {
15052438 "type": "git",
15062439 "url": "https://github.com/sebastianbergmann/php-text-template.git",
1507 "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
1508 },
1509 "dist": {
1510 "type": "zip",
1511 "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1512 "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1513 "shasum": ""
1514 },
1515 "require": {
1516 "php": ">=5.3.3"
1517 },
1518 "type": "library",
2440 "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
2441 },
2442 "dist": {
2443 "type": "zip",
2444 "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
2445 "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
2446 "shasum": ""
2447 },
2448 "require": {
2449 "php": ">=7.3"
2450 },
2451 "require-dev": {
2452 "phpunit/phpunit": "^9.3"
2453 },
2454 "type": "library",
2455 "extra": {
2456 "branch-alias": {
2457 "dev-master": "2.0-dev"
2458 }
2459 },
15192460 "autoload": {
15202461 "classmap": [
15212462 "src/"
15372478 "keywords": [
15382479 "template"
15392480 ],
1540 "time": "2015-06-21T13:50:34+00:00"
2481 "support": {
2482 "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
2483 "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
2484 },
2485 "funding": [
2486 {
2487 "url": "https://github.com/sebastianbergmann",
2488 "type": "github"
2489 }
2490 ],
2491 "time": "2020-10-26T05:33:50+00:00"
15412492 },
15422493 {
15432494 "name": "phpunit/php-timer",
1544 "version": "2.0.0",
2495 "version": "5.0.3",
15452496 "source": {
15462497 "type": "git",
15472498 "url": "https://github.com/sebastianbergmann/php-timer.git",
1548 "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f"
1549 },
1550 "dist": {
1551 "type": "zip",
1552 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f",
1553 "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f",
1554 "shasum": ""
1555 },
1556 "require": {
1557 "php": "^7.1"
1558 },
1559 "require-dev": {
1560 "phpunit/phpunit": "^7.0"
1561 },
1562 "type": "library",
1563 "extra": {
1564 "branch-alias": {
1565 "dev-master": "2.0-dev"
2499 "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
2500 },
2501 "dist": {
2502 "type": "zip",
2503 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
2504 "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
2505 "shasum": ""
2506 },
2507 "require": {
2508 "php": ">=7.3"
2509 },
2510 "require-dev": {
2511 "phpunit/phpunit": "^9.3"
2512 },
2513 "type": "library",
2514 "extra": {
2515 "branch-alias": {
2516 "dev-master": "5.0-dev"
15662517 }
15672518 },
15682519 "autoload": {
15862537 "keywords": [
15872538 "timer"
15882539 ],
1589 "time": "2018-02-01T13:07:23+00:00"
1590 },
1591 {
1592 "name": "phpunit/php-token-stream",
1593 "version": "3.0.0",
1594 "source": {
1595 "type": "git",
1596 "url": "https://github.com/sebastianbergmann/php-token-stream.git",
1597 "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace"
1598 },
1599 "dist": {
1600 "type": "zip",
1601 "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace",
1602 "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace",
1603 "shasum": ""
1604 },
1605 "require": {
1606 "ext-tokenizer": "*",
1607 "php": "^7.1"
1608 },
1609 "require-dev": {
1610 "phpunit/phpunit": "^7.0"
1611 },
1612 "type": "library",
1613 "extra": {
1614 "branch-alias": {
1615 "dev-master": "3.0-dev"
1616 }
1617 },
1618 "autoload": {
1619 "classmap": [
1620 "src/"
1621 ]
1622 },
1623 "notification-url": "https://packagist.org/downloads/",
1624 "license": [
1625 "BSD-3-Clause"
1626 ],
1627 "authors": [
1628 {
1629 "name": "Sebastian Bergmann",
1630 "email": "sebastian@phpunit.de"
1631 }
1632 ],
1633 "description": "Wrapper around PHP's tokenizer extension.",
1634 "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
1635 "keywords": [
1636 "tokenizer"
1637 ],
1638 "time": "2018-02-01T13:16:43+00:00"
2540 "support": {
2541 "issues": "https://github.com/sebastianbergmann/php-timer/issues",
2542 "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
2543 },
2544 "funding": [
2545 {
2546 "url": "https://github.com/sebastianbergmann",
2547 "type": "github"
2548 }
2549 ],
2550 "time": "2020-10-26T13:16:10+00:00"
16392551 },
16402552 {
16412553 "name": "phpunit/phpunit",
1642 "version": "7.2.6",
2554 "version": "9.5.1",
16432555 "source": {
16442556 "type": "git",
16452557 "url": "https://github.com/sebastianbergmann/phpunit.git",
1646 "reference": "400a3836ee549ae6f665323ac3f21e27eac7155f"
1647 },
1648 "dist": {
1649 "type": "zip",
1650 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/400a3836ee549ae6f665323ac3f21e27eac7155f",
1651 "reference": "400a3836ee549ae6f665323ac3f21e27eac7155f",
1652 "shasum": ""
1653 },
1654 "require": {
1655 "doctrine/instantiator": "^1.1",
2558 "reference": "e7bdf4085de85a825f4424eae52c99a1cec2f360"
2559 },
2560 "dist": {
2561 "type": "zip",
2562 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7bdf4085de85a825f4424eae52c99a1cec2f360",
2563 "reference": "e7bdf4085de85a825f4424eae52c99a1cec2f360",
2564 "shasum": ""
2565 },
2566 "require": {
2567 "doctrine/instantiator": "^1.3.1",
16562568 "ext-dom": "*",
16572569 "ext-json": "*",
16582570 "ext-libxml": "*",
16592571 "ext-mbstring": "*",
16602572 "ext-xml": "*",
1661 "myclabs/deep-copy": "^1.7",
1662 "phar-io/manifest": "^1.0.1",
1663 "phar-io/version": "^1.0",
1664 "php": "^7.1",
1665 "phpspec/prophecy": "^1.7",
1666 "phpunit/php-code-coverage": "^6.0.7",
1667 "phpunit/php-file-iterator": "^2.0.1",
1668 "phpunit/php-text-template": "^1.2.1",
1669 "phpunit/php-timer": "^2.0",
1670 "sebastian/comparator": "^3.0",
1671 "sebastian/diff": "^3.0",
1672 "sebastian/environment": "^3.1",
1673 "sebastian/exporter": "^3.1",
1674 "sebastian/global-state": "^2.0",
1675 "sebastian/object-enumerator": "^3.0.3",
1676 "sebastian/resource-operations": "^1.0",
1677 "sebastian/version": "^2.0.1"
1678 },
1679 "conflict": {
1680 "phpunit/phpunit-mock-objects": "*"
1681 },
1682 "require-dev": {
1683 "ext-pdo": "*"
2573 "ext-xmlwriter": "*",
2574 "myclabs/deep-copy": "^1.10.1",
2575 "phar-io/manifest": "^2.0.1",
2576 "phar-io/version": "^3.0.2",
2577 "php": ">=7.3",
2578 "phpspec/prophecy": "^1.12.1",
2579 "phpunit/php-code-coverage": "^9.2.3",
2580 "phpunit/php-file-iterator": "^3.0.5",
2581 "phpunit/php-invoker": "^3.1.1",
2582 "phpunit/php-text-template": "^2.0.3",
2583 "phpunit/php-timer": "^5.0.2",
2584 "sebastian/cli-parser": "^1.0.1",
2585 "sebastian/code-unit": "^1.0.6",
2586 "sebastian/comparator": "^4.0.5",
2587 "sebastian/diff": "^4.0.3",
2588 "sebastian/environment": "^5.1.3",
2589 "sebastian/exporter": "^4.0.3",
2590 "sebastian/global-state": "^5.0.1",
2591 "sebastian/object-enumerator": "^4.0.3",
2592 "sebastian/resource-operations": "^3.0.3",
2593 "sebastian/type": "^2.3",
2594 "sebastian/version": "^3.0.2"
2595 },
2596 "require-dev": {
2597 "ext-pdo": "*",
2598 "phpspec/prophecy-phpunit": "^2.0.1"
16842599 },
16852600 "suggest": {
16862601 "ext-soap": "*",
1687 "ext-xdebug": "*",
1688 "phpunit/php-invoker": "^2.0"
2602 "ext-xdebug": "*"
16892603 },
16902604 "bin": [
16912605 "phpunit"
16932607 "type": "library",
16942608 "extra": {
16952609 "branch-alias": {
1696 "dev-master": "7.2-dev"
2610 "dev-master": "9.5-dev"
16972611 }
16982612 },
16992613 "autoload": {
17002614 "classmap": [
17012615 "src/"
2616 ],
2617 "files": [
2618 "src/Framework/Assert/Functions.php"
17022619 ]
17032620 },
17042621 "notification-url": "https://packagist.org/downloads/",
17192636 "testing",
17202637 "xunit"
17212638 ],
1722 "time": "2018-06-21T13:13:39+00:00"
2639 "support": {
2640 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
2641 "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.1"
2642 },
2643 "funding": [
2644 {
2645 "url": "https://phpunit.de/donate.html",
2646 "type": "custom"
2647 },
2648 {
2649 "url": "https://github.com/sebastianbergmann",
2650 "type": "github"
2651 }
2652 ],
2653 "time": "2021-01-17T07:42:25+00:00"
2654 },
2655 {
2656 "name": "psr/container",
2657 "version": "1.0.0",
2658 "source": {
2659 "type": "git",
2660 "url": "https://github.com/php-fig/container.git",
2661 "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
2662 },
2663 "dist": {
2664 "type": "zip",
2665 "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
2666 "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
2667 "shasum": ""
2668 },
2669 "require": {
2670 "php": ">=5.3.0"
2671 },
2672 "type": "library",
2673 "extra": {
2674 "branch-alias": {
2675 "dev-master": "1.0.x-dev"
2676 }
2677 },
2678 "autoload": {
2679 "psr-4": {
2680 "Psr\\Container\\": "src/"
2681 }
2682 },
2683 "notification-url": "https://packagist.org/downloads/",
2684 "license": [
2685 "MIT"
2686 ],
2687 "authors": [
2688 {
2689 "name": "PHP-FIG",
2690 "homepage": "http://www.php-fig.org/"
2691 }
2692 ],
2693 "description": "Common Container Interface (PHP FIG PSR-11)",
2694 "homepage": "https://github.com/php-fig/container",
2695 "keywords": [
2696 "PSR-11",
2697 "container",
2698 "container-interface",
2699 "container-interop",
2700 "psr"
2701 ],
2702 "support": {
2703 "issues": "https://github.com/php-fig/container/issues",
2704 "source": "https://github.com/php-fig/container/tree/master"
2705 },
2706 "time": "2017-02-14T16:28:37+00:00"
2707 },
2708 {
2709 "name": "psr/http-client",
2710 "version": "1.0.1",
2711 "source": {
2712 "type": "git",
2713 "url": "https://github.com/php-fig/http-client.git",
2714 "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
2715 },
2716 "dist": {
2717 "type": "zip",
2718 "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
2719 "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
2720 "shasum": ""
2721 },
2722 "require": {
2723 "php": "^7.0 || ^8.0",
2724 "psr/http-message": "^1.0"
2725 },
2726 "type": "library",
2727 "extra": {
2728 "branch-alias": {
2729 "dev-master": "1.0.x-dev"
2730 }
2731 },
2732 "autoload": {
2733 "psr-4": {
2734 "Psr\\Http\\Client\\": "src/"
2735 }
2736 },
2737 "notification-url": "https://packagist.org/downloads/",
2738 "license": [
2739 "MIT"
2740 ],
2741 "authors": [
2742 {
2743 "name": "PHP-FIG",
2744 "homepage": "http://www.php-fig.org/"
2745 }
2746 ],
2747 "description": "Common interface for HTTP clients",
2748 "homepage": "https://github.com/php-fig/http-client",
2749 "keywords": [
2750 "http",
2751 "http-client",
2752 "psr",
2753 "psr-18"
2754 ],
2755 "support": {
2756 "source": "https://github.com/php-fig/http-client/tree/master"
2757 },
2758 "time": "2020-06-29T06:28:15+00:00"
17232759 },
17242760 {
17252761 "name": "psr/log",
1726 "version": "1.0.2",
2762 "version": "1.1.3",
17272763 "source": {
17282764 "type": "git",
17292765 "url": "https://github.com/php-fig/log.git",
1730 "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
1731 },
1732 "dist": {
1733 "type": "zip",
1734 "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
1735 "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
2766 "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
2767 },
2768 "dist": {
2769 "type": "zip",
2770 "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
2771 "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
17362772 "shasum": ""
17372773 },
17382774 "require": {
17412777 "type": "library",
17422778 "extra": {
17432779 "branch-alias": {
1744 "dev-master": "1.0.x-dev"
2780 "dev-master": "1.1.x-dev"
17452781 }
17462782 },
17472783 "autoload": {
17662802 "psr",
17672803 "psr-3"
17682804 ],
1769 "time": "2016-10-10T12:19:37+00:00"
1770 },
1771 {
1772 "name": "sebastian/code-unit-reverse-lookup",
2805 "support": {
2806 "source": "https://github.com/php-fig/log/tree/1.1.3"
2807 },
2808 "time": "2020-03-23T09:12:05+00:00"
2809 },
2810 {
2811 "name": "ralouphie/getallheaders",
2812 "version": "3.0.3",
2813 "source": {
2814 "type": "git",
2815 "url": "https://github.com/ralouphie/getallheaders.git",
2816 "reference": "120b605dfeb996808c31b6477290a714d356e822"
2817 },
2818 "dist": {
2819 "type": "zip",
2820 "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
2821 "reference": "120b605dfeb996808c31b6477290a714d356e822",
2822 "shasum": ""
2823 },
2824 "require": {
2825 "php": ">=5.6"
2826 },
2827 "require-dev": {
2828 "php-coveralls/php-coveralls": "^2.1",
2829 "phpunit/phpunit": "^5 || ^6.5"
2830 },
2831 "type": "library",
2832 "autoload": {
2833 "files": [
2834 "src/getallheaders.php"
2835 ]
2836 },
2837 "notification-url": "https://packagist.org/downloads/",
2838 "license": [
2839 "MIT"
2840 ],
2841 "authors": [
2842 {
2843 "name": "Ralph Khattar",
2844 "email": "ralph.khattar@gmail.com"
2845 }
2846 ],
2847 "description": "A polyfill for getallheaders.",
2848 "support": {
2849 "issues": "https://github.com/ralouphie/getallheaders/issues",
2850 "source": "https://github.com/ralouphie/getallheaders/tree/develop"
2851 },
2852 "time": "2019-03-08T08:55:37+00:00"
2853 },
2854 {
2855 "name": "scrutinizer/ocular",
2856 "version": "1.8.0",
2857 "source": {
2858 "type": "git",
2859 "url": "https://github.com/scrutinizer-ci/ocular.git",
2860 "reference": "142a84a131d622e79a1d5b527f2c5a9f6812f2d9"
2861 },
2862 "dist": {
2863 "type": "zip",
2864 "url": "https://api.github.com/repos/scrutinizer-ci/ocular/zipball/142a84a131d622e79a1d5b527f2c5a9f6812f2d9",
2865 "reference": "142a84a131d622e79a1d5b527f2c5a9f6812f2d9",
2866 "shasum": ""
2867 },
2868 "require": {
2869 "guzzlehttp/guzzle": "~6.3|^7.0",
2870 "jms/serializer": "^1.0.0",
2871 "phpoption/phpoption": "~1.0",
2872 "symfony/console": "^2.1.0|~3.0|~4.0|~5.0",
2873 "symfony/process": "~2.3|~3.0|~4.0|~5.0"
2874 },
2875 "require-dev": {
2876 "bamarni/composer-bin-plugin": "^1.2",
2877 "phpunit/phpunit": "^9.0.0",
2878 "symfony/filesystem": "~2.0|~3.0|~4.0|~5.0"
2879 },
2880 "bin": [
2881 "bin/ocular"
2882 ],
2883 "type": "library",
2884 "autoload": {
2885 "psr-4": {
2886 "Scrutinizer\\Ocular\\": "src/Scrutinizer/Ocular"
2887 }
2888 },
2889 "notification-url": "https://packagist.org/downloads/",
2890 "license": [
2891 "Apache-2.0"
2892 ],
2893 "support": {
2894 "issues": "https://github.com/scrutinizer-ci/ocular/issues",
2895 "source": "https://github.com/scrutinizer-ci/ocular/tree/1.8.0"
2896 },
2897 "time": "2020-12-11T10:39:03+00:00"
2898 },
2899 {
2900 "name": "sebastian/cli-parser",
17732901 "version": "1.0.1",
17742902 "source": {
17752903 "type": "git",
1776 "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1777 "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
1778 },
1779 "dist": {
1780 "type": "zip",
1781 "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1782 "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1783 "shasum": ""
1784 },
1785 "require": {
1786 "php": "^5.6 || ^7.0"
1787 },
1788 "require-dev": {
1789 "phpunit/phpunit": "^5.7 || ^6.0"
1790 },
1791 "type": "library",
1792 "extra": {
1793 "branch-alias": {
1794 "dev-master": "1.0.x-dev"
2904 "url": "https://github.com/sebastianbergmann/cli-parser.git",
2905 "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
2906 },
2907 "dist": {
2908 "type": "zip",
2909 "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
2910 "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
2911 "shasum": ""
2912 },
2913 "require": {
2914 "php": ">=7.3"
2915 },
2916 "require-dev": {
2917 "phpunit/phpunit": "^9.3"
2918 },
2919 "type": "library",
2920 "extra": {
2921 "branch-alias": {
2922 "dev-master": "1.0-dev"
17952923 }
17962924 },
17972925 "autoload": {
18062934 "authors": [
18072935 {
18082936 "name": "Sebastian Bergmann",
1809 "email": "sebastian@phpunit.de"
1810 }
1811 ],
1812 "description": "Looks up which function or method a line of code belongs to",
1813 "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1814 "time": "2017-03-04T06:30:41+00:00"
1815 },
1816 {
1817 "name": "sebastian/comparator",
1818 "version": "3.0.1",
1819 "source": {
1820 "type": "git",
1821 "url": "https://github.com/sebastianbergmann/comparator.git",
1822 "reference": "591a30922f54656695e59b1f39501aec513403da"
1823 },
1824 "dist": {
1825 "type": "zip",
1826 "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/591a30922f54656695e59b1f39501aec513403da",
1827 "reference": "591a30922f54656695e59b1f39501aec513403da",
1828 "shasum": ""
1829 },
1830 "require": {
1831 "php": "^7.1",
1832 "sebastian/diff": "^3.0",
1833 "sebastian/exporter": "^3.1"
1834 },
1835 "require-dev": {
1836 "phpunit/phpunit": "^7.1"
1837 },
1838 "type": "library",
1839 "extra": {
1840 "branch-alias": {
1841 "dev-master": "3.0-dev"
2937 "email": "sebastian@phpunit.de",
2938 "role": "lead"
2939 }
2940 ],
2941 "description": "Library for parsing CLI options",
2942 "homepage": "https://github.com/sebastianbergmann/cli-parser",
2943 "support": {
2944 "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
2945 "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
2946 },
2947 "funding": [
2948 {
2949 "url": "https://github.com/sebastianbergmann",
2950 "type": "github"
2951 }
2952 ],
2953 "time": "2020-09-28T06:08:49+00:00"
2954 },
2955 {
2956 "name": "sebastian/code-unit",
2957 "version": "1.0.8",
2958 "source": {
2959 "type": "git",
2960 "url": "https://github.com/sebastianbergmann/code-unit.git",
2961 "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
2962 },
2963 "dist": {
2964 "type": "zip",
2965 "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
2966 "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
2967 "shasum": ""
2968 },
2969 "require": {
2970 "php": ">=7.3"
2971 },
2972 "require-dev": {
2973 "phpunit/phpunit": "^9.3"
2974 },
2975 "type": "library",
2976 "extra": {
2977 "branch-alias": {
2978 "dev-master": "1.0-dev"
18422979 }
18432980 },
18442981 "autoload": {
18522989 ],
18532990 "authors": [
18542991 {
2992 "name": "Sebastian Bergmann",
2993 "email": "sebastian@phpunit.de",
2994 "role": "lead"
2995 }
2996 ],
2997 "description": "Collection of value objects that represent the PHP code units",
2998 "homepage": "https://github.com/sebastianbergmann/code-unit",
2999 "support": {
3000 "issues": "https://github.com/sebastianbergmann/code-unit/issues",
3001 "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
3002 },
3003 "funding": [
3004 {
3005 "url": "https://github.com/sebastianbergmann",
3006 "type": "github"
3007 }
3008 ],
3009 "time": "2020-10-26T13:08:54+00:00"
3010 },
3011 {
3012 "name": "sebastian/code-unit-reverse-lookup",
3013 "version": "2.0.3",
3014 "source": {
3015 "type": "git",
3016 "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
3017 "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
3018 },
3019 "dist": {
3020 "type": "zip",
3021 "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
3022 "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
3023 "shasum": ""
3024 },
3025 "require": {
3026 "php": ">=7.3"
3027 },
3028 "require-dev": {
3029 "phpunit/phpunit": "^9.3"
3030 },
3031 "type": "library",
3032 "extra": {
3033 "branch-alias": {
3034 "dev-master": "2.0-dev"
3035 }
3036 },
3037 "autoload": {
3038 "classmap": [
3039 "src/"
3040 ]
3041 },
3042 "notification-url": "https://packagist.org/downloads/",
3043 "license": [
3044 "BSD-3-Clause"
3045 ],
3046 "authors": [
3047 {
3048 "name": "Sebastian Bergmann",
3049 "email": "sebastian@phpunit.de"
3050 }
3051 ],
3052 "description": "Looks up which function or method a line of code belongs to",
3053 "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
3054 "support": {
3055 "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
3056 "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
3057 },
3058 "funding": [
3059 {
3060 "url": "https://github.com/sebastianbergmann",
3061 "type": "github"
3062 }
3063 ],
3064 "time": "2020-09-28T05:30:19+00:00"
3065 },
3066 {
3067 "name": "sebastian/comparator",
3068 "version": "4.0.6",
3069 "source": {
3070 "type": "git",
3071 "url": "https://github.com/sebastianbergmann/comparator.git",
3072 "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
3073 },
3074 "dist": {
3075 "type": "zip",
3076 "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
3077 "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
3078 "shasum": ""
3079 },
3080 "require": {
3081 "php": ">=7.3",
3082 "sebastian/diff": "^4.0",
3083 "sebastian/exporter": "^4.0"
3084 },
3085 "require-dev": {
3086 "phpunit/phpunit": "^9.3"
3087 },
3088 "type": "library",
3089 "extra": {
3090 "branch-alias": {
3091 "dev-master": "4.0-dev"
3092 }
3093 },
3094 "autoload": {
3095 "classmap": [
3096 "src/"
3097 ]
3098 },
3099 "notification-url": "https://packagist.org/downloads/",
3100 "license": [
3101 "BSD-3-Clause"
3102 ],
3103 "authors": [
3104 {
3105 "name": "Sebastian Bergmann",
3106 "email": "sebastian@phpunit.de"
3107 },
3108 {
18553109 "name": "Jeff Welch",
18563110 "email": "whatthejeff@gmail.com"
18573111 },
18623116 {
18633117 "name": "Bernhard Schussek",
18643118 "email": "bschussek@2bepublished.at"
1865 },
1866 {
1867 "name": "Sebastian Bergmann",
1868 "email": "sebastian@phpunit.de"
18693119 }
18703120 ],
18713121 "description": "Provides the functionality to compare PHP values for equality",
18753125 "compare",
18763126 "equality"
18773127 ],
1878 "time": "2018-06-14T15:05:28+00:00"
1879 },
1880 {
1881 "name": "sebastian/diff",
1882 "version": "3.0.1",
1883 "source": {
1884 "type": "git",
1885 "url": "https://github.com/sebastianbergmann/diff.git",
1886 "reference": "366541b989927187c4ca70490a35615d3fef2dce"
1887 },
1888 "dist": {
1889 "type": "zip",
1890 "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce",
1891 "reference": "366541b989927187c4ca70490a35615d3fef2dce",
1892 "shasum": ""
1893 },
1894 "require": {
1895 "php": "^7.1"
1896 },
1897 "require-dev": {
1898 "phpunit/phpunit": "^7.0",
1899 "symfony/process": "^2 || ^3.3 || ^4"
1900 },
1901 "type": "library",
1902 "extra": {
1903 "branch-alias": {
1904 "dev-master": "3.0-dev"
3128 "support": {
3129 "issues": "https://github.com/sebastianbergmann/comparator/issues",
3130 "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
3131 },
3132 "funding": [
3133 {
3134 "url": "https://github.com/sebastianbergmann",
3135 "type": "github"
3136 }
3137 ],
3138 "time": "2020-10-26T15:49:45+00:00"
3139 },
3140 {
3141 "name": "sebastian/complexity",
3142 "version": "2.0.2",
3143 "source": {
3144 "type": "git",
3145 "url": "https://github.com/sebastianbergmann/complexity.git",
3146 "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
3147 },
3148 "dist": {
3149 "type": "zip",
3150 "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
3151 "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
3152 "shasum": ""
3153 },
3154 "require": {
3155 "nikic/php-parser": "^4.7",
3156 "php": ">=7.3"
3157 },
3158 "require-dev": {
3159 "phpunit/phpunit": "^9.3"
3160 },
3161 "type": "library",
3162 "extra": {
3163 "branch-alias": {
3164 "dev-master": "2.0-dev"
19053165 }
19063166 },
19073167 "autoload": {
19153175 ],
19163176 "authors": [
19173177 {
3178 "name": "Sebastian Bergmann",
3179 "email": "sebastian@phpunit.de",
3180 "role": "lead"
3181 }
3182 ],
3183 "description": "Library for calculating the complexity of PHP code units",
3184 "homepage": "https://github.com/sebastianbergmann/complexity",
3185 "support": {
3186 "issues": "https://github.com/sebastianbergmann/complexity/issues",
3187 "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
3188 },
3189 "funding": [
3190 {
3191 "url": "https://github.com/sebastianbergmann",
3192 "type": "github"
3193 }
3194 ],
3195 "time": "2020-10-26T15:52:27+00:00"
3196 },
3197 {
3198 "name": "sebastian/diff",
3199 "version": "4.0.4",
3200 "source": {
3201 "type": "git",
3202 "url": "https://github.com/sebastianbergmann/diff.git",
3203 "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
3204 },
3205 "dist": {
3206 "type": "zip",
3207 "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
3208 "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
3209 "shasum": ""
3210 },
3211 "require": {
3212 "php": ">=7.3"
3213 },
3214 "require-dev": {
3215 "phpunit/phpunit": "^9.3",
3216 "symfony/process": "^4.2 || ^5"
3217 },
3218 "type": "library",
3219 "extra": {
3220 "branch-alias": {
3221 "dev-master": "4.0-dev"
3222 }
3223 },
3224 "autoload": {
3225 "classmap": [
3226 "src/"
3227 ]
3228 },
3229 "notification-url": "https://packagist.org/downloads/",
3230 "license": [
3231 "BSD-3-Clause"
3232 ],
3233 "authors": [
3234 {
3235 "name": "Sebastian Bergmann",
3236 "email": "sebastian@phpunit.de"
3237 },
3238 {
19183239 "name": "Kore Nordmann",
19193240 "email": "mail@kore-nordmann.de"
1920 },
1921 {
1922 "name": "Sebastian Bergmann",
1923 "email": "sebastian@phpunit.de"
19243241 }
19253242 ],
19263243 "description": "Diff implementation",
19313248 "unidiff",
19323249 "unified diff"
19333250 ],
1934 "time": "2018-06-10T07:54:39+00:00"
3251 "support": {
3252 "issues": "https://github.com/sebastianbergmann/diff/issues",
3253 "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
3254 },
3255 "funding": [
3256 {
3257 "url": "https://github.com/sebastianbergmann",
3258 "type": "github"
3259 }
3260 ],
3261 "time": "2020-10-26T13:10:38+00:00"
19353262 },
19363263 {
19373264 "name": "sebastian/environment",
1938 "version": "3.1.0",
3265 "version": "5.1.3",
19393266 "source": {
19403267 "type": "git",
19413268 "url": "https://github.com/sebastianbergmann/environment.git",
1942 "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
1943 },
1944 "dist": {
1945 "type": "zip",
1946 "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
1947 "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
1948 "shasum": ""
1949 },
1950 "require": {
1951 "php": "^7.0"
1952 },
1953 "require-dev": {
1954 "phpunit/phpunit": "^6.1"
1955 },
1956 "type": "library",
1957 "extra": {
1958 "branch-alias": {
1959 "dev-master": "3.1.x-dev"
3269 "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
3270 },
3271 "dist": {
3272 "type": "zip",
3273 "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
3274 "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
3275 "shasum": ""
3276 },
3277 "require": {
3278 "php": ">=7.3"
3279 },
3280 "require-dev": {
3281 "phpunit/phpunit": "^9.3"
3282 },
3283 "suggest": {
3284 "ext-posix": "*"
3285 },
3286 "type": "library",
3287 "extra": {
3288 "branch-alias": {
3289 "dev-master": "5.1-dev"
19603290 }
19613291 },
19623292 "autoload": {
19813311 "environment",
19823312 "hhvm"
19833313 ],
1984 "time": "2017-07-01T08:51:00+00:00"
3314 "support": {
3315 "issues": "https://github.com/sebastianbergmann/environment/issues",
3316 "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
3317 },
3318 "funding": [
3319 {
3320 "url": "https://github.com/sebastianbergmann",
3321 "type": "github"
3322 }
3323 ],
3324 "time": "2020-09-28T05:52:38+00:00"
19853325 },
19863326 {
19873327 "name": "sebastian/exporter",
1988 "version": "3.1.0",
3328 "version": "4.0.3",
19893329 "source": {
19903330 "type": "git",
19913331 "url": "https://github.com/sebastianbergmann/exporter.git",
1992 "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
1993 },
1994 "dist": {
1995 "type": "zip",
1996 "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
1997 "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
1998 "shasum": ""
1999 },
2000 "require": {
2001 "php": "^7.0",
2002 "sebastian/recursion-context": "^3.0"
3332 "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
3333 },
3334 "dist": {
3335 "type": "zip",
3336 "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
3337 "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
3338 "shasum": ""
3339 },
3340 "require": {
3341 "php": ">=7.3",
3342 "sebastian/recursion-context": "^4.0"
20033343 },
20043344 "require-dev": {
20053345 "ext-mbstring": "*",
2006 "phpunit/phpunit": "^6.0"
2007 },
2008 "type": "library",
2009 "extra": {
2010 "branch-alias": {
2011 "dev-master": "3.1.x-dev"
3346 "phpunit/phpunit": "^9.3"
3347 },
3348 "type": "library",
3349 "extra": {
3350 "branch-alias": {
3351 "dev-master": "4.0-dev"
20123352 }
20133353 },
20143354 "autoload": {
20223362 ],
20233363 "authors": [
20243364 {
3365 "name": "Sebastian Bergmann",
3366 "email": "sebastian@phpunit.de"
3367 },
3368 {
20253369 "name": "Jeff Welch",
20263370 "email": "whatthejeff@gmail.com"
20273371 },
20303374 "email": "github@wallbash.com"
20313375 },
20323376 {
2033 "name": "Bernhard Schussek",
2034 "email": "bschussek@2bepublished.at"
2035 },
2036 {
2037 "name": "Sebastian Bergmann",
2038 "email": "sebastian@phpunit.de"
2039 },
2040 {
20413377 "name": "Adam Harvey",
20423378 "email": "aharvey@php.net"
3379 },
3380 {
3381 "name": "Bernhard Schussek",
3382 "email": "bschussek@gmail.com"
20433383 }
20443384 ],
20453385 "description": "Provides the functionality to export PHP variables for visualization",
20483388 "export",
20493389 "exporter"
20503390 ],
2051 "time": "2017-04-03T13:19:02+00:00"
3391 "support": {
3392 "issues": "https://github.com/sebastianbergmann/exporter/issues",
3393 "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
3394 },
3395 "funding": [
3396 {
3397 "url": "https://github.com/sebastianbergmann",
3398 "type": "github"
3399 }
3400 ],
3401 "time": "2020-09-28T05:24:23+00:00"
20523402 },
20533403 {
20543404 "name": "sebastian/global-state",
2055 "version": "2.0.0",
3405 "version": "5.0.2",
20563406 "source": {
20573407 "type": "git",
20583408 "url": "https://github.com/sebastianbergmann/global-state.git",
2059 "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
2060 },
2061 "dist": {
2062 "type": "zip",
2063 "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
2064 "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
2065 "shasum": ""
2066 },
2067 "require": {
2068 "php": "^7.0"
2069 },
2070 "require-dev": {
2071 "phpunit/phpunit": "^6.0"
3409 "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
3410 },
3411 "dist": {
3412 "type": "zip",
3413 "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
3414 "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
3415 "shasum": ""
3416 },
3417 "require": {
3418 "php": ">=7.3",
3419 "sebastian/object-reflector": "^2.0",
3420 "sebastian/recursion-context": "^4.0"
3421 },
3422 "require-dev": {
3423 "ext-dom": "*",
3424 "phpunit/phpunit": "^9.3"
20723425 },
20733426 "suggest": {
20743427 "ext-uopz": "*"
20763429 "type": "library",
20773430 "extra": {
20783431 "branch-alias": {
2079 "dev-master": "2.0-dev"
3432 "dev-master": "5.0-dev"
20803433 }
20813434 },
20823435 "autoload": {
20993452 "keywords": [
21003453 "global state"
21013454 ],
2102 "time": "2017-04-27T15:39:26+00:00"
2103 },
2104 {
2105 "name": "sebastian/object-enumerator",
2106 "version": "3.0.3",
2107 "source": {
2108 "type": "git",
2109 "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2110 "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
2111 },
2112 "dist": {
2113 "type": "zip",
2114 "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
2115 "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
2116 "shasum": ""
2117 },
2118 "require": {
2119 "php": "^7.0",
2120 "sebastian/object-reflector": "^1.1.1",
2121 "sebastian/recursion-context": "^3.0"
2122 },
2123 "require-dev": {
2124 "phpunit/phpunit": "^6.0"
2125 },
2126 "type": "library",
2127 "extra": {
2128 "branch-alias": {
2129 "dev-master": "3.0.x-dev"
3455 "support": {
3456 "issues": "https://github.com/sebastianbergmann/global-state/issues",
3457 "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
3458 },
3459 "funding": [
3460 {
3461 "url": "https://github.com/sebastianbergmann",
3462 "type": "github"
3463 }
3464 ],
3465 "time": "2020-10-26T15:55:19+00:00"
3466 },
3467 {
3468 "name": "sebastian/lines-of-code",
3469 "version": "1.0.3",
3470 "source": {
3471 "type": "git",
3472 "url": "https://github.com/sebastianbergmann/lines-of-code.git",
3473 "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
3474 },
3475 "dist": {
3476 "type": "zip",
3477 "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
3478 "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
3479 "shasum": ""
3480 },
3481 "require": {
3482 "nikic/php-parser": "^4.6",
3483 "php": ">=7.3"
3484 },
3485 "require-dev": {
3486 "phpunit/phpunit": "^9.3"
3487 },
3488 "type": "library",
3489 "extra": {
3490 "branch-alias": {
3491 "dev-master": "1.0-dev"
21303492 }
21313493 },
21323494 "autoload": {
21413503 "authors": [
21423504 {
21433505 "name": "Sebastian Bergmann",
2144 "email": "sebastian@phpunit.de"
2145 }
2146 ],
2147 "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2148 "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2149 "time": "2017-08-03T12:35:26+00:00"
2150 },
2151 {
2152 "name": "sebastian/object-reflector",
2153 "version": "1.1.1",
2154 "source": {
2155 "type": "git",
2156 "url": "https://github.com/sebastianbergmann/object-reflector.git",
2157 "reference": "773f97c67f28de00d397be301821b06708fca0be"
2158 },
2159 "dist": {
2160 "type": "zip",
2161 "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
2162 "reference": "773f97c67f28de00d397be301821b06708fca0be",
2163 "shasum": ""
2164 },
2165 "require": {
2166 "php": "^7.0"
2167 },
2168 "require-dev": {
2169 "phpunit/phpunit": "^6.0"
2170 },
2171 "type": "library",
2172 "extra": {
2173 "branch-alias": {
2174 "dev-master": "1.1-dev"
3506 "email": "sebastian@phpunit.de",
3507 "role": "lead"
3508 }
3509 ],
3510 "description": "Library for counting the lines of code in PHP source code",
3511 "homepage": "https://github.com/sebastianbergmann/lines-of-code",
3512 "support": {
3513 "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
3514 "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
3515 },
3516 "funding": [
3517 {
3518 "url": "https://github.com/sebastianbergmann",
3519 "type": "github"
3520 }
3521 ],
3522 "time": "2020-11-28T06:42:11+00:00"
3523 },
3524 {
3525 "name": "sebastian/object-enumerator",
3526 "version": "4.0.4",
3527 "source": {
3528 "type": "git",
3529 "url": "https://github.com/sebastianbergmann/object-enumerator.git",
3530 "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
3531 },
3532 "dist": {
3533 "type": "zip",
3534 "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
3535 "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
3536 "shasum": ""
3537 },
3538 "require": {
3539 "php": ">=7.3",
3540 "sebastian/object-reflector": "^2.0",
3541 "sebastian/recursion-context": "^4.0"
3542 },
3543 "require-dev": {
3544 "phpunit/phpunit": "^9.3"
3545 },
3546 "type": "library",
3547 "extra": {
3548 "branch-alias": {
3549 "dev-master": "4.0-dev"
21753550 }
21763551 },
21773552 "autoload": {
21893564 "email": "sebastian@phpunit.de"
21903565 }
21913566 ],
2192 "description": "Allows reflection of object attributes, including inherited and non-public ones",
2193 "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2194 "time": "2017-03-29T09:07:27+00:00"
2195 },
2196 {
2197 "name": "sebastian/recursion-context",
2198 "version": "3.0.0",
2199 "source": {
2200 "type": "git",
2201 "url": "https://github.com/sebastianbergmann/recursion-context.git",
2202 "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
2203 },
2204 "dist": {
2205 "type": "zip",
2206 "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
2207 "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
2208 "shasum": ""
2209 },
2210 "require": {
2211 "php": "^7.0"
2212 },
2213 "require-dev": {
2214 "phpunit/phpunit": "^6.0"
2215 },
2216 "type": "library",
2217 "extra": {
2218 "branch-alias": {
2219 "dev-master": "3.0.x-dev"
3567 "description": "Traverses array structures and object graphs to enumerate all referenced objects",
3568 "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
3569 "support": {
3570 "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
3571 "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
3572 },
3573 "funding": [
3574 {
3575 "url": "https://github.com/sebastianbergmann",
3576 "type": "github"
3577 }
3578 ],
3579 "time": "2020-10-26T13:12:34+00:00"
3580 },
3581 {
3582 "name": "sebastian/object-reflector",
3583 "version": "2.0.4",
3584 "source": {
3585 "type": "git",
3586 "url": "https://github.com/sebastianbergmann/object-reflector.git",
3587 "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
3588 },
3589 "dist": {
3590 "type": "zip",
3591 "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
3592 "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
3593 "shasum": ""
3594 },
3595 "require": {
3596 "php": ">=7.3"
3597 },
3598 "require-dev": {
3599 "phpunit/phpunit": "^9.3"
3600 },
3601 "type": "library",
3602 "extra": {
3603 "branch-alias": {
3604 "dev-master": "2.0-dev"
22203605 }
22213606 },
22223607 "autoload": {
22303615 ],
22313616 "authors": [
22323617 {
2233 "name": "Jeff Welch",
2234 "email": "whatthejeff@gmail.com"
2235 },
2236 {
22373618 "name": "Sebastian Bergmann",
22383619 "email": "sebastian@phpunit.de"
2239 },
2240 {
2241 "name": "Adam Harvey",
2242 "email": "aharvey@php.net"
2243 }
2244 ],
2245 "description": "Provides functionality to recursively process PHP variables",
2246 "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2247 "time": "2017-03-03T06:23:57+00:00"
2248 },
2249 {
2250 "name": "sebastian/resource-operations",
2251 "version": "1.0.0",
2252 "source": {
2253 "type": "git",
2254 "url": "https://github.com/sebastianbergmann/resource-operations.git",
2255 "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
2256 },
2257 "dist": {
2258 "type": "zip",
2259 "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
2260 "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
2261 "shasum": ""
2262 },
2263 "require": {
2264 "php": ">=5.6.0"
2265 },
2266 "type": "library",
2267 "extra": {
2268 "branch-alias": {
2269 "dev-master": "1.0.x-dev"
3620 }
3621 ],
3622 "description": "Allows reflection of object attributes, including inherited and non-public ones",
3623 "homepage": "https://github.com/sebastianbergmann/object-reflector/",
3624 "support": {
3625 "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
3626 "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
3627 },
3628 "funding": [
3629 {
3630 "url": "https://github.com/sebastianbergmann",
3631 "type": "github"
3632 }
3633 ],
3634 "time": "2020-10-26T13:14:26+00:00"
3635 },
3636 {
3637 "name": "sebastian/recursion-context",
3638 "version": "4.0.4",
3639 "source": {
3640 "type": "git",
3641 "url": "https://github.com/sebastianbergmann/recursion-context.git",
3642 "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
3643 },
3644 "dist": {
3645 "type": "zip",
3646 "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
3647 "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
3648 "shasum": ""
3649 },
3650 "require": {
3651 "php": ">=7.3"
3652 },
3653 "require-dev": {
3654 "phpunit/phpunit": "^9.3"
3655 },
3656 "type": "library",
3657 "extra": {
3658 "branch-alias": {
3659 "dev-master": "4.0-dev"
22703660 }
22713661 },
22723662 "autoload": {
22823672 {
22833673 "name": "Sebastian Bergmann",
22843674 "email": "sebastian@phpunit.de"
2285 }
2286 ],
2287 "description": "Provides a list of PHP built-in functions that operate on resources",
2288 "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2289 "time": "2015-07-28T20:34:47+00:00"
2290 },
2291 {
2292 "name": "sebastian/version",
2293 "version": "2.0.1",
2294 "source": {
2295 "type": "git",
2296 "url": "https://github.com/sebastianbergmann/version.git",
2297 "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
2298 },
2299 "dist": {
2300 "type": "zip",
2301 "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
2302 "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
2303 "shasum": ""
2304 },
2305 "require": {
2306 "php": ">=5.6"
2307 },
2308 "type": "library",
2309 "extra": {
2310 "branch-alias": {
2311 "dev-master": "2.0.x-dev"
3675 },
3676 {
3677 "name": "Jeff Welch",
3678 "email": "whatthejeff@gmail.com"
3679 },
3680 {
3681 "name": "Adam Harvey",
3682 "email": "aharvey@php.net"
3683 }
3684 ],
3685 "description": "Provides functionality to recursively process PHP variables",
3686 "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
3687 "support": {
3688 "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
3689 "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
3690 },
3691 "funding": [
3692 {
3693 "url": "https://github.com/sebastianbergmann",
3694 "type": "github"
3695 }
3696 ],
3697 "time": "2020-10-26T13:17:30+00:00"
3698 },
3699 {
3700 "name": "sebastian/resource-operations",
3701 "version": "3.0.3",
3702 "source": {
3703 "type": "git",
3704 "url": "https://github.com/sebastianbergmann/resource-operations.git",
3705 "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
3706 },
3707 "dist": {
3708 "type": "zip",
3709 "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
3710 "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
3711 "shasum": ""
3712 },
3713 "require": {
3714 "php": ">=7.3"
3715 },
3716 "require-dev": {
3717 "phpunit/phpunit": "^9.0"
3718 },
3719 "type": "library",
3720 "extra": {
3721 "branch-alias": {
3722 "dev-master": "3.0-dev"
23123723 }
23133724 },
23143725 "autoload": {
23233734 "authors": [
23243735 {
23253736 "name": "Sebastian Bergmann",
3737 "email": "sebastian@phpunit.de"
3738 }
3739 ],
3740 "description": "Provides a list of PHP built-in functions that operate on resources",
3741 "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
3742 "support": {
3743 "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
3744 "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
3745 },
3746 "funding": [
3747 {
3748 "url": "https://github.com/sebastianbergmann",
3749 "type": "github"
3750 }
3751 ],
3752 "time": "2020-09-28T06:45:17+00:00"
3753 },
3754 {
3755 "name": "sebastian/type",
3756 "version": "2.3.1",
3757 "source": {
3758 "type": "git",
3759 "url": "https://github.com/sebastianbergmann/type.git",
3760 "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
3761 },
3762 "dist": {
3763 "type": "zip",
3764 "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
3765 "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
3766 "shasum": ""
3767 },
3768 "require": {
3769 "php": ">=7.3"
3770 },
3771 "require-dev": {
3772 "phpunit/phpunit": "^9.3"
3773 },
3774 "type": "library",
3775 "extra": {
3776 "branch-alias": {
3777 "dev-master": "2.3-dev"
3778 }
3779 },
3780 "autoload": {
3781 "classmap": [
3782 "src/"
3783 ]
3784 },
3785 "notification-url": "https://packagist.org/downloads/",
3786 "license": [
3787 "BSD-3-Clause"
3788 ],
3789 "authors": [
3790 {
3791 "name": "Sebastian Bergmann",
23263792 "email": "sebastian@phpunit.de",
23273793 "role": "lead"
23283794 }
23293795 ],
3796 "description": "Collection of value objects that represent the types of the PHP type system",
3797 "homepage": "https://github.com/sebastianbergmann/type",
3798 "support": {
3799 "issues": "https://github.com/sebastianbergmann/type/issues",
3800 "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
3801 },
3802 "funding": [
3803 {
3804 "url": "https://github.com/sebastianbergmann",
3805 "type": "github"
3806 }
3807 ],
3808 "time": "2020-10-26T13:18:59+00:00"
3809 },
3810 {
3811 "name": "sebastian/version",
3812 "version": "3.0.2",
3813 "source": {
3814 "type": "git",
3815 "url": "https://github.com/sebastianbergmann/version.git",
3816 "reference": "c6c1022351a901512170118436c764e473f6de8c"
3817 },
3818 "dist": {
3819 "type": "zip",
3820 "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
3821 "reference": "c6c1022351a901512170118436c764e473f6de8c",
3822 "shasum": ""
3823 },
3824 "require": {
3825 "php": ">=7.3"
3826 },
3827 "type": "library",
3828 "extra": {
3829 "branch-alias": {
3830 "dev-master": "3.0-dev"
3831 }
3832 },
3833 "autoload": {
3834 "classmap": [
3835 "src/"
3836 ]
3837 },
3838 "notification-url": "https://packagist.org/downloads/",
3839 "license": [
3840 "BSD-3-Clause"
3841 ],
3842 "authors": [
3843 {
3844 "name": "Sebastian Bergmann",
3845 "email": "sebastian@phpunit.de",
3846 "role": "lead"
3847 }
3848 ],
23303849 "description": "Library that helps with managing the version number of Git-hosted PHP projects",
23313850 "homepage": "https://github.com/sebastianbergmann/version",
2332 "time": "2016-10-03T07:35:21+00:00"
3851 "support": {
3852 "issues": "https://github.com/sebastianbergmann/version/issues",
3853 "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
3854 },
3855 "funding": [
3856 {
3857 "url": "https://github.com/sebastianbergmann",
3858 "type": "github"
3859 }
3860 ],
3861 "time": "2020-09-28T06:39:44+00:00"
23333862 },
23343863 {
23353864 "name": "slevomat/coding-standard",
2336 "version": "4.6.3",
3865 "version": "6.4.1",
23373866 "source": {
23383867 "type": "git",
23393868 "url": "https://github.com/slevomat/coding-standard.git",
2340 "reference": "76e31b7cb2ce1de53b36430a332daae2db0be549"
2341 },
2342 "dist": {
2343 "type": "zip",
2344 "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/76e31b7cb2ce1de53b36430a332daae2db0be549",
2345 "reference": "76e31b7cb2ce1de53b36430a332daae2db0be549",
2346 "shasum": ""
2347 },
2348 "require": {
2349 "php": "^7.1",
2350 "squizlabs/php_codesniffer": "^3.2.3"
2351 },
2352 "require-dev": {
2353 "jakub-onderka/php-parallel-lint": "1.0.0",
2354 "phing/phing": "2.16.1",
2355 "phpstan/phpstan": "0.9.2",
2356 "phpstan/phpstan-phpunit": "0.9.4",
2357 "phpstan/phpstan-strict-rules": "0.9",
2358 "phpunit/phpunit": "7.2.4"
3869 "reference": "696dcca217d0c9da2c40d02731526c1e25b65346"
3870 },
3871 "dist": {
3872 "type": "zip",
3873 "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346",
3874 "reference": "696dcca217d0c9da2c40d02731526c1e25b65346",
3875 "shasum": ""
3876 },
3877 "require": {
3878 "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
3879 "php": "^7.1 || ^8.0",
3880 "phpstan/phpdoc-parser": "0.4.5 - 0.4.9",
3881 "squizlabs/php_codesniffer": "^3.5.6"
3882 },
3883 "require-dev": {
3884 "phing/phing": "2.16.3",
3885 "php-parallel-lint/php-parallel-lint": "1.2.0",
3886 "phpstan/phpstan": "0.12.48",
3887 "phpstan/phpstan-deprecation-rules": "0.12.5",
3888 "phpstan/phpstan-phpunit": "0.12.16",
3889 "phpstan/phpstan-strict-rules": "0.12.5",
3890 "phpunit/phpunit": "7.5.20|8.5.5|9.4.0"
23593891 },
23603892 "type": "phpcodesniffer-standard",
3893 "extra": {
3894 "branch-alias": {
3895 "dev-master": "6.x-dev"
3896 }
3897 },
23613898 "autoload": {
23623899 "psr-4": {
23633900 "SlevomatCodingStandard\\": "SlevomatCodingStandard"
23683905 "MIT"
23693906 ],
23703907 "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
2371 "time": "2018-06-29T20:25:43+00:00"
3908 "support": {
3909 "issues": "https://github.com/slevomat/coding-standard/issues",
3910 "source": "https://github.com/slevomat/coding-standard/tree/6.4.1"
3911 },
3912 "funding": [
3913 {
3914 "url": "https://github.com/kukulich",
3915 "type": "github"
3916 },
3917 {
3918 "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
3919 "type": "tidelift"
3920 }
3921 ],
3922 "time": "2020-10-05T12:39:37+00:00"
23723923 },
23733924 {
23743925 "name": "squizlabs/php_codesniffer",
2375 "version": "3.3.0",
3926 "version": "3.5.8",
23763927 "source": {
23773928 "type": "git",
23783929 "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
2379 "reference": "d86873af43b4aa9d1f39a3601cc0cfcf02b25266"
2380 },
2381 "dist": {
2382 "type": "zip",
2383 "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d86873af43b4aa9d1f39a3601cc0cfcf02b25266",
2384 "reference": "d86873af43b4aa9d1f39a3601cc0cfcf02b25266",
3930 "reference": "9d583721a7157ee997f235f327de038e7ea6dac4"
3931 },
3932 "dist": {
3933 "type": "zip",
3934 "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4",
3935 "reference": "9d583721a7157ee997f235f327de038e7ea6dac4",
23853936 "shasum": ""
23863937 },
23873938 "require": {
24143965 }
24153966 ],
24163967 "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
2417 "homepage": "http://www.squizlabs.com/php-codesniffer",
3968 "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
24183969 "keywords": [
24193970 "phpcs",
24203971 "standards"
24213972 ],
2422 "time": "2018-06-06T23:58:19+00:00"
3973 "support": {
3974 "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
3975 "source": "https://github.com/squizlabs/PHP_CodeSniffer",
3976 "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
3977 },
3978 "time": "2020-10-23T02:01:07+00:00"
24233979 },
24243980 {
24253981 "name": "symfony/console",
2426 "version": "v4.1.1",
3982 "version": "v5.2.1",
24273983 "source": {
24283984 "type": "git",
24293985 "url": "https://github.com/symfony/console.git",
2430 "reference": "70591cda56b4b47c55776ac78e157c4bb6c8b43f"
2431 },
2432 "dist": {
2433 "type": "zip",
2434 "url": "https://api.github.com/repos/symfony/console/zipball/70591cda56b4b47c55776ac78e157c4bb6c8b43f",
2435 "reference": "70591cda56b4b47c55776ac78e157c4bb6c8b43f",
2436 "shasum": ""
2437 },
2438 "require": {
2439 "php": "^7.1.3",
2440 "symfony/polyfill-mbstring": "~1.0"
3986 "reference": "47c02526c532fb381374dab26df05e7313978976"
3987 },
3988 "dist": {
3989 "type": "zip",
3990 "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976",
3991 "reference": "47c02526c532fb381374dab26df05e7313978976",
3992 "shasum": ""
3993 },
3994 "require": {
3995 "php": ">=7.2.5",
3996 "symfony/polyfill-mbstring": "~1.0",
3997 "symfony/polyfill-php73": "^1.8",
3998 "symfony/polyfill-php80": "^1.15",
3999 "symfony/service-contracts": "^1.1|^2",
4000 "symfony/string": "^5.1"
24414001 },
24424002 "conflict": {
2443 "symfony/dependency-injection": "<3.4",
2444 "symfony/process": "<3.3"
4003 "symfony/dependency-injection": "<4.4",
4004 "symfony/dotenv": "<5.1",
4005 "symfony/event-dispatcher": "<4.4",
4006 "symfony/lock": "<4.4",
4007 "symfony/process": "<4.4"
4008 },
4009 "provide": {
4010 "psr/log-implementation": "1.0"
24454011 },
24464012 "require-dev": {
24474013 "psr/log": "~1.0",
2448 "symfony/config": "~3.4|~4.0",
2449 "symfony/dependency-injection": "~3.4|~4.0",
2450 "symfony/event-dispatcher": "~3.4|~4.0",
2451 "symfony/lock": "~3.4|~4.0",
2452 "symfony/process": "~3.4|~4.0"
4014 "symfony/config": "^4.4|^5.0",
4015 "symfony/dependency-injection": "^4.4|^5.0",
4016 "symfony/event-dispatcher": "^4.4|^5.0",
4017 "symfony/lock": "^4.4|^5.0",
4018 "symfony/process": "^4.4|^5.0",
4019 "symfony/var-dumper": "^4.4|^5.0"
24534020 },
24544021 "suggest": {
2455 "psr/log-implementation": "For using the console logger",
4022 "psr/log": "For using the console logger",
24564023 "symfony/event-dispatcher": "",
24574024 "symfony/lock": "",
24584025 "symfony/process": ""
24594026 },
24604027 "type": "library",
2461 "extra": {
2462 "branch-alias": {
2463 "dev-master": "4.1-dev"
2464 }
2465 },
24664028 "autoload": {
24674029 "psr-4": {
24684030 "Symfony\\Component\\Console\\": ""
24874049 ],
24884050 "description": "Symfony Console Component",
24894051 "homepage": "https://symfony.com",
2490 "time": "2018-05-31T10:17:53+00:00"
2491 },
2492 {
2493 "name": "symfony/finder",
2494 "version": "v4.1.1",
2495 "source": {
2496 "type": "git",
2497 "url": "https://github.com/symfony/finder.git",
2498 "reference": "84714b8417d19e4ba02ea78a41a975b3efaafddb"
2499 },
2500 "dist": {
2501 "type": "zip",
2502 "url": "https://api.github.com/repos/symfony/finder/zipball/84714b8417d19e4ba02ea78a41a975b3efaafddb",
2503 "reference": "84714b8417d19e4ba02ea78a41a975b3efaafddb",
2504 "shasum": ""
2505 },
2506 "require": {
2507 "php": "^7.1.3"
2508 },
2509 "type": "library",
2510 "extra": {
2511 "branch-alias": {
2512 "dev-master": "4.1-dev"
4052 "keywords": [
4053 "cli",
4054 "command line",
4055 "console",
4056 "terminal"
4057 ],
4058 "support": {
4059 "source": "https://github.com/symfony/console/tree/v5.2.1"
4060 },
4061 "funding": [
4062 {
4063 "url": "https://symfony.com/sponsor",
4064 "type": "custom"
4065 },
4066 {
4067 "url": "https://github.com/fabpot",
4068 "type": "github"
4069 },
4070 {
4071 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4072 "type": "tidelift"
4073 }
4074 ],
4075 "time": "2020-12-18T08:03:05+00:00"
4076 },
4077 {
4078 "name": "symfony/polyfill-ctype",
4079 "version": "v1.22.0",
4080 "source": {
4081 "type": "git",
4082 "url": "https://github.com/symfony/polyfill-ctype.git",
4083 "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
4084 },
4085 "dist": {
4086 "type": "zip",
4087 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
4088 "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
4089 "shasum": ""
4090 },
4091 "require": {
4092 "php": ">=7.1"
4093 },
4094 "suggest": {
4095 "ext-ctype": "For best performance"
4096 },
4097 "type": "library",
4098 "extra": {
4099 "branch-alias": {
4100 "dev-main": "1.22-dev"
4101 },
4102 "thanks": {
4103 "name": "symfony/polyfill",
4104 "url": "https://github.com/symfony/polyfill"
25134105 }
25144106 },
25154107 "autoload": {
25164108 "psr-4": {
2517 "Symfony\\Component\\Finder\\": ""
2518 },
2519 "exclude-from-classmap": [
2520 "/Tests/"
4109 "Symfony\\Polyfill\\Ctype\\": ""
4110 },
4111 "files": [
4112 "bootstrap.php"
25214113 ]
25224114 },
25234115 "notification-url": "https://packagist.org/downloads/",
25264118 ],
25274119 "authors": [
25284120 {
2529 "name": "Fabien Potencier",
2530 "email": "fabien@symfony.com"
4121 "name": "Gert de Pagter",
4122 "email": "BackEndTea@gmail.com"
25314123 },
25324124 {
25334125 "name": "Symfony Community",
25344126 "homepage": "https://symfony.com/contributors"
25354127 }
25364128 ],
2537 "description": "Symfony Finder Component",
4129 "description": "Symfony polyfill for ctype functions",
25384130 "homepage": "https://symfony.com",
2539 "time": "2018-06-19T21:38:16+00:00"
4131 "keywords": [
4132 "compatibility",
4133 "ctype",
4134 "polyfill",
4135 "portable"
4136 ],
4137 "support": {
4138 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0"
4139 },
4140 "funding": [
4141 {
4142 "url": "https://symfony.com/sponsor",
4143 "type": "custom"
4144 },
4145 {
4146 "url": "https://github.com/fabpot",
4147 "type": "github"
4148 },
4149 {
4150 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4151 "type": "tidelift"
4152 }
4153 ],
4154 "time": "2021-01-07T16:49:33+00:00"
4155 },
4156 {
4157 "name": "symfony/polyfill-intl-grapheme",
4158 "version": "v1.22.0",
4159 "source": {
4160 "type": "git",
4161 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
4162 "reference": "267a9adeb8ecb8071040a740930e077cdfb987af"
4163 },
4164 "dist": {
4165 "type": "zip",
4166 "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/267a9adeb8ecb8071040a740930e077cdfb987af",
4167 "reference": "267a9adeb8ecb8071040a740930e077cdfb987af",
4168 "shasum": ""
4169 },
4170 "require": {
4171 "php": ">=7.1"
4172 },
4173 "suggest": {
4174 "ext-intl": "For best performance"
4175 },
4176 "type": "library",
4177 "extra": {
4178 "branch-alias": {
4179 "dev-main": "1.22-dev"
4180 },
4181 "thanks": {
4182 "name": "symfony/polyfill",
4183 "url": "https://github.com/symfony/polyfill"
4184 }
4185 },
4186 "autoload": {
4187 "psr-4": {
4188 "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
4189 },
4190 "files": [
4191 "bootstrap.php"
4192 ]
4193 },
4194 "notification-url": "https://packagist.org/downloads/",
4195 "license": [
4196 "MIT"
4197 ],
4198 "authors": [
4199 {
4200 "name": "Nicolas Grekas",
4201 "email": "p@tchwork.com"
4202 },
4203 {
4204 "name": "Symfony Community",
4205 "homepage": "https://symfony.com/contributors"
4206 }
4207 ],
4208 "description": "Symfony polyfill for intl's grapheme_* functions",
4209 "homepage": "https://symfony.com",
4210 "keywords": [
4211 "compatibility",
4212 "grapheme",
4213 "intl",
4214 "polyfill",
4215 "portable",
4216 "shim"
4217 ],
4218 "support": {
4219 "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.0"
4220 },
4221 "funding": [
4222 {
4223 "url": "https://symfony.com/sponsor",
4224 "type": "custom"
4225 },
4226 {
4227 "url": "https://github.com/fabpot",
4228 "type": "github"
4229 },
4230 {
4231 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4232 "type": "tidelift"
4233 }
4234 ],
4235 "time": "2021-01-07T16:49:33+00:00"
4236 },
4237 {
4238 "name": "symfony/polyfill-intl-normalizer",
4239 "version": "v1.22.0",
4240 "source": {
4241 "type": "git",
4242 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
4243 "reference": "6e971c891537eb617a00bb07a43d182a6915faba"
4244 },
4245 "dist": {
4246 "type": "zip",
4247 "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba",
4248 "reference": "6e971c891537eb617a00bb07a43d182a6915faba",
4249 "shasum": ""
4250 },
4251 "require": {
4252 "php": ">=7.1"
4253 },
4254 "suggest": {
4255 "ext-intl": "For best performance"
4256 },
4257 "type": "library",
4258 "extra": {
4259 "branch-alias": {
4260 "dev-main": "1.22-dev"
4261 },
4262 "thanks": {
4263 "name": "symfony/polyfill",
4264 "url": "https://github.com/symfony/polyfill"
4265 }
4266 },
4267 "autoload": {
4268 "psr-4": {
4269 "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
4270 },
4271 "files": [
4272 "bootstrap.php"
4273 ],
4274 "classmap": [
4275 "Resources/stubs"
4276 ]
4277 },
4278 "notification-url": "https://packagist.org/downloads/",
4279 "license": [
4280 "MIT"
4281 ],
4282 "authors": [
4283 {
4284 "name": "Nicolas Grekas",
4285 "email": "p@tchwork.com"
4286 },
4287 {
4288 "name": "Symfony Community",
4289 "homepage": "https://symfony.com/contributors"
4290 }
4291 ],
4292 "description": "Symfony polyfill for intl's Normalizer class and related functions",
4293 "homepage": "https://symfony.com",
4294 "keywords": [
4295 "compatibility",
4296 "intl",
4297 "normalizer",
4298 "polyfill",
4299 "portable",
4300 "shim"
4301 ],
4302 "support": {
4303 "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0"
4304 },
4305 "funding": [
4306 {
4307 "url": "https://symfony.com/sponsor",
4308 "type": "custom"
4309 },
4310 {
4311 "url": "https://github.com/fabpot",
4312 "type": "github"
4313 },
4314 {
4315 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4316 "type": "tidelift"
4317 }
4318 ],
4319 "time": "2021-01-07T17:09:11+00:00"
25404320 },
25414321 {
25424322 "name": "symfony/polyfill-mbstring",
2543 "version": "v1.8.0",
4323 "version": "v1.22.0",
25444324 "source": {
25454325 "type": "git",
25464326 "url": "https://github.com/symfony/polyfill-mbstring.git",
2547 "reference": "3296adf6a6454a050679cde90f95350ad604b171"
2548 },
2549 "dist": {
2550 "type": "zip",
2551 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
2552 "reference": "3296adf6a6454a050679cde90f95350ad604b171",
2553 "shasum": ""
2554 },
2555 "require": {
2556 "php": ">=5.3.3"
4327 "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13"
4328 },
4329 "dist": {
4330 "type": "zip",
4331 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
4332 "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
4333 "shasum": ""
4334 },
4335 "require": {
4336 "php": ">=7.1"
25574337 },
25584338 "suggest": {
25594339 "ext-mbstring": "For best performance"
25614341 "type": "library",
25624342 "extra": {
25634343 "branch-alias": {
2564 "dev-master": "1.8-dev"
4344 "dev-main": "1.22-dev"
4345 },
4346 "thanks": {
4347 "name": "symfony/polyfill",
4348 "url": "https://github.com/symfony/polyfill"
25654349 }
25664350 },
25674351 "autoload": {
25954379 "portable",
25964380 "shim"
25974381 ],
2598 "time": "2018-04-26T10:06:28+00:00"
4382 "support": {
4383 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0"
4384 },
4385 "funding": [
4386 {
4387 "url": "https://symfony.com/sponsor",
4388 "type": "custom"
4389 },
4390 {
4391 "url": "https://github.com/fabpot",
4392 "type": "github"
4393 },
4394 {
4395 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4396 "type": "tidelift"
4397 }
4398 ],
4399 "time": "2021-01-07T16:49:33+00:00"
4400 },
4401 {
4402 "name": "symfony/polyfill-php73",
4403 "version": "v1.22.0",
4404 "source": {
4405 "type": "git",
4406 "url": "https://github.com/symfony/polyfill-php73.git",
4407 "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2"
4408 },
4409 "dist": {
4410 "type": "zip",
4411 "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
4412 "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
4413 "shasum": ""
4414 },
4415 "require": {
4416 "php": ">=7.1"
4417 },
4418 "type": "library",
4419 "extra": {
4420 "branch-alias": {
4421 "dev-main": "1.22-dev"
4422 },
4423 "thanks": {
4424 "name": "symfony/polyfill",
4425 "url": "https://github.com/symfony/polyfill"
4426 }
4427 },
4428 "autoload": {
4429 "psr-4": {
4430 "Symfony\\Polyfill\\Php73\\": ""
4431 },
4432 "files": [
4433 "bootstrap.php"
4434 ],
4435 "classmap": [
4436 "Resources/stubs"
4437 ]
4438 },
4439 "notification-url": "https://packagist.org/downloads/",
4440 "license": [
4441 "MIT"
4442 ],
4443 "authors": [
4444 {
4445 "name": "Nicolas Grekas",
4446 "email": "p@tchwork.com"
4447 },
4448 {
4449 "name": "Symfony Community",
4450 "homepage": "https://symfony.com/contributors"
4451 }
4452 ],
4453 "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
4454 "homepage": "https://symfony.com",
4455 "keywords": [
4456 "compatibility",
4457 "polyfill",
4458 "portable",
4459 "shim"
4460 ],
4461 "support": {
4462 "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0"
4463 },
4464 "funding": [
4465 {
4466 "url": "https://symfony.com/sponsor",
4467 "type": "custom"
4468 },
4469 {
4470 "url": "https://github.com/fabpot",
4471 "type": "github"
4472 },
4473 {
4474 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4475 "type": "tidelift"
4476 }
4477 ],
4478 "time": "2021-01-07T16:49:33+00:00"
4479 },
4480 {
4481 "name": "symfony/polyfill-php80",
4482 "version": "v1.22.0",
4483 "source": {
4484 "type": "git",
4485 "url": "https://github.com/symfony/polyfill-php80.git",
4486 "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
4487 },
4488 "dist": {
4489 "type": "zip",
4490 "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
4491 "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
4492 "shasum": ""
4493 },
4494 "require": {
4495 "php": ">=7.1"
4496 },
4497 "type": "library",
4498 "extra": {
4499 "branch-alias": {
4500 "dev-main": "1.22-dev"
4501 },
4502 "thanks": {
4503 "name": "symfony/polyfill",
4504 "url": "https://github.com/symfony/polyfill"
4505 }
4506 },
4507 "autoload": {
4508 "psr-4": {
4509 "Symfony\\Polyfill\\Php80\\": ""
4510 },
4511 "files": [
4512 "bootstrap.php"
4513 ],
4514 "classmap": [
4515 "Resources/stubs"
4516 ]
4517 },
4518 "notification-url": "https://packagist.org/downloads/",
4519 "license": [
4520 "MIT"
4521 ],
4522 "authors": [
4523 {
4524 "name": "Ion Bazan",
4525 "email": "ion.bazan@gmail.com"
4526 },
4527 {
4528 "name": "Nicolas Grekas",
4529 "email": "p@tchwork.com"
4530 },
4531 {
4532 "name": "Symfony Community",
4533 "homepage": "https://symfony.com/contributors"
4534 }
4535 ],
4536 "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
4537 "homepage": "https://symfony.com",
4538 "keywords": [
4539 "compatibility",
4540 "polyfill",
4541 "portable",
4542 "shim"
4543 ],
4544 "support": {
4545 "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0"
4546 },
4547 "funding": [
4548 {
4549 "url": "https://symfony.com/sponsor",
4550 "type": "custom"
4551 },
4552 {
4553 "url": "https://github.com/fabpot",
4554 "type": "github"
4555 },
4556 {
4557 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4558 "type": "tidelift"
4559 }
4560 ],
4561 "time": "2021-01-07T16:49:33+00:00"
4562 },
4563 {
4564 "name": "symfony/process",
4565 "version": "v5.2.1",
4566 "source": {
4567 "type": "git",
4568 "url": "https://github.com/symfony/process.git",
4569 "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd"
4570 },
4571 "dist": {
4572 "type": "zip",
4573 "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd",
4574 "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd",
4575 "shasum": ""
4576 },
4577 "require": {
4578 "php": ">=7.2.5",
4579 "symfony/polyfill-php80": "^1.15"
4580 },
4581 "type": "library",
4582 "autoload": {
4583 "psr-4": {
4584 "Symfony\\Component\\Process\\": ""
4585 },
4586 "exclude-from-classmap": [
4587 "/Tests/"
4588 ]
4589 },
4590 "notification-url": "https://packagist.org/downloads/",
4591 "license": [
4592 "MIT"
4593 ],
4594 "authors": [
4595 {
4596 "name": "Fabien Potencier",
4597 "email": "fabien@symfony.com"
4598 },
4599 {
4600 "name": "Symfony Community",
4601 "homepage": "https://symfony.com/contributors"
4602 }
4603 ],
4604 "description": "Symfony Process Component",
4605 "homepage": "https://symfony.com",
4606 "support": {
4607 "source": "https://github.com/symfony/process/tree/v5.2.1"
4608 },
4609 "funding": [
4610 {
4611 "url": "https://symfony.com/sponsor",
4612 "type": "custom"
4613 },
4614 {
4615 "url": "https://github.com/fabpot",
4616 "type": "github"
4617 },
4618 {
4619 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4620 "type": "tidelift"
4621 }
4622 ],
4623 "time": "2020-12-08T17:03:37+00:00"
4624 },
4625 {
4626 "name": "symfony/service-contracts",
4627 "version": "v2.2.0",
4628 "source": {
4629 "type": "git",
4630 "url": "https://github.com/symfony/service-contracts.git",
4631 "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
4632 },
4633 "dist": {
4634 "type": "zip",
4635 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
4636 "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
4637 "shasum": ""
4638 },
4639 "require": {
4640 "php": ">=7.2.5",
4641 "psr/container": "^1.0"
4642 },
4643 "suggest": {
4644 "symfony/service-implementation": ""
4645 },
4646 "type": "library",
4647 "extra": {
4648 "branch-alias": {
4649 "dev-master": "2.2-dev"
4650 },
4651 "thanks": {
4652 "name": "symfony/contracts",
4653 "url": "https://github.com/symfony/contracts"
4654 }
4655 },
4656 "autoload": {
4657 "psr-4": {
4658 "Symfony\\Contracts\\Service\\": ""
4659 }
4660 },
4661 "notification-url": "https://packagist.org/downloads/",
4662 "license": [
4663 "MIT"
4664 ],
4665 "authors": [
4666 {
4667 "name": "Nicolas Grekas",
4668 "email": "p@tchwork.com"
4669 },
4670 {
4671 "name": "Symfony Community",
4672 "homepage": "https://symfony.com/contributors"
4673 }
4674 ],
4675 "description": "Generic abstractions related to writing services",
4676 "homepage": "https://symfony.com",
4677 "keywords": [
4678 "abstractions",
4679 "contracts",
4680 "decoupling",
4681 "interfaces",
4682 "interoperability",
4683 "standards"
4684 ],
4685 "support": {
4686 "source": "https://github.com/symfony/service-contracts/tree/master"
4687 },
4688 "funding": [
4689 {
4690 "url": "https://symfony.com/sponsor",
4691 "type": "custom"
4692 },
4693 {
4694 "url": "https://github.com/fabpot",
4695 "type": "github"
4696 },
4697 {
4698 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4699 "type": "tidelift"
4700 }
4701 ],
4702 "time": "2020-09-07T11:33:47+00:00"
4703 },
4704 {
4705 "name": "symfony/string",
4706 "version": "v5.2.1",
4707 "source": {
4708 "type": "git",
4709 "url": "https://github.com/symfony/string.git",
4710 "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed"
4711 },
4712 "dist": {
4713 "type": "zip",
4714 "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
4715 "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
4716 "shasum": ""
4717 },
4718 "require": {
4719 "php": ">=7.2.5",
4720 "symfony/polyfill-ctype": "~1.8",
4721 "symfony/polyfill-intl-grapheme": "~1.0",
4722 "symfony/polyfill-intl-normalizer": "~1.0",
4723 "symfony/polyfill-mbstring": "~1.0",
4724 "symfony/polyfill-php80": "~1.15"
4725 },
4726 "require-dev": {
4727 "symfony/error-handler": "^4.4|^5.0",
4728 "symfony/http-client": "^4.4|^5.0",
4729 "symfony/translation-contracts": "^1.1|^2",
4730 "symfony/var-exporter": "^4.4|^5.0"
4731 },
4732 "type": "library",
4733 "autoload": {
4734 "psr-4": {
4735 "Symfony\\Component\\String\\": ""
4736 },
4737 "files": [
4738 "Resources/functions.php"
4739 ],
4740 "exclude-from-classmap": [
4741 "/Tests/"
4742 ]
4743 },
4744 "notification-url": "https://packagist.org/downloads/",
4745 "license": [
4746 "MIT"
4747 ],
4748 "authors": [
4749 {
4750 "name": "Nicolas Grekas",
4751 "email": "p@tchwork.com"
4752 },
4753 {
4754 "name": "Symfony Community",
4755 "homepage": "https://symfony.com/contributors"
4756 }
4757 ],
4758 "description": "Symfony String component",
4759 "homepage": "https://symfony.com",
4760 "keywords": [
4761 "grapheme",
4762 "i18n",
4763 "string",
4764 "unicode",
4765 "utf-8",
4766 "utf8"
4767 ],
4768 "support": {
4769 "source": "https://github.com/symfony/string/tree/v5.2.1"
4770 },
4771 "funding": [
4772 {
4773 "url": "https://symfony.com/sponsor",
4774 "type": "custom"
4775 },
4776 {
4777 "url": "https://github.com/fabpot",
4778 "type": "github"
4779 },
4780 {
4781 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
4782 "type": "tidelift"
4783 }
4784 ],
4785 "time": "2020-12-05T07:33:16+00:00"
25994786 },
26004787 {
26014788 "name": "theseer/tokenizer",
2602 "version": "1.1.0",
4789 "version": "1.2.0",
26034790 "source": {
26044791 "type": "git",
26054792 "url": "https://github.com/theseer/tokenizer.git",
2606 "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
2607 },
2608 "dist": {
2609 "type": "zip",
2610 "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
2611 "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
4793 "reference": "75a63c33a8577608444246075ea0af0d052e452a"
4794 },
4795 "dist": {
4796 "type": "zip",
4797 "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
4798 "reference": "75a63c33a8577608444246075ea0af0d052e452a",
26124799 "shasum": ""
26134800 },
26144801 "require": {
26154802 "ext-dom": "*",
26164803 "ext-tokenizer": "*",
26174804 "ext-xmlwriter": "*",
2618 "php": "^7.0"
4805 "php": "^7.2 || ^8.0"
26194806 },
26204807 "type": "library",
26214808 "autoload": {
26354822 }
26364823 ],
26374824 "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2638 "time": "2017-04-07T12:08:54+00:00"
4825 "support": {
4826 "issues": "https://github.com/theseer/tokenizer/issues",
4827 "source": "https://github.com/theseer/tokenizer/tree/master"
4828 },
4829 "funding": [
4830 {
4831 "url": "https://github.com/theseer",
4832 "type": "github"
4833 }
4834 ],
4835 "time": "2020-07-12T23:59:07+00:00"
4836 },
4837 {
4838 "name": "vimeo/psalm",
4839 "version": "4.4.1",
4840 "source": {
4841 "type": "git",
4842 "url": "https://github.com/vimeo/psalm.git",
4843 "reference": "9fd7a7d885b3a216cff8dec9d8c21a132f275224"
4844 },
4845 "dist": {
4846 "type": "zip",
4847 "url": "https://api.github.com/repos/vimeo/psalm/zipball/9fd7a7d885b3a216cff8dec9d8c21a132f275224",
4848 "reference": "9fd7a7d885b3a216cff8dec9d8c21a132f275224",
4849 "shasum": ""
4850 },
4851 "require": {
4852 "amphp/amp": "^2.1",
4853 "amphp/byte-stream": "^1.5",
4854 "composer/package-versions-deprecated": "^1.8.0",
4855 "composer/semver": "^1.4 || ^2.0 || ^3.0",
4856 "composer/xdebug-handler": "^1.1",
4857 "dnoegel/php-xdg-base-dir": "^0.1.1",
4858 "ext-dom": "*",
4859 "ext-json": "*",
4860 "ext-libxml": "*",
4861 "ext-mbstring": "*",
4862 "ext-simplexml": "*",
4863 "ext-tokenizer": "*",
4864 "felixfbecker/advanced-json-rpc": "^3.0.3",
4865 "felixfbecker/language-server-protocol": "^1.4",
4866 "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0",
4867 "nikic/php-parser": "^4.10.1",
4868 "openlss/lib-array2xml": "^1.0",
4869 "php": "^7.1|^8",
4870 "sebastian/diff": "^3.0 || ^4.0",
4871 "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0",
4872 "webmozart/path-util": "^2.3"
4873 },
4874 "provide": {
4875 "psalm/psalm": "self.version"
4876 },
4877 "require-dev": {
4878 "amphp/amp": "^2.4.2",
4879 "bamarni/composer-bin-plugin": "^1.2",
4880 "brianium/paratest": "^4.0||^6.0",
4881 "ext-curl": "*",
4882 "phpdocumentor/reflection-docblock": "^5",
4883 "phpmyadmin/sql-parser": "5.1.0||dev-master",
4884 "phpspec/prophecy": ">=1.9.0",
4885 "phpunit/phpunit": "^9.0",
4886 "psalm/plugin-phpunit": "^0.13",
4887 "slevomat/coding-standard": "^6.3.11",
4888 "squizlabs/php_codesniffer": "^3.5",
4889 "symfony/process": "^4.3",
4890 "weirdan/prophecy-shim": "^1.0 || ^2.0"
4891 },
4892 "suggest": {
4893 "ext-igbinary": "^2.0.5"
4894 },
4895 "bin": [
4896 "psalm",
4897 "psalm-language-server",
4898 "psalm-plugin",
4899 "psalm-refactor",
4900 "psalter"
4901 ],
4902 "type": "library",
4903 "extra": {
4904 "branch-alias": {
4905 "dev-master": "4.x-dev",
4906 "dev-3.x": "3.x-dev",
4907 "dev-2.x": "2.x-dev",
4908 "dev-1.x": "1.x-dev"
4909 }
4910 },
4911 "autoload": {
4912 "psr-4": {
4913 "Psalm\\": "src/Psalm/"
4914 },
4915 "files": [
4916 "src/functions.php",
4917 "src/spl_object_id.php"
4918 ]
4919 },
4920 "notification-url": "https://packagist.org/downloads/",
4921 "license": [
4922 "MIT"
4923 ],
4924 "authors": [
4925 {
4926 "name": "Matthew Brown"
4927 }
4928 ],
4929 "description": "A static analysis tool for finding errors in PHP applications",
4930 "keywords": [
4931 "code",
4932 "inspection",
4933 "php"
4934 ],
4935 "support": {
4936 "issues": "https://github.com/vimeo/psalm/issues",
4937 "source": "https://github.com/vimeo/psalm/tree/4.4.1"
4938 },
4939 "time": "2021-01-14T21:44:29+00:00"
26394940 },
26404941 {
26414942 "name": "webmozart/assert",
2642 "version": "1.3.0",
2643 "source": {
2644 "type": "git",
2645 "url": "https://github.com/webmozart/assert.git",
2646 "reference": "0df1908962e7a3071564e857d86874dad1ef204a"
2647 },
2648 "dist": {
2649 "type": "zip",
2650 "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a",
2651 "reference": "0df1908962e7a3071564e857d86874dad1ef204a",
2652 "shasum": ""
2653 },
2654 "require": {
2655 "php": "^5.3.3 || ^7.0"
2656 },
2657 "require-dev": {
2658 "phpunit/phpunit": "^4.6",
2659 "sebastian/version": "^1.0.1"
2660 },
2661 "type": "library",
2662 "extra": {
2663 "branch-alias": {
2664 "dev-master": "1.3-dev"
2665 }
2666 },
4943 "version": "1.9.1",
4944 "source": {
4945 "type": "git",
4946 "url": "https://github.com/webmozarts/assert.git",
4947 "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
4948 },
4949 "dist": {
4950 "type": "zip",
4951 "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
4952 "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
4953 "shasum": ""
4954 },
4955 "require": {
4956 "php": "^5.3.3 || ^7.0 || ^8.0",
4957 "symfony/polyfill-ctype": "^1.8"
4958 },
4959 "conflict": {
4960 "phpstan/phpstan": "<0.12.20",
4961 "vimeo/psalm": "<3.9.1"
4962 },
4963 "require-dev": {
4964 "phpunit/phpunit": "^4.8.36 || ^7.5.13"
4965 },
4966 "type": "library",
26674967 "autoload": {
26684968 "psr-4": {
26694969 "Webmozart\\Assert\\": "src/"
26854985 "check",
26864986 "validate"
26874987 ],
2688 "time": "2018-01-29T19:49:41+00:00"
4988 "support": {
4989 "issues": "https://github.com/webmozarts/assert/issues",
4990 "source": "https://github.com/webmozarts/assert/tree/1.9.1"
4991 },
4992 "time": "2020-07-08T17:02:28+00:00"
4993 },
4994 {
4995 "name": "webmozart/path-util",
4996 "version": "2.3.0",
4997 "source": {
4998 "type": "git",
4999 "url": "https://github.com/webmozart/path-util.git",
5000 "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
5001 },
5002 "dist": {
5003 "type": "zip",
5004 "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
5005 "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
5006 "shasum": ""
5007 },
5008 "require": {
5009 "php": ">=5.3.3",
5010 "webmozart/assert": "~1.0"
5011 },
5012 "require-dev": {
5013 "phpunit/phpunit": "^4.6",
5014 "sebastian/version": "^1.0.1"
5015 },
5016 "type": "library",
5017 "extra": {
5018 "branch-alias": {
5019 "dev-master": "2.3-dev"
5020 }
5021 },
5022 "autoload": {
5023 "psr-4": {
5024 "Webmozart\\PathUtil\\": "src/"
5025 }
5026 },
5027 "notification-url": "https://packagist.org/downloads/",
5028 "license": [
5029 "MIT"
5030 ],
5031 "authors": [
5032 {
5033 "name": "Bernhard Schussek",
5034 "email": "bschussek@gmail.com"
5035 }
5036 ],
5037 "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
5038 "support": {
5039 "issues": "https://github.com/webmozart/path-util/issues",
5040 "source": "https://github.com/webmozart/path-util/tree/2.3.0"
5041 },
5042 "time": "2015-12-17T08:42:14+00:00"
26895043 }
26905044 ],
26915045 "aliases": [],
26945048 "prefer-stable": false,
26955049 "prefer-lowest": false,
26965050 "platform": {
2697 "php": "^7.2",
5051 "php": "^7.2 || ^8.0",
26985052 "ext-pcre": "*"
26995053 },
2700 "platform-dev": []
5054 "platform-dev": [],
5055 "plugin-api-version": "2.0.0"
27015056 }
1616
1717 <rule ref="Doctrine">
1818 <exclude name="PSR1.Methods.CamelCapsMethodName"/>
19 <exclude name="SlevomatCodingStandard.Classes.DisallowLateStaticBindingForConstants.DisallowedLateStaticBindingForConstant"/>
20 <exclude name="SlevomatCodingStandard.PHP.RequireExplicitAssertion"/>
21 <exclude name="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint"/>
22 <exclude name="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceEqualOperator.RequiredNullCoalesceEqualOperator"/>
1923 </rule>
2024 <rule ref="PSR2">
2125 <exclude name="Generic.Files.LineLength"/>
00 parameters:
1 level: 7
2 paths:
3 - src
1 level: 8
2 paths:
3 - src
4 ignoreErrors:
5 - '#Unsafe usage of new static\(\)\.#'
0 <?xml version="1.0"?>
1 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="vendor/autoload.php" colors="true" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
2 <coverage>
3 <include>
4 <directory>./src</directory>
5 </include>
6 </coverage>
7 <testsuites>
8 <testsuite name="dflydev FIG Cookies Tests">
9 <directory>./tests</directory>
10 </testsuite>
11 </testsuites>
12 </phpunit>
0 <?xml version="1.0"?>
1 <psalm
2 errorLevel="3"
3 resolveFromConfigFile="true"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xmlns="https://getpsalm.org/schema/config"
6 xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
7 >
8 <projectFiles>
9 <directory name="src" />
10 <ignoreFiles>
11 <directory name="vendor" />
12 </ignoreFiles>
13 </projectFiles>
14 </psalm>
2020 $this->value = $value;
2121 }
2222
23 public function getName() : string
23 public function getName(): string
2424 {
2525 return $this->name;
2626 }
2727
28 public function getValue() : ?string
28 public function getValue(): ?string
2929 {
3030 return $this->value;
3131 }
3232
33 public function withValue(?string $value = null) : Cookie
33 public function withValue(?string $value = null): Cookie
3434 {
35 $clone = clone($this);
35 $clone = clone $this;
3636
3737 $clone->value = $value;
3838
4141
4242 /**
4343 * Render Cookie as a string.
44 *
4544 */
46 public function __toString() : string
45 public function __toString(): string
4746 {
4847 return urlencode($this->name) . '=' . urlencode((string) $this->value);
4948 }
5049
5150 /**
5251 * Create a Cookie.
53 *
5452 */
55 public static function create(string $name, ?string $value = null) : Cookie
53 public static function create(string $name, ?string $value = null): Cookie
5654 {
5755 return new static($name, $value);
5856 }
6260 *
6361 * @return Cookie[]
6462 */
65 public static function listFromCookieString(string $string) : array
63 public static function listFromCookieString(string $string): array
6664 {
6765 $cookies = StringUtil::splitOnAttributeDelimiter($string);
6866
69 return array_map(function ($cookiePair) {
67 return array_map(static function ($cookiePair) {
7068 return static::oneFromCookiePair($cookiePair);
7169 }, $cookies);
7270 }
7371
7472 /**
7573 * Create one Cookie from a cookie key/value header value string.
76 *
7774 */
78 public static function oneFromCookiePair(string $string) : Cookie
75 public static function oneFromCookiePair(string $string): Cookie
7976 {
80 list ($cookieName, $cookieValue) = StringUtil::splitCookiePair($string);
77 [$cookieName, $cookieValue] = StringUtil::splitCookiePair($string);
8178
82 /** @var Cookie $cookie */
8379 $cookie = new static($cookieName);
8480
8581 if ($cookieValue !== null) {
44 namespace Dflydev\FigCookies;
55
66 use Psr\Http\Message\RequestInterface;
7
78 use function array_values;
89 use function implode;
910
2526 }
2627 }
2728
28 public function has(string $name) : bool
29 public function has(string $name): bool
2930 {
3031 return isset($this->cookies[$name]);
3132 }
3233
33 public function get(string $name) : ?Cookie
34 public function get(string $name): ?Cookie
3435 {
3536 if (! $this->has($name)) {
3637 return null;
4041 }
4142
4243 /** @return Cookie[] */
43 public function getAll() : array
44 public function getAll(): array
4445 {
4546 return array_values($this->cookies);
4647 }
4748
48 public function with(Cookie $cookie) : Cookies
49 public function with(Cookie $cookie): Cookies
4950 {
50 $clone = clone($this);
51 $clone = clone $this;
5152
5253 $clone->cookies[$cookie->getName()] = $cookie;
5354
5455 return $clone;
5556 }
5657
57 public function without(string $name) : Cookies
58 public function without(string $name): Cookies
5859 {
59 $clone = clone($this);
60 $clone = clone $this;
6061
6162 if (! $clone->has($name)) {
6263 return $clone;
7071 /**
7172 * Render Cookies into a Request.
7273 */
73 public function renderIntoCookieHeader(RequestInterface $request) : RequestInterface
74 public function renderIntoCookieHeader(RequestInterface $request): RequestInterface
7475 {
7576 $cookieString = implode('; ', $this->cookies);
7677
8182
8283 /**
8384 * Create Cookies from a Cookie header value string.
84 *
85 * @return static
8685 */
87 public static function fromCookieString(string $string) : self
86 public static function fromCookieString(string $string): self
8887 {
8988 return new static(Cookie::listFromCookieString($string));
9089 }
9190
92 public static function fromRequest(RequestInterface $request) : Cookies
91 public static function fromRequest(RequestInterface $request): Cookies
9392 {
9493 $cookieString = $request->getHeaderLine(static::COOKIE_HEADER);
9594
55
66 use InvalidArgumentException;
77 use Psr\Http\Message\RequestInterface;
8
89 use function is_callable;
910
1011 class FigRequestCookies
1112 {
12 public static function get(RequestInterface $request, string $name, ?string $value = null) : Cookie
13 public static function get(RequestInterface $request, string $name, ?string $value = null): Cookie
1314 {
1415 $cookies = Cookies::fromRequest($request);
1516 $cookie = $cookies->get($name);
2122 return Cookie::create($name, $value);
2223 }
2324
24 public static function set(RequestInterface $request, Cookie $cookie) : RequestInterface
25 public static function set(RequestInterface $request, Cookie $cookie): RequestInterface
2526 {
2627 return Cookies::fromRequest($request)
2728 ->with($cookie)
28 ->renderIntoCookieHeader($request)
29 ;
29 ->renderIntoCookieHeader($request);
3030 }
3131
32 public static function modify(RequestInterface $request, string $name, callable $modify) : RequestInterface
32 public static function modify(RequestInterface $request, string $name, callable $modify): RequestInterface
3333 {
3434 if (! is_callable($modify)) {
3535 throw new InvalidArgumentException('$modify must be callable.');
4242
4343 return $cookies
4444 ->with($cookie)
45 ->renderIntoCookieHeader($request)
46 ;
45 ->renderIntoCookieHeader($request);
4746 }
4847
49 public static function remove(RequestInterface $request, string $name) : RequestInterface
48 public static function remove(RequestInterface $request, string $name): RequestInterface
5049 {
5150 return Cookies::fromRequest($request)
5251 ->without($name)
53 ->renderIntoCookieHeader($request)
54 ;
52 ->renderIntoCookieHeader($request);
5553 }
5654 }
55
66 use InvalidArgumentException;
77 use Psr\Http\Message\ResponseInterface;
8
89 use function is_callable;
910
1011 class FigResponseCookies
1112 {
12 public static function get(ResponseInterface $response, string $name, ?string $value = null) : SetCookie
13 public static function get(ResponseInterface $response, string $name, ?string $value = null): SetCookie
1314 {
1415 $setCookies = SetCookies::fromResponse($response);
1516 $cookie = $setCookies->get($name);
2122 return SetCookie::create($name, $value);
2223 }
2324
24 public static function set(ResponseInterface $response, SetCookie $setCookie) : ResponseInterface
25 public static function set(ResponseInterface $response, SetCookie $setCookie): ResponseInterface
2526 {
2627 return SetCookies::fromResponse($response)
2728 ->with($setCookie)
28 ->renderIntoSetCookieHeader($response)
29 ;
29 ->renderIntoSetCookieHeader($response);
3030 }
3131
32 public static function expire(ResponseInterface $response, string $cookieName) : ResponseInterface
32 /**
33 * @deprecated Do not use this method. Will be removed in v4.0.
34 *
35 * If you want to remove a cookie, create it normally and call ->expire()
36 * on the SetCookie object.
37 */
38 public static function expire(ResponseInterface $response, string $cookieName): ResponseInterface
3339 {
3440 return static::set($response, SetCookie::createExpired($cookieName));
3541 }
3642
37 public static function modify(ResponseInterface $response, string $name, callable $modify) : ResponseInterface
43 public static function modify(ResponseInterface $response, string $name, callable $modify): ResponseInterface
3844 {
3945 if (! is_callable($modify)) {
4046 throw new InvalidArgumentException('$modify must be callable.');
4753
4854 return $setCookies
4955 ->with($setCookie)
50 ->renderIntoSetCookieHeader($response)
51 ;
56 ->renderIntoSetCookieHeader($response);
5257 }
5358
54 public static function remove(ResponseInterface $response, string $name) : ResponseInterface
59 public static function remove(ResponseInterface $response, string $name): ResponseInterface
5560 {
5661 return SetCookies::fromResponse($response)
5762 ->without($name)
58 ->renderIntoSetCookieHeader($response)
59 ;
63 ->renderIntoSetCookieHeader($response);
6064 }
6165 }
33
44 namespace Dflydev\FigCookies\Modifier;
55
6 use InvalidArgumentException;
7
68 use function sprintf;
79 use function strtolower;
810
911 final class SameSite
1012 {
11 /** @var bool */
12 private $strict;
13 /**
14 * The possible string values of the SameSite setting
15 */
16 private const STRICT = 'Strict';
17 private const LAX = 'Lax';
18 private const NONE = 'None';
1319
14 private function __construct(bool $strict)
20 /** @var string */
21 private $value;
22
23 private function __construct(string $value)
1524 {
16 $this->strict = $strict;
25 $this->value = $value;
1726 }
1827
19 public static function strict() : self
28 public static function strict(): self
2029 {
21 return new self(true);
30 return new self(self::STRICT);
2231 }
2332
24 public static function lax() : self
33 public static function lax(): self
2534 {
26 return new self(false);
35 return new self(self::LAX);
36 }
37
38 public static function none(): self
39 {
40 return new self(self::NONE);
2741 }
2842
2943 /**
30 * @throws \InvalidArgumentException If the given SameSite string is neither strict nor lax.
44 * @throws InvalidArgumentException If the given SameSite string is neither strict nor lax.
3145 */
32 public static function fromString(string $sameSite) : self
46 public static function fromString(string $sameSite): self
3347 {
3448 $lowerCaseSite = strtolower($sameSite);
3549
4155 return self::lax();
4256 }
4357
44 throw new \InvalidArgumentException(sprintf(
45 'Expected modifier value to be either "strict" or "lax", "%s" given',
58 if ($lowerCaseSite === 'none') {
59 return self::none();
60 }
61
62 throw new InvalidArgumentException(sprintf(
63 'Expected modifier value to be either "strict", "lax", or "none", "%s" given',
4664 $sameSite
4765 ));
4866 }
4967
50 public function asString() : string
68 public function asString(): string
5169 {
52 return 'SameSite=' . ($this->strict ? 'Strict' : 'Lax');
70 return 'SameSite=' . $this->value;
5371 }
5472 }
66 use DateTime;
77 use DateTimeInterface;
88 use Dflydev\FigCookies\Modifier\SameSite;
9 use InvalidArgumentException;
10
911 use function array_shift;
1012 use function count;
1113 use function explode;
4648 $this->value = $value;
4749 }
4850
49 public function getName() : string
51 public function getName(): string
5052 {
5153 return $this->name;
5254 }
5355
54 public function getValue() : ?string
56 public function getValue(): ?string
5557 {
5658 return $this->value;
5759 }
5860
59 public function getExpires() : int
61 public function getExpires(): int
6062 {
6163 return $this->expires;
6264 }
6365
64 public function getMaxAge() : int
66 public function getMaxAge(): int
6567 {
6668 return $this->maxAge;
6769 }
6870
69 public function getPath() : ?string
71 public function getPath(): ?string
7072 {
7173 return $this->path;
7274 }
7375
74 public function getDomain() : ?string
76 public function getDomain(): ?string
7577 {
7678 return $this->domain;
7779 }
7880
79 public function getSecure() : bool
81 public function getSecure(): bool
8082 {
8183 return $this->secure;
8284 }
8385
84 public function getHttpOnly() : bool
86 public function getHttpOnly(): bool
8587 {
8688 return $this->httpOnly;
8789 }
8890
89 public function getSameSite() : ?SameSite
91 public function getSameSite(): ?SameSite
9092 {
9193 return $this->sameSite;
9294 }
9395
94 public function withValue(?string $value = null) : self
95 {
96 $clone = clone($this);
96 public function withValue(?string $value = null): self
97 {
98 $clone = clone $this;
9799
98100 $clone->value = $value;
99101
100102 return $clone;
101103 }
102104
103 /** @param int|\DateTimeInterface|string|null $expires */
104 private function resolveExpires($expires = null) : int
105 /** @param int|DateTimeInterface|string|null $expires */
106 private function resolveExpires($expires = null): int
105107 {
106108 if ($expires === null) {
107109 return 0;
108110 }
109111
110112 if ($expires instanceof DateTimeInterface) {
111 return $expires->getTimestamp();
113 return (int) $expires->getTimestamp();
112114 }
113115
114116 if (is_numeric($expires)) {
118120 $time = strtotime($expires);
119121
120122 if (! is_int($time)) {
121 throw new \InvalidArgumentException(sprintf('Invalid expires "%s" provided', $expires));
123 throw new InvalidArgumentException(sprintf('Invalid expires "%s" provided', $expires));
122124 }
123125
124126 return $time;
125127 }
126128
127 /** @param int|string|\DateTimeInterface|null $expires */
128 public function withExpires($expires = null) : self
129 /** @param int|string|DateTimeInterface|null $expires */
130 public function withExpires($expires = null): self
129131 {
130132 $expires = $this->resolveExpires($expires);
131133
132 $clone = clone($this);
134 $clone = clone $this;
133135
134136 $clone->expires = $expires;
135137
136138 return $clone;
137139 }
138140
139 public function rememberForever() : self
141 public function rememberForever(): self
140142 {
141143 return $this->withExpires(new DateTime('+5 years'));
142144 }
143145
144 public function expire() : self
146 public function expire(): self
145147 {
146148 return $this->withExpires(new DateTime('-5 years'));
147149 }
148150
149 public function withMaxAge(?int $maxAge = null) : self
150 {
151 $clone = clone($this);
151 public function withMaxAge(?int $maxAge = null): self
152 {
153 $clone = clone $this;
152154
153155 $clone->maxAge = (int) $maxAge;
154156
155157 return $clone;
156158 }
157159
158 public function withPath(?string $path = null) : self
159 {
160 $clone = clone($this);
160 public function withPath(?string $path = null): self
161 {
162 $clone = clone $this;
161163
162164 $clone->path = $path;
163165
164166 return $clone;
165167 }
166168
167 public function withDomain(?string $domain = null) : self
168 {
169 $clone = clone($this);
169 public function withDomain(?string $domain = null): self
170 {
171 $clone = clone $this;
170172
171173 $clone->domain = $domain;
172174
173175 return $clone;
174176 }
175177
176 public function withSecure(bool $secure = true) : self
177 {
178 $clone = clone($this);
178 public function withSecure(bool $secure = true): self
179 {
180 $clone = clone $this;
179181
180182 $clone->secure = $secure;
181183
182184 return $clone;
183185 }
184186
185 public function withHttpOnly(bool $httpOnly = true) : self
186 {
187 $clone = clone($this);
187 public function withHttpOnly(bool $httpOnly = true): self
188 {
189 $clone = clone $this;
188190
189191 $clone->httpOnly = $httpOnly;
190192
191193 return $clone;
192194 }
193195
194 public function withSameSite(SameSite $sameSite) : self
195 {
196 $clone = clone($this);
196 public function withSameSite(SameSite $sameSite): self
197 {
198 $clone = clone $this;
197199
198200 $clone->sameSite = $sameSite;
199201
200202 return $clone;
201203 }
202204
203 public function withoutSameSite() : self
204 {
205 $clone = clone($this);
205 public function withoutSameSite(): self
206 {
207 $clone = clone $this;
206208
207209 $clone->sameSite = null;
208210
209211 return $clone;
210212 }
211213
212 public function __toString() : string
214 public function __toString(): string
213215 {
214216 $cookieStringParts = [
215217 urlencode($this->name) . '=' . urlencode((string) $this->value),
226228 return implode('; ', $cookieStringParts);
227229 }
228230
229 public static function create(string $name, ?string $value = null) : self
231 public static function create(string $name, ?string $value = null): self
230232 {
231233 return new static($name, $value);
232234 }
233235
234 public static function createRememberedForever(string $name, ?string $value = null) : self
236 public static function createRememberedForever(string $name, ?string $value = null): self
235237 {
236238 return static::create($name, $value)->rememberForever();
237239 }
238240
239 public static function createExpired(string $name) : self
241 /**
242 * @deprecated Do not use this method. Will be removed in v4.0.
243 *
244 * If you want to remove a cookie, create it normally and call ->expire()
245 * on the SetCookie object.
246 */
247 public static function createExpired(string $name): self
240248 {
241249 return static::create($name)->expire();
242250 }
243251
244 public static function fromSetCookieString(string $string) : self
252 public static function fromSetCookieString(string $string): self
245253 {
246254 $rawAttributes = StringUtil::splitOnAttributeDelimiter($string);
247255
248256 $rawAttribute = array_shift($rawAttributes);
249257
250258 if (! is_string($rawAttribute)) {
251 throw new \InvalidArgumentException(sprintf(
259 throw new InvalidArgumentException(sprintf(
252260 'The provided cookie string "%s" must have at least one attribute',
253261 $string
254262 ));
255263 }
256264
257 list ($cookieName, $cookieValue) = StringUtil::splitCookiePair($rawAttribute);
258
259 /** @var SetCookie $setCookie */
265 [$cookieName, $cookieValue] = StringUtil::splitCookiePair($rawAttribute);
266
260267 $setCookie = new static($cookieName);
261268
262269 if ($cookieValue !== null) {
304311 *
305312 * @return string[]
306313 */
307 private function appendFormattedDomainPartIfSet(array $cookieStringParts) : array
314 private function appendFormattedDomainPartIfSet(array $cookieStringParts): array
308315 {
309316 if ($this->domain) {
310317 $cookieStringParts[] = sprintf('Domain=%s', $this->domain);
318325 *
319326 * @return string[]
320327 */
321 private function appendFormattedPathPartIfSet(array $cookieStringParts) : array
328 private function appendFormattedPathPartIfSet(array $cookieStringParts): array
322329 {
323330 if ($this->path) {
324331 $cookieStringParts[] = sprintf('Path=%s', $this->path);
332339 *
333340 * @return string[]
334341 */
335 private function appendFormattedExpiresPartIfSet(array $cookieStringParts) : array
342 private function appendFormattedExpiresPartIfSet(array $cookieStringParts): array
336343 {
337344 if ($this->expires) {
338345 $cookieStringParts[] = sprintf('Expires=%s', gmdate('D, d M Y H:i:s T', $this->expires));
346353 *
347354 * @return string[]
348355 */
349 private function appendFormattedMaxAgePartIfSet(array $cookieStringParts) : array
356 private function appendFormattedMaxAgePartIfSet(array $cookieStringParts): array
350357 {
351358 if ($this->maxAge) {
352359 $cookieStringParts[] = sprintf('Max-Age=%s', $this->maxAge);
360367 *
361368 * @return string[]
362369 */
363 private function appendFormattedSecurePartIfSet(array $cookieStringParts) : array
370 private function appendFormattedSecurePartIfSet(array $cookieStringParts): array
364371 {
365372 if ($this->secure) {
366373 $cookieStringParts[] = 'Secure';
374381 *
375382 * @return string[]
376383 */
377 private function appendFormattedHttpOnlyPartIfSet(array $cookieStringParts) : array
384 private function appendFormattedHttpOnlyPartIfSet(array $cookieStringParts): array
378385 {
379386 if ($this->httpOnly) {
380387 $cookieStringParts[] = 'HttpOnly';
388395 *
389396 * @return string[]
390397 */
391 private function appendFormattedSameSitePartIfSet(array $cookieStringParts) : array
398 private function appendFormattedSameSitePartIfSet(array $cookieStringParts): array
392399 {
393400 if ($this->sameSite === null) {
394401 return $cookieStringParts;
44 namespace Dflydev\FigCookies;
55
66 use Psr\Http\Message\ResponseInterface;
7
78 use function array_map;
89 use function array_values;
910
2526 }
2627 }
2728
28 public function has(string $name) : bool
29 public function has(string $name): bool
2930 {
3031 return isset($this->setCookies[$name]);
3132 }
3233
33 public function get(string $name) : ?SetCookie
34 public function get(string $name): ?SetCookie
3435 {
3536 if (! $this->has($name)) {
3637 return null;
4041 }
4142
4243 /** @return SetCookie[] */
43 public function getAll() : array
44 public function getAll(): array
4445 {
4546 return array_values($this->setCookies);
4647 }
4748
48 public function with(SetCookie $setCookie) : SetCookies
49 public function with(SetCookie $setCookie): SetCookies
4950 {
50 $clone = clone($this);
51 $clone = clone $this;
5152
5253 $clone->setCookies[$setCookie->getName()] = $setCookie;
5354
5455 return $clone;
5556 }
5657
57 public function without(string $name) : SetCookies
58 public function without(string $name): SetCookies
5859 {
59 $clone = clone($this);
60 $clone = clone $this;
6061
6162 if (! $clone->has($name)) {
6263 return $clone;
6970
7071 /**
7172 * Render SetCookies into a Response.
72 *
7373 */
74 public function renderIntoSetCookieHeader(ResponseInterface $response) : ResponseInterface
74 public function renderIntoSetCookieHeader(ResponseInterface $response): ResponseInterface
7575 {
7676 $response = $response->withoutHeader(static::SET_COOKIE_HEADER);
7777 foreach ($this->setCookies as $setCookie) {
8585 * Create SetCookies from a collection of SetCookie header value strings.
8686 *
8787 * @param string[] $setCookieStrings
88 * @return static
8988 */
90 public static function fromSetCookieStrings(array $setCookieStrings) : self
89 public static function fromSetCookieStrings(array $setCookieStrings): self
9190 {
92 return new static(array_map(function (string $setCookieString) : SetCookie {
91 return new static(array_map(static function (string $setCookieString): SetCookie {
9392 return SetCookie::fromSetCookieString($setCookieString);
9493 }, $setCookieStrings));
9594 }
9695
9796 /**
9897 * Create SetCookies from a Response.
99 *
10098 */
101 public static function fromResponse(ResponseInterface $response) : SetCookies
99 public static function fromResponse(ResponseInterface $response): SetCookies
102100 {
103 return new static(array_map(function (string $setCookieString) : SetCookie {
101 return new static(array_map(static function (string $setCookieString): SetCookie {
104102 return SetCookie::fromSetCookieString($setCookieString);
105103 }, $response->getHeader(static::SET_COOKIE_HEADER)));
106104 }
44 namespace Dflydev\FigCookies;
55
66 use function array_filter;
7 use function array_map;
87 use function assert;
98 use function explode;
109 use function is_array;
1110 use function preg_split;
11 use function urldecode;
1212
1313 class StringUtil
1414 {
1515 /** @return string[] */
16 public static function splitOnAttributeDelimiter(string $string) : array
16 public static function splitOnAttributeDelimiter(string $string): array
1717 {
1818 $splitAttributes = preg_split('@\s*[;]\s*@', $string);
1919
2323 }
2424
2525 /** @return string[] */
26 public static function splitCookiePair(string $string) : array
26 public static function splitCookiePair(string $string): array
2727 {
2828 $pairParts = explode('=', $string, 2);
29 $pairParts[1] = $pairParts[1] ?? '';
29 $pairParts[1] = urldecode($pairParts[1] ?? '');
3030
31 return array_map('urldecode', $pairParts);
31 return $pairParts;
3232 }
3333 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\TestCase;
7
8 use function count;
9
10 class CookieTest extends TestCase
11 {
12 /**
13 * @test
14 * @dataProvider provideParsesOneFromCookieStringData
15 */
16 public function it_parses_one_from_cookie_string(string $cookieString, string $expectedName, ?string $expectedValue): void
17 {
18 $cookie = Cookie::oneFromCookiePair($cookieString);
19
20 self::assertCookieNameAndValue($cookie, $expectedName, $expectedValue);
21 }
22
23 /**
24 * @param string[] $expectedNameValuePairs
25 *
26 * @test
27 * @dataProvider provideParsesListFromCookieString
28 */
29 public function it_parses_list_from_cookie_string(string $cookieString, array $expectedNameValuePairs): void
30 {
31 $cookies = Cookie::listFromCookieString($cookieString);
32
33 self::assertCount(count($expectedNameValuePairs), $cookies);
34
35 for ($i = 0; $i < count($cookies); $i++) {
36 $cookie = $cookies[$i];
37 [$expectedName, $expectedValue] = $expectedNameValuePairs[$i];
38
39 self::assertCookieNameAndValue($cookie, $expectedName, $expectedValue);
40 }
41 }
42
43 private function assertCookieNameAndValue(Cookie $cookie, string $expectedName, ?string $expectedValue): void
44 {
45 self::assertEquals($expectedName, $cookie->getName());
46 self::assertEquals($expectedValue, $cookie->getValue());
47 }
48
49 /** @return string[][] */
50 public function provideParsesOneFromCookieStringData(): array
51 {
52 return [
53 ['someCookie=something', 'someCookie', 'something'],
54 ['hello%3Dworld=how%22are%27you', 'hello%3Dworld', 'how"are\'you'],
55 ['empty=', 'empty', ''],
56 ['broken', 'broken', ''],
57 ];
58 }
59
60 /** @return string[][]|string[][][][] */
61 public function provideParsesListFromCookieString(): array
62 {
63 return [
64 [
65 'theme=light; sessionToken=abc123',
66 [
67 ['theme', 'light'],
68 ['sessionToken', 'abc123'],
69 ],
70 ],
71
72 [
73 'theme=light; sessionToken=abc123;',
74 [
75 ['theme', 'light'],
76 ['sessionToken', 'abc123'],
77 ],
78 ],
79 ];
80 }
81 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\MockObject\MockObject;
7 use PHPUnit\Framework\TestCase;
8 use Psr\Http\Message\RequestInterface;
9
10 use function str_rot13;
11
12 class CookiesTest extends TestCase
13 {
14 private const INTERFACE_PSR_HTTP_MESSAGE_REQUEST = RequestInterface::class;
15
16 /**
17 * @param Cookie[] $expectedCookies
18 *
19 * @test
20 * @dataProvider provideCookieStringAndExpectedCookiesData
21 */
22 public function it_creates_from_request(string $cookieString, array $expectedCookies): void
23 {
24 /** @var RequestInterface|MockObject $request */
25 $request = $this->createMock(self::INTERFACE_PSR_HTTP_MESSAGE_REQUEST);
26 $request->expects(self::once())->method('getHeaderLine')->with(Cookies::COOKIE_HEADER)->willReturn($cookieString);
27
28 $cookies = Cookies::fromRequest($request);
29
30 self::assertEquals($expectedCookies, $cookies->getAll());
31 }
32
33 /**
34 * @param Cookie[] $expectedCookies
35 *
36 * @test
37 * @dataProvider provideCookieStringAndExpectedCookiesData
38 */
39 public function it_creates_from_cookie_string(string $cookieString, array $expectedCookies): void
40 {
41 $cookies = Cookies::fromCookieString($cookieString);
42
43 self::assertEquals($expectedCookies, $cookies->getAll());
44 }
45
46 /**
47 * @param Cookie[] $expectedCookies
48 *
49 * @test
50 * @dataProvider provideCookieStringAndExpectedCookiesData
51 */
52 public function it_knows_which_cookies_are_available(string $cookieString, array $expectedCookies): void
53 {
54 $cookies = Cookies::fromCookieString($cookieString);
55
56 foreach ($expectedCookies as $expectedCookie) {
57 self::assertTrue($cookies->has($expectedCookie->getName()));
58 }
59
60 self::assertFalse($cookies->has('i know this cookie does not exist'));
61 }
62
63 /**
64 * @test
65 * @dataProvider provideGetsCookieByNameData
66 */
67 public function it_gets_cookie_by_name(string $cookieString, string $cookieName, Cookie $expectedCookie): void
68 {
69 $cookies = Cookies::fromCookieString($cookieString);
70
71 self::assertEquals($expectedCookie, $cookies->get($cookieName));
72 }
73
74 /**
75 * @test
76 */
77 public function it_sets_overrides_and_removes_cookie(): void
78 {
79 $cookies = new Cookies();
80
81 $cookies = $cookies->with(Cookie::create('theme', 'blue'));
82
83 self::assertEquals('blue', $cookies->get('theme')->getValue());
84
85 $cookies = $cookies->with(Cookie::create('theme', 'red'));
86
87 self::assertEquals('red', $cookies->get('theme')->getValue());
88
89 $cookies = $cookies->without('theme');
90
91 self::assertFalse($cookies->has('theme'));
92 }
93
94 /**
95 * @test
96 */
97 public function it_renders_new_cookies_into_empty_cookie_header(): void
98 {
99 $cookies = (new Cookies())
100 ->with(Cookie::create('theme', 'light'))
101 ->with(Cookie::create('sessionToken', 'abc123'));
102
103 $originalRequest = new FigCookieTestingRequest();
104 $request = $cookies->renderIntoCookieHeader($originalRequest);
105
106 self::assertNotEquals($request, $originalRequest);
107
108 self::assertEquals('theme=light; sessionToken=abc123', $request->getHeaderLine(Cookies::COOKIE_HEADER));
109 }
110
111 /**
112 * @test
113 */
114 public function it_renders_added_and_removed_cookies_header(): void
115 {
116 $cookies = Cookies::fromCookieString('theme=light; sessionToken=abc123; hello=world')
117 ->with(Cookie::create('theme', 'blue'))
118 ->without('sessionToken')
119 ->with(Cookie::create('who', 'me'));
120
121 $originalRequest = new FigCookieTestingRequest();
122 $request = $cookies->renderIntoCookieHeader($originalRequest);
123
124 self::assertNotEquals($request, $originalRequest);
125
126 self::assertEquals('theme=blue; hello=world; who=me', $request->getHeaderLine(Cookies::COOKIE_HEADER));
127 }
128
129 /**
130 * @test
131 */
132 public function it_gets_cookie_value_from_request(): void
133 {
134 // Example of accessing a cookie value.
135 // Simulate a request coming in with several cookies.
136 $request = (new FigCookieTestingRequest())
137 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
138
139 $theme = Cookies::fromRequest($request)->get('theme')->getValue();
140
141 self::assertEquals('light', $theme);
142 }
143
144 /**
145 * @test
146 */
147 public function it_gets_and_updates_cookie_value_on_request(): void
148 {
149 // Example of naive cookie decryption middleware.
150 //
151 // Shows how to access and manipulate cookies using PSR-7 Request
152 // instances from outside the Request object itself.
153 // Simulate a request coming in with several cookies.
154 $request = (new FigCookieTestingRequest())
155 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
156
157 // Get our cookies from the request.
158 $cookies = Cookies::fromRequest($request);
159
160 // Ask for the encrypted session token.
161 $encryptedSessionToken = $cookies->get('sessionToken');
162
163 // Get the encrypted value from the cookie and decrypt it.
164 $encryptedValue = $encryptedSessionToken->getValue();
165 $decryptedValue = str_rot13($encryptedValue);
166
167 // Create a new cookie with the decrypted value.
168 $decryptedSessionToken = $encryptedSessionToken->withValue($decryptedValue);
169
170 // Include our decrypted session token with the rest of our cookies.
171 $cookies = $cookies->with($decryptedSessionToken);
172
173 // Render our cookies, along with the newly decrypted session token, into a request.
174 $request = $cookies->renderIntoCookieHeader($request);
175
176 // From this point on, any request based on this one can get the plaintext version
177 // of the session token.
178 self::assertEquals(
179 'theme=light; sessionToken=ENCRYPTED; hello=world',
180 $request->getHeaderLine(Cookies::COOKIE_HEADER)
181 );
182 }
183
184 /** @return string[][]|Cookie[][][] */
185 public function provideCookieStringAndExpectedCookiesData(): array
186 {
187 return [
188 [
189 '',
190 [],
191 ],
192 [
193 'theme=light',
194 [
195 Cookie::create('theme', 'light'),
196 ],
197 ],
198 [
199 'theme=light; sessionToken=abc123',
200 [
201 Cookie::create('theme', 'light'),
202 Cookie::create('sessionToken', 'abc123'),
203 ],
204 ],
205 ];
206 }
207
208 /** @return string[][]|Cookie[][] */
209 public function provideGetsCookieByNameData(): array
210 {
211 return [
212 ['theme=light', 'theme', Cookie::create('theme', 'light')],
213 ['theme=', 'theme', Cookie::create('theme')],
214 ['hello=world; theme=light; sessionToken=abc123', 'theme', Cookie::create('theme', 'light')],
215 ['hello=world; theme=; sessionToken=abc123', 'theme', Cookie::create('theme')],
216 ];
217 }
218 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use Psr\Http\Message\StreamInterface;
7 use RuntimeException;
8
9 use function implode;
10
11 trait FigCookieTestingMessage
12 {
13 /** @var array<string, string[]> */
14 private $headers = [];
15
16 /** {@inheritDoc} */
17 public function getProtocolVersion(): string
18 {
19 throw new RuntimeException('This method has not been implemented.');
20 }
21
22 /** {@inheritDoc} */
23 public function withProtocolVersion($version)
24 {
25 throw new RuntimeException('This method has not been implemented.');
26 }
27
28 /** {@inheritDoc} */
29 public function hasHeader($name): bool
30 {
31 throw new RuntimeException('This method has not been implemented.');
32 }
33
34 /** {@inheritDoc} */
35 public function withHeader($name, $value)
36 {
37 $clone = clone $this;
38
39 $clone->headers[$name] = [$value];
40
41 return $clone;
42 }
43
44 /** {@inheritDoc} */
45 public function withAddedHeader($name, $value)
46 {
47 $clone = clone $this;
48
49 if (! isset($clone->headers[$name])) {
50 $clone->headers[$name] = [];
51 }
52
53 $clone->headers[$name][] = $value;
54
55 return $clone;
56 }
57
58 /** {@inheritDoc} */
59 public function withoutHeader($name)
60 {
61 $clone = clone $this;
62
63 if (isset($clone->headers[$name])) {
64 unset($clone->headers[$name]);
65 }
66
67 return $clone;
68 }
69
70 /** {@inheritDoc} */
71 public function getBody(): StreamInterface
72 {
73 throw new RuntimeException('This method has not been implemented.');
74 }
75
76 /** {@inheritDoc} */
77 public function withBody(StreamInterface $body): StreamInterface
78 {
79 throw new RuntimeException('This method has not been implemented.');
80 }
81
82 /** {@inheritDoc} */
83 public function getHeaders(): array
84 {
85 throw new RuntimeException('This method has not been implemented.');
86 }
87
88 /** {@inheritDoc} */
89 public function getHeader($name)
90 {
91 if (! isset($this->headers[$name])) {
92 return [];
93 }
94
95 return $this->headers[$name];
96 }
97
98 /** {@inheritDoc} */
99 public function getHeaderLine($name)
100 {
101 return implode(',', $this->headers[$name]);
102 }
103
104 /** {@inheritDoc} */
105 public function getHeaderLines($name)
106 {
107 if (! isset($this->headers[$name])) {
108 return [];
109 }
110
111 return $this->headers[$name];
112 }
113 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use Psr\Http\Message\RequestInterface;
7 use Psr\Http\Message\UriInterface;
8 use RuntimeException;
9
10 class FigCookieTestingRequest implements RequestInterface
11 {
12 use FigCookieTestingMessage;
13
14 public function getRequestTarget(): string
15 {
16 throw new RuntimeException('This method has not been implemented.');
17 }
18
19 /** {@inheritDoc} */
20 public function withRequestTarget($requestTarget)
21 {
22 throw new RuntimeException('This method has not been implemented.');
23 }
24
25 public function getMethod(): string
26 {
27 throw new RuntimeException('This method has not been implemented.');
28 }
29
30 /** {@inheritDoc} */
31 public function withMethod($method)
32 {
33 throw new RuntimeException('This method has not been implemented.');
34 }
35
36 public function getUri(): UriInterface
37 {
38 throw new RuntimeException('This method has not been implemented.');
39 }
40
41 /** {@inheritDoc} */
42 public function withUri(UriInterface $uri, $preserveHost = false)
43 {
44 throw new RuntimeException('This method has not been implemented.');
45 }
46 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use Psr\Http\Message\ResponseInterface;
7 use RuntimeException;
8
9 class FigCookieTestingResponse implements ResponseInterface
10 {
11 use FigCookieTestingMessage;
12
13 public function getStatusCode(): int
14 {
15 throw new RuntimeException('This method has not been implemented.');
16 }
17
18 /** {@inheritDoc} */
19 public function withStatus($code, $reasonPhrase = '')
20 {
21 throw new RuntimeException('This method has not been implemented.');
22 }
23
24 public function getReasonPhrase(): string
25 {
26 throw new RuntimeException('This method has not been implemented.');
27 }
28 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\TestCase;
7
8 use function str_rot13;
9
10 class FigCookiesTest extends TestCase
11 {
12 /**
13 * @test
14 */
15 public function it_encrypts_and_decrypts_cookies(): void
16 {
17 // Simulate a request coming in with several cookies.
18 $request = (new FigCookieTestingRequest())
19 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
20
21 // "Before" Middleware Example
22 //
23 // Get our token from an encrypted cookie value, "decrypt" it, and replace the cookie on the request.
24 // From here on out, any part of the system that gets our token will be able to see the contents
25 // in plaintext.
26 $request = FigRequestCookies::modify($request, 'sessionToken', static function (Cookie $cookie): Cookie {
27 return $cookie->withValue(str_rot13($cookie->getValue()));
28 });
29
30 // Even though the sessionToken initially comes in "encrypted", at this point (and any point in
31 // the future) the sessionToken cookie will be available in plaintext.
32 self::assertEquals(
33 'theme=light; sessionToken=ENCRYPTED; hello=world',
34 $request->getHeaderLine(Cookies::COOKIE_HEADER)
35 );
36
37 // Simulate a response going out.
38 $response = (new FigCookieTestingResponse());
39
40 // Various parts of the system will add set cookies to the response. In this case, we are
41 // going to show that the rest of the system interacts with the session token using
42 // plaintext.
43 $response = $response
44 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('theme', 'light'))
45 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('sessionToken', 'ENCRYPTED'))
46 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('hello', 'world'));
47
48 // "After" Middleware Example
49 //
50 // Get our token from an unencrypted set cookie value, "encrypt" it, and replace the cook on the response.
51 // From here on out, any part of the system that gets our token will only be able to see the encrypted
52 // value.
53 $response = FigResponseCookies::modify($response, 'sessionToken', static function (SetCookie $setCookie): SetCookie {
54 return $setCookie->withValue(str_rot13($setCookie->getValue()));
55 });
56
57 // Even though the sessionToken intiially went out "decrypted", at this point (and at any point
58 // in the future) the sessionToken cookie will remain "encrypted."
59 self::assertEquals(
60 ['theme=light', 'sessionToken=RAPELCGRQ', 'hello=world'],
61 $response->getHeader(SetCookies::SET_COOKIE_HEADER)
62 );
63 }
64 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\TestCase;
7
8 use function strtoupper;
9
10 class FigRequestCookiesTest extends TestCase
11 {
12 /**
13 * @test
14 */
15 public function it_gets_cookies(): void
16 {
17 $request = (new FigCookieTestingRequest())
18 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
19
20 self::assertEquals(
21 'RAPELCGRQ',
22 FigRequestCookies::get($request, 'sessionToken')->getValue()
23 );
24 }
25
26 /**
27 * @test
28 */
29 public function it_sets_cookies(): void
30 {
31 $request = (new FigCookieTestingRequest())
32 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
33
34 $request = FigRequestCookies::set($request, Cookie::create('hello', 'WORLD!'));
35
36 self::assertEquals(
37 'theme=light; sessionToken=RAPELCGRQ; hello=WORLD%21',
38 $request->getHeaderLine('Cookie')
39 );
40 }
41
42 /**
43 * @test
44 */
45 public function it_modifies_cookies(): void
46 {
47 $request = (new FigCookieTestingRequest())
48 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
49
50 $request = FigRequestCookies::modify($request, 'hello', static function (Cookie $cookie) {
51 return $cookie->withValue(strtoupper($cookie->getName()));
52 });
53
54 self::assertEquals(
55 'theme=light; sessionToken=RAPELCGRQ; hello=HELLO',
56 $request->getHeaderLine('Cookie')
57 );
58 }
59
60 /**
61 * @test
62 */
63 public function it_removes_cookies(): void
64 {
65 $request = (new FigCookieTestingRequest())
66 ->withHeader(Cookies::COOKIE_HEADER, 'theme=light; sessionToken=RAPELCGRQ; hello=world');
67
68 $request = FigRequestCookies::remove($request, 'sessionToken');
69
70 self::assertEquals(
71 'theme=light; hello=world',
72 $request->getHeaderLine('Cookie')
73 );
74 }
75 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\TestCase;
7
8 use function strtoupper;
9
10 class FigResponseCookiesTest extends TestCase
11 {
12 /**
13 * @test
14 */
15 public function it_gets_cookies(): void
16 {
17 $response = (new FigCookieTestingResponse());
18
19 $response = $response
20 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('theme', 'light'))
21 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('sessionToken', 'ENCRYPTED'))
22 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('hello', 'world'));
23
24 self::assertEquals(
25 'ENCRYPTED',
26 FigResponseCookies::get($response, 'sessionToken')->getValue()
27 );
28 }
29
30 /**
31 * @test
32 */
33 public function it_sets_cookies(): void
34 {
35 $response = (new FigCookieTestingResponse());
36
37 $response = $response
38 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('theme', 'light'))
39 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('sessionToken', 'ENCRYPTED'))
40 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('hello', 'world'));
41
42 $response = FigResponseCookies::set($response, SetCookie::create('hello', 'WORLD!'));
43
44 self::assertEquals(
45 'theme=light,sessionToken=ENCRYPTED,hello=WORLD%21',
46 $response->getHeaderLine('Set-Cookie')
47 );
48 }
49
50 /**
51 * @test
52 */
53 public function it_modifies_cookies(): void
54 {
55 $response = (new FigCookieTestingResponse());
56
57 $response = $response
58 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('theme', 'light'))
59 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('sessionToken', 'ENCRYPTED'))
60 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('hello', 'world'));
61
62 $response = FigResponseCookies::modify($response, 'hello', static function (SetCookie $setCookie) {
63 return $setCookie->withValue(strtoupper($setCookie->getName()));
64 });
65
66 self::assertEquals(
67 'theme=light,sessionToken=ENCRYPTED,hello=HELLO',
68 $response->getHeaderLine('Set-Cookie')
69 );
70 }
71
72 /**
73 * @test
74 */
75 public function it_removes_cookies(): void
76 {
77 $response = (new FigCookieTestingResponse());
78
79 $response = $response
80 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('theme', 'light'))
81 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('sessionToken', 'ENCRYPTED'))
82 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, SetCookie::create('hello', 'world'));
83
84 $response = FigResponseCookies::remove($response, 'sessionToken');
85
86 self::assertEquals(
87 'theme=light,hello=world',
88 $response->getHeaderLine('Set-Cookie')
89 );
90 }
91 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies\Modifier;
5
6 use InvalidArgumentException;
7 use PHPUnit\Framework\TestCase;
8
9 /**
10 * @covers \Dflydev\FigCookies\Modifier\SameSite
11 */
12 final class SameSiteTest extends TestCase
13 {
14 /** @test */
15 public function it_can_be_a_Strict_SameSite_modifier(): void
16 {
17 $strict = SameSite::strict();
18
19 self::assertInstanceOf('Dflydev\FigCookies\Modifier\SameSite', $strict);
20 self::assertSame('SameSite=Strict', $strict->asString());
21 self::assertEquals(SameSite::strict(), $strict, 'Multiple instances are equivalent');
22 }
23
24 /** @test */
25 public function it_can_be_a_Lax_SameSite_modifier(): void
26 {
27 $lax = SameSite::lax();
28
29 self::assertInstanceOf('Dflydev\FigCookies\Modifier\SameSite', $lax);
30 self::assertSame('SameSite=Lax', $lax->asString());
31 self::assertEquals(SameSite::lax(), $lax, 'Multiple instances are equivalent');
32 }
33
34 /** @test */
35 public function it_can_be_a_None_SameSite_modifier(): void
36 {
37 $none = SameSite::none();
38
39 self::assertInstanceOf('Dflydev\FigCookies\Modifier\SameSite', $none);
40 self::assertSame('SameSite=None', $none->asString());
41 self::assertEquals(SameSite::none(), $none, 'Multiple instances are equivalent');
42 }
43
44 /** @test */
45 public function lax_strict_and_none_are_different(): void
46 {
47 self::assertNotEquals(SameSite::lax(), SameSite::strict());
48 self::assertNotEquals(SameSite::lax(), SameSite::none());
49 self::assertNotEquals(SameSite::strict(), SameSite::none());
50 }
51
52 /** @test */
53 public function it_can_be_built_from_a_string(): void
54 {
55 self::assertEquals(SameSite::strict(), SameSite::fromString('Strict'));
56 self::assertEquals(SameSite::strict(), SameSite::fromString('strict'));
57 self::assertEquals(SameSite::strict(), SameSite::fromString('stRiCt'));
58 self::assertEquals(SameSite::lax(), SameSite::fromString('Lax'));
59 self::assertEquals(SameSite::lax(), SameSite::fromString('lax'));
60 self::assertEquals(SameSite::lax(), SameSite::fromString('lAx'));
61 self::assertEquals(SameSite::none(), SameSite::fromString('None'));
62 self::assertEquals(SameSite::none(), SameSite::fromString('none'));
63 self::assertEquals(SameSite::none(), SameSite::fromString('nOnE'));
64
65 $this->expectException(InvalidArgumentException::class);
66
67 SameSite::fromString('foo');
68 }
69 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use DateTime;
7 use Dflydev\FigCookies\Modifier\SameSite;
8 use InvalidArgumentException;
9 use PHPUnit\Framework\TestCase;
10
11 use function time;
12
13 class SetCookieTest extends TestCase
14 {
15 /**
16 * @test
17 * @dataProvider provideParsesFromSetCookieStringData
18 */
19 public function it_parses_from_set_cookie_string(string $cookieString, SetCookie $expectedSetCookie): void
20 {
21 $setCookie = SetCookie::fromSetCookieString($cookieString);
22
23 self::assertEquals($expectedSetCookie, $setCookie);
24 self::assertEquals($cookieString, (string) $setCookie);
25 }
26
27 /** @return string[][]|SetCookie[][] */
28 public function provideParsesFromSetCookieStringData(): array
29 {
30 return [
31 [
32 'someCookie=',
33 SetCookie::create('someCookie'),
34 ],
35 [
36 'someCookie=someValue',
37 SetCookie::create('someCookie')
38 ->withValue('someValue'),
39 ],
40 [
41 'LSID=DQAAAK%2FEaem_vYg; Path=/accounts; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
42 SetCookie::create('LSID')
43 ->withValue('DQAAAK/Eaem_vYg')
44 ->withPath('/accounts')
45 ->withExpires('Wed, 13 Jan 2021 22:23:01 GMT')
46 ->withSecure(true)
47 ->withHttpOnly(true),
48 ],
49 [
50 'HSID=AYQEVn%2F.DKrdst; Domain=.foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; HttpOnly',
51 SetCookie::create('HSID')
52 ->withValue('AYQEVn/.DKrdst')
53 ->withDomain('.foo.com')
54 ->withPath('/')
55 ->withExpires('Wed, 13 Jan 2021 22:23:01 GMT')
56 ->withHttpOnly(true),
57 ],
58 [
59 'SSID=Ap4P%2F.GTEq; Domain=foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
60 SetCookie::create('SSID')
61 ->withValue('Ap4P/.GTEq')
62 ->withDomain('foo.com')
63 ->withPath('/')
64 ->withExpires('Wed, 13 Jan 2021 22:23:01 GMT')
65 ->withSecure(true)
66 ->withHttpOnly(true),
67 ],
68 [
69 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; HttpOnly',
70 SetCookie::create('lu')
71 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
72 ->withExpires('Tue, 15-Jan-2013 21:47:38 GMT')
73 ->withPath('/')
74 ->withDomain('.example.com')
75 ->withHttpOnly(true),
76 ],
77 [
78 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Max-Age=500; Secure; HttpOnly',
79 SetCookie::create('lu')
80 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
81 ->withMaxAge(500)
82 ->withPath('/')
83 ->withDomain('.example.com')
84 ->withSecure(true)
85 ->withHttpOnly(true),
86 ],
87 [
88 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Max-Age=500; Secure; HttpOnly',
89 SetCookie::create('lu')
90 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
91 ->withExpires('Tue, 15-Jan-2013 21:47:38 GMT')
92 ->withMaxAge(500)
93 ->withPath('/')
94 ->withDomain('.example.com')
95 ->withSecure(true)
96 ->withHttpOnly(true),
97 ],
98 [
99 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Max-Age=500; Secure; HttpOnly',
100 SetCookie::create('lu')
101 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
102 ->withExpires(1358286458)
103 ->withMaxAge(500)
104 ->withPath('/')
105 ->withDomain('.example.com')
106 ->withSecure(true)
107 ->withHttpOnly(true),
108 ],
109 [
110 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Max-Age=500; Secure; HttpOnly',
111 SetCookie::create('lu')
112 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
113 ->withExpires(new DateTime('Tue, 15-Jan-2013 21:47:38 GMT'))
114 ->withMaxAge(500)
115 ->withPath('/')
116 ->withDomain('.example.com')
117 ->withSecure(true)
118 ->withHttpOnly(true),
119 ],
120 [
121 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Max-Age=500; Secure; HttpOnly; SameSite=Strict',
122 SetCookie::create('lu')
123 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
124 ->withExpires(new DateTime('Tue, 15-Jan-2013 21:47:38 GMT'))
125 ->withMaxAge(500)
126 ->withPath('/')
127 ->withDomain('.example.com')
128 ->withSecure(true)
129 ->withHttpOnly(true)
130 ->withSameSite(SameSite::strict()),
131 ],
132 [
133 'lu=Rg3vHJZnehYLjVg7qi3bZjzg; Domain=.example.com; Path=/; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Max-Age=500; Secure; HttpOnly; SameSite=Lax',
134 SetCookie::create('lu')
135 ->withValue('Rg3vHJZnehYLjVg7qi3bZjzg')
136 ->withExpires(new DateTime('Tue, 15-Jan-2013 21:47:38 GMT'))
137 ->withMaxAge(500)
138 ->withPath('/')
139 ->withDomain('.example.com')
140 ->withSecure(true)
141 ->withHttpOnly(true)
142 ->withSameSite(SameSite::lax()),
143 ],
144 ];
145 }
146
147 /**
148 * @test
149 */
150 public function it_expires_cookies(): void
151 {
152 $setCookie = SetCookie::create('HSID')
153 ->withValue('AYQEVn/.DKrdst')
154 ->withDomain('.foo.com')
155 ->withPath('/')
156 ->withHttpOnly(true)
157 ->expire();
158
159 self::assertLessThan(time(), $setCookie->getExpires());
160 }
161
162 /**
163 * @test
164 */
165 public function it_creates_long_living_cookies(): void
166 {
167 $setCookie = SetCookie::createRememberedForever('remember_forever');
168
169 $fourYearsFromNow = (new DateTime('+4 years'))->getTimestamp();
170 self::assertGreaterThan($fourYearsFromNow, $setCookie->getExpires());
171 }
172
173 /** @test */
174 public function SameSite_modifier_can_be_added_and_removed(): void
175 {
176 $setCookie = SetCookie::create('foo', 'bar');
177
178 self::assertNull($setCookie->getSameSite());
179 self::assertSame('foo=bar', $setCookie->__toString());
180
181 $setCookie = $setCookie->withSameSite(SameSite::strict());
182
183 self::assertEquals(SameSite::strict(), $setCookie->getSameSite());
184 self::assertSame('foo=bar; SameSite=Strict', $setCookie->__toString());
185
186 $setCookie = $setCookie->withoutSameSite();
187 self::assertNull($setCookie->getSameSite());
188 self::assertSame('foo=bar', $setCookie->__toString());
189 }
190
191 /** @test */
192 public function invalid_expires_format_will_be_rejected(): void
193 {
194 $setCookie = SetCookie::create('foo', 'bar');
195
196 $this->expectException(InvalidArgumentException::class);
197 $this->expectExceptionMessage('Invalid expires "potato" provided');
198
199 $setCookie->withExpires('potato');
200 }
201
202 /** @test */
203 public function empty_cookie_is_rejected(): void
204 {
205 $this->expectException(InvalidArgumentException::class);
206 $this->expectExceptionMessage('The provided cookie string "" must have at least one attribute');
207
208 SetCookie::fromSetCookieString('');
209 }
210 }
0 <?php
1
2 declare(strict_types=1);
3
4 namespace Dflydev\FigCookies;
5
6 use PHPUnit\Framework\MockObject\MockObject;
7 use PHPUnit\Framework\TestCase;
8 use Psr\Http\Message\ResponseInterface;
9
10 use function str_rot13;
11
12 class SetCookiesTest extends TestCase
13 {
14 public const INTERFACE_PSR_HTTP_MESSAGE_RESPONSE = ResponseInterface::class;
15
16 /**
17 * @param string[] $setCookieStrings
18 * @param SetCookie[] $expectedSetCookies
19 *
20 * @test
21 * @dataProvider provideSetCookieStringsAndExpectedSetCookiesData
22 */
23 public function it_creates_from_response(array $setCookieStrings, array $expectedSetCookies): void
24 {
25 /** @var ResponseInterface|MockObject $response */
26 $response = $this->createMock(self::INTERFACE_PSR_HTTP_MESSAGE_RESPONSE);
27 $response->expects(self::once())->method('getHeader')->with(SetCookies::SET_COOKIE_HEADER)->willReturn($setCookieStrings);
28
29 $setCookies = SetCookies::fromResponse($response);
30
31 self::assertEquals($expectedSetCookies, $setCookies->getAll());
32 }
33
34 /**
35 * @param string[] $setCookieStrings
36 * @param SetCookie[] $expectedSetCookies
37 *
38 * @test
39 * @dataProvider provideSetCookieStringsAndExpectedSetCookiesData
40 */
41 public function it_creates_from_set_cookie_strings(array $setCookieStrings, array $expectedSetCookies): void
42 {
43 $setCookies = SetCookies::fromSetCookieStrings($setCookieStrings);
44
45 self::assertEquals($expectedSetCookies, $setCookies->getAll());
46 }
47
48 /**
49 * @param string[] $setCookieStrings
50 * @param SetCookie[] $expectedSetCookies
51 *
52 * @test
53 * @dataProvider provideSetCookieStringsAndExpectedSetCookiesData
54 */
55 public function it_knows_which_set_cookies_are_available(array $setCookieStrings, array $expectedSetCookies): void
56 {
57 $setCookies = SetCookies::fromSetCookieStrings($setCookieStrings);
58
59 foreach ($expectedSetCookies as $expectedSetCookie) {
60 self::assertTrue($setCookies->has($expectedSetCookie->getName()));
61 }
62
63 self::assertFalse($setCookies->has('i know this cookie does not exist'));
64 }
65
66 /**
67 * @param string[] $setCookieStrings
68 *
69 * @test
70 * @dataProvider provideGetsSetCookieByNameData
71 */
72 public function it_gets_set_cookie_by_name(array $setCookieStrings, string $setCookieName, ?SetCookie $expectedSetCookie = null): void
73 {
74 $setCookies = SetCookies::fromSetCookieStrings($setCookieStrings);
75
76 self::assertEquals($expectedSetCookie, $setCookies->get($setCookieName));
77 }
78
79 /**
80 * @test
81 */
82 public function it_renders_added_and_removed_set_cookies_header(): void
83 {
84 $setCookies = SetCookies::fromSetCookieStrings(['theme=light', 'sessionToken=abc123', 'hello=world'])
85 ->with(SetCookie::create('theme', 'blue'))
86 ->without('sessionToken')
87 ->with(SetCookie::create('who', 'me'));
88
89 $originalResponse = new FigCookieTestingResponse();
90 $response = $setCookies->renderIntoSetCookieHeader($originalResponse);
91
92 self::assertNotEquals($response, $originalResponse);
93
94 self::assertEquals(
95 ['theme=blue', 'hello=world', 'who=me'],
96 $response->getHeader(SetCookies::SET_COOKIE_HEADER)
97 );
98 }
99
100 /**
101 * @test
102 */
103 public function it_gets_and_updates_set_cookie_value_on_request(): void
104 {
105 // Example of naive cookie encryption middleware.
106 //
107 // Shows how to access and manipulate cookies using PSR-7 Response
108 // instances from outside the Response object itself.
109 // Simulate a response coming in with several cookies.
110 $response = (new FigCookieTestingResponse())
111 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, 'theme=light')
112 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, 'sessionToken=ENCRYPTED')
113 ->withAddedHeader(SetCookies::SET_COOKIE_HEADER, 'hello=world');
114
115 // Get our set cookies from the response.
116 $setCookies = SetCookies::fromResponse($response);
117
118 // Ask for the encrypted session token.
119 $decryptedSessionToken = $setCookies->get('sessionToken');
120
121 // Get the encrypted value from the cookie and decrypt it.
122 $decryptedValue = $decryptedSessionToken->getValue();
123 $encryptedValue = str_rot13($decryptedValue);
124
125 // Create a new set cookie with the encrypted value.
126 $encryptedSessionToken = $decryptedSessionToken->withValue($encryptedValue);
127
128 // Include our encrypted session token with the rest of our cookies.
129 $setCookies = $setCookies->with($encryptedSessionToken);
130
131 // Render our cookies, along with the newly decrypted session token, into a response.
132 $response = $setCookies->renderIntoSetCookieHeader($response);
133
134 // From this point on, any response based on this one can get the encrypted version
135 // of the session token.
136 self::assertEquals(
137 ['theme=light', 'sessionToken=RAPELCGRQ', 'hello=world'],
138 $response->getHeader(SetCookies::SET_COOKIE_HEADER)
139 );
140 }
141
142 /** @return string[][][]|SetCookie[][][] */
143 public function provideSetCookieStringsAndExpectedSetCookiesData(): array
144 {
145 return [
146 [
147 [],
148 [],
149 ],
150 [
151 ['someCookie='],
152 [
153 SetCookie::create('someCookie'),
154 ],
155 ],
156 [
157 [
158 'someCookie=someValue',
159 'LSID=DQAAAK%2FEaem_vYg; Path=/accounts; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
160 ],
161 [
162 SetCookie::create('someCookie', 'someValue'),
163 SetCookie::create('LSID')
164 ->withValue('DQAAAK/Eaem_vYg')
165 ->withPath('/accounts')
166 ->withExpires('Wed, 13 Jan 2021 22:23:01 GMT')
167 ->withSecure(true)
168 ->withHttpOnly(true),
169 ],
170 ],
171 [
172 [
173 'a=AAA',
174 'b=BBB',
175 'c=CCC',
176 ],
177 [
178 SetCookie::create('a', 'AAA'),
179 SetCookie::create('b', 'BBB'),
180 SetCookie::create('c', 'CCC'),
181 ],
182 ],
183 ];
184 }
185
186 /** @return string[][]|string[][][]|SetCookie[][]|null[][] */
187 public function provideGetsSetCookieByNameData(): array
188 {
189 return [
190 [
191 [
192 'a=AAA',
193 'b=BBB',
194 'c=CCC',
195 ],
196 'b',
197 SetCookie::create('b', 'BBB'),
198 ],
199 [
200 [
201 'a=AAA',
202 'b=BBB',
203 'c=CCC',
204 'LSID=DQAAAK%2FEaem_vYg; Path=/accounts; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly',
205 ],
206 'LSID',
207 SetCookie::create('LSID')
208 ->withValue('DQAAAK/Eaem_vYg')
209 ->withPath('/accounts')
210 ->withExpires('Wed, 13 Jan 2021 22:23:01 GMT')
211 ->withSecure(true)
212 ->withHttpOnly(true),
213 ],
214 [
215 [
216 'a=AAA',
217 'b=BBB',
218 'c=CCC',
219 ],
220 'LSID',
221 null,
222 ],
223 ];
224 }
225 }