Codebase list php-dflydev-fig-cookies / fresh-snapshots/main
New upstream snapshot. Debian Janitor 2 years ago
33 changed file(s) with 5453 addition(s) and 1650 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.
6262
6363 While this style of design has many benefits it can become fairly
6464 verbose very quickly. In order to get around that, FIG Cookies provides
65 two facades in an attempt to help simply things and make the whole process
65 two facades in an attempt to help simplify things and make the whole process
6666 less verbose.
6767
6868
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 }
0 php-dflydev-fig-cookies (3.0.0+git20220125.1.eb5d1d4-1) UNRELEASED; urgency=low
1
2 * New upstream snapshot.
3
4 -- Debian Janitor <janitor@jelmer.uk> Sat, 05 Feb 2022 14:03:36 -0000
5
06 php-dflydev-fig-cookies (2.0.0-1) unstable; urgency=medium
17
28 * New upstream version.
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 }