diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5d3ee6f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: [push] + +jobs: + build-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: php-actions/composer@v5 # or alternative dependency management + - name: run tests + run: composer test + - name: change owner of phpcs + run: sudo chmod 777 ./vendor/bin/phpcs + - name: sniff + run: composer sniff diff --git a/.gitignore b/.gitignore index e220a7d..487474d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ composer.phar /vendor/ deploy .DS_Store -.idea/ \ No newline at end of file +.idea/ +.phpunit.result.cache diff --git a/README.md b/README.md index fb087c6..55b16aa 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,10 @@ How to run your own instance of indiewebify.me for development: All of the interesting stuff is in `/web/index.php` — or at least is until that gets too big and needs moving. +=== + +![workflow](https://github.com/indieweb/indiewebify-me/actions/workflows/ci.yml/badge.svg) + + diff --git a/app.yaml b/app.yaml index b9db2ee..5d79ffa 100644 --- a/app.yaml +++ b/app.yaml @@ -1,4 +1,4 @@ -runtime: php55 +runtime: php72 api_version: 1 automatic_scaling: max_idle_instances: 1 diff --git a/composer.json b/composer.json index 23219d3..ba3db2c 100644 --- a/composer.json +++ b/composer.json @@ -19,9 +19,15 @@ "indieweb/rel-me": "^0.1.1" }, "require-dev": { - "phpunit/phpunit": "*" + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "3.*" }, "autoload": { "files": [] + }, + "scripts": { + "test": "phpunit --bootstrap tests/bootstrap.php", + "sniff": "phpcs --standard=phpcs.xml */*.php", + "snifferfix" : "phpcbf --standard=phpcs.xml */*.php" } } diff --git a/composer.lock b/composer.lock index 562f842..8bdddeb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6870eba124c2be3bbe8279dfcdc89292", + "content-hash": "f7a5e5342bf5c5ca451ad42a5389ba0a", "packages": [ { "name": "barnabywalters/mf-cleaner", @@ -72,12 +72,12 @@ }, "type": "library", "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, "files": [ "library/HTMLPurifier.composer.php" - ] + ], + "psr-0": { + "HTMLPurifier": "library/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -95,70 +95,63 @@ "keywords": [ "html" ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.7.0" + }, "time": "2015-08-05T01:03:42+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "v3.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", - "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { - "ext-curl": "*", - "php": ">=5.3.3", - "symfony/event-dispatcher": ">=2.1" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, - "replace": { - "guzzle/batch": "self.version", - "guzzle/cache": "self.version", - "guzzle/common": "self.version", - "guzzle/http": "self.version", - "guzzle/inflection": "self.version", - "guzzle/iterator": "self.version", - "guzzle/log": "self.version", - "guzzle/parser": "self.version", - "guzzle/plugin": "self.version", - "guzzle/plugin-async": "self.version", - "guzzle/plugin-backoff": "self.version", - "guzzle/plugin-cache": "self.version", - "guzzle/plugin-cookie": "self.version", - "guzzle/plugin-curlauth": "self.version", - "guzzle/plugin-error-response": "self.version", - "guzzle/plugin-history": "self.version", - "guzzle/plugin-log": "self.version", - "guzzle/plugin-md5": "self.version", - "guzzle/plugin-mock": "self.version", - "guzzle/plugin-oauth": "self.version", - "guzzle/service": "self.version", - "guzzle/stream": "self.version" + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { - "doctrine/cache": "*", - "monolog/monolog": "1.*", - "phpunit/phpunit": "3.7.*", - "psr/log": "1.0.*", - "symfony/class-loader": "*", - "zendframework/zend-cache": "<2.3", - "zendframework/zend-log": "<2.3" + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.8-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "psr-0": { - "Guzzle": "src/", - "Guzzle\\Tests": "tests/" + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -166,49 +159,293 @@ "MIT" ], "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" }, { - "name": "Guzzle Community", - "homepage": "https://github.com/guzzle/guzzle/contributors" + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", - "homepage": "http://guzzlephp.org/", + "description": "Guzzle is a PHP HTTP client library", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], - "time": "2014-01-28T22:29:15+00:00" + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" }, { "name": "indieweb/mention-client", - "version": "1.1.8", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/indieweb/mention-client-php.git", - "reference": "20852ee619e43ef0f0c0be49877c6251f3a2b402" + "reference": "6807f4b1b96df7f47ea425eebfc7c032768652cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/indieweb/mention-client-php/zipball/20852ee619e43ef0f0c0be49877c6251f3a2b402", - "reference": "20852ee619e43ef0f0c0be49877c6251f3a2b402", + "url": "https://api.github.com/repos/indieweb/mention-client-php/zipball/6807f4b1b96df7f47ea425eebfc7c032768652cf", + "reference": "6807f4b1b96df7f47ea425eebfc7c032768652cf", "shasum": "" }, "require": { "mf2/mf2": ">=0.2", - "php": ">=5.4" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": ">=4.8.13" + "phpunit/phpunit": "^6" }, "type": "library", "autoload": { @@ -229,7 +466,11 @@ ], "description": "Client library for sending webmention and pingback notifications", "homepage": "https://github.com/indieweb/mention-client-php", - "time": "2018-04-16T13:26:38+00:00" + "support": { + "issues": "https://github.com/indieweb/mention-client-php/issues", + "source": "https://github.com/indieweb/mention-client-php/tree/1.2.1" + }, + "time": "2021-02-02T13:13:07+00:00" }, { "name": "indieweb/rel-me", @@ -270,48 +511,6 @@ }, "time": "2022-10-08T21:02:51+00:00" }, - { - "name": "ircmaxell/password-compat", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/password_compat.git", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "4.*" - }, - "type": "library", - "autoload": { - "files": [ - "lib/password.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@php.net", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", - "homepage": "https://github.com/ircmaxell/password_compat", - "keywords": [ - "hashing", - "password" - ], - "time": "2014-11-20T16:49:30+00:00" - }, { "name": "mf2/mf2", "version": "v0.5.0", @@ -376,30 +575,34 @@ }, { "name": "pimple/pimple", - "version": "v1.1.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.4.x-dev" } }, "autoload": { "psr-0": { - "Pimple": "lib/" + "Pimple": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -409,45 +612,46 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "email": "fabien@symfony.com" } ], - "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", - "homepage": "http://pimple.sensiolabs.org", + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", "keywords": [ "container", "dependency injection" ], - "time": "2013-11-22T08:30:29+00:00" + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" }, { - "name": "psr/log", - "version": "1.0.1", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/5277094ed527a1c4477177d102fe4c53551953e0", - "reference": "5277094ed527a1c4477177d102fe4c53551953e0", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -457,72 +661,51 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "log", - "psr", - "psr-3" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2016-09-19T16:02:08+00:00" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "silex/silex", - "version": "v1.3.5", + "name": "psr/http-client", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/silexphp/Silex.git", - "reference": "374c7e04040a6f781c90f7d746726a5daa78e783" + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Silex/zipball/374c7e04040a6f781c90f7d746726a5daa78e783", - "reference": "374c7e04040a6f781c90f7d746726a5daa78e783", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { - "php": ">=5.3.9", - "pimple/pimple": "~1.0", - "symfony/event-dispatcher": "~2.3|3.0.*", - "symfony/http-foundation": "~2.3|3.0.*", - "symfony/http-kernel": "~2.3|3.0.*", - "symfony/routing": "~2.3|3.0.*" - }, - "require-dev": { - "doctrine/dbal": "~2.2", - "monolog/monolog": "^1.4.1", - "swiftmailer/swiftmailer": "~5", - "symfony/browser-kit": "~2.3|3.0.*", - "symfony/config": "~2.3|3.0.*", - "symfony/css-selector": "~2.3|3.0.*", - "symfony/debug": "~2.3|3.0.*", - "symfony/dom-crawler": "~2.3|3.0.*", - "symfony/finder": "~2.3|3.0.*", - "symfony/form": "~2.3|3.0.*", - "symfony/locale": "~2.3|3.0.*", - "symfony/monolog-bridge": "~2.3|3.0.*", - "symfony/options-resolver": "~2.3|3.0.*", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.3|3.0.*", - "symfony/security": "~2.3|3.0.*", - "symfony/serializer": "~2.3|3.0.*", - "symfony/translation": "~2.3|3.0.*", - "symfony/twig-bridge": "~2.3|3.0.*", - "symfony/validator": "~2.3|3.0.*", - "twig/twig": "~1.8|~2.0" + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Silex\\": "src/Silex" + "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -531,60 +714,51 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "The PHP micro-framework based on the Symfony Components", - "homepage": "http://silex.sensiolabs.org", + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", "keywords": [ - "microframework" + "http", + "http-client", + "psr", + "psr-18" ], - "abandoned": "symfony/flex", - "time": "2016-01-06T14:59:35+00:00" + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" }, { - "name": "symfony/debug", - "version": "v2.8.11", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "8c29235936a47473af16fb91c7c4b7b193c5693c" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/8c29235936a47473af16fb91c7c4b7b193c5693c", - "reference": "8c29235936a47473af16fb91c7c4b7b193c5693c", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=5.3.9", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/class-loader": "~2.2|~3.0.0", - "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -592,59 +766,53 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2016-09-06T10:55:00+00:00" + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v2.8.11", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "889983a79a043dfda68f38c38b6dba092dd49cd8" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/889983a79a043dfda68f38c38b6dba092dd49cd8", - "reference": "889983a79a043dfda68f38c38b6dba092dd49cd8", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.6|~3.0.0", - "symfony/expression-language": "~2.6|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -652,54 +820,183 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2016-07-28T16:56:28+00:00" + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" }, { - "name": "symfony/http-foundation", - "version": "v2.8.11", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "1d4ab8de2215e44e57fddc1e6b5d122546769e7d" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1d4ab8de2215e44e57fddc1e6b5d122546769e7d", - "reference": "1d4ab8de2215e44e57fddc1e6b5d122546769e7d", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3.9", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php54": "~1.0", - "symfony/polyfill-php55": "~1.0" + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "silex/silex", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Silex.git", + "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Silex/zipball/6bc31c1b8c4ef614a7115320fd2d3b958032f131", + "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "pimple/pimple": "^3.0", + "symfony/event-dispatcher": "^4.0", + "symfony/http-foundation": "^4.0", + "symfony/http-kernel": "^4.0", + "symfony/routing": "^4.0" + }, + "replace": { + "silex/api": "self.version", + "silex/providers": "self.version" }, "require-dev": { - "symfony/expression-language": "~2.4|~3.0.0" + "doctrine/dbal": "^2.2", + "monolog/monolog": "^1.4.1", + "swiftmailer/swiftmailer": "^5", + "symfony/asset": "^4.0", + "symfony/browser-kit": "^4.0", + "symfony/config": "^4.0", + "symfony/css-selector": "^4.0", + "symfony/debug": "^4.0", + "symfony/doctrine-bridge": "^4.0", + "symfony/dom-crawler": "^4.0", + "symfony/expression-language": "^4.0", + "symfony/finder": "^4.0", + "symfony/form": "^4.0", + "symfony/intl": "^4.0", + "symfony/monolog-bridge": "^4.0", + "symfony/options-resolver": "^4.0", + "symfony/phpunit-bridge": "^3.2", + "symfony/process": "^4.0", + "symfony/security": "^4.0", + "symfony/serializer": "^4.0", + "symfony/translation": "^4.0", + "symfony/twig-bridge": "^4.0", + "symfony/validator": "^4.0", + "symfony/var-dumper": "^4.0", + "symfony/web-link": "^4.0", + "twig/twig": "^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Silex\\": "src/Silex" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -711,73 +1008,50 @@ "email": "fabien@symfony.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" } ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com", - "time": "2016-09-06T10:55:00+00:00" + "description": "The PHP micro-framework based on the Symfony Components", + "homepage": "http://silex.sensiolabs.org", + "keywords": [ + "microframework" + ], + "support": { + "issues": "https://github.com/silexphp/Silex/issues", + "source": "https://github.com/silexphp/Silex/tree/v2.3.0" + }, + "abandoned": "symfony/flex", + "time": "2018-04-20T05:17:01+00:00" }, { - "name": "symfony/http-kernel", - "version": "v2.8.11", + "name": "symfony/debug", + "version": "v4.4.44", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "a47004349e9216ab98a8019616a66e2d5c32b0ca" + "url": "https://github.com/symfony/debug.git", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a47004349e9216ab98a8019616a66e2d5c32b0ca", - "reference": "a47004349e9216ab98a8019616a66e2d5c32b0ca", + "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be", "shasum": "" }, "require": { - "php": ">=5.3.9", - "psr/log": "~1.0", - "symfony/debug": "~2.6,>=2.6.2", - "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0", - "symfony/http-foundation": "~2.7.15|~2.8.8|~3.0.8" + "php": ">=7.1.3", + "psr/log": "^1|^2|^3" }, "conflict": { - "symfony/config": "<2.7" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/browser-kit": "~2.3|~3.0.0", - "symfony/class-loader": "~2.1|~3.0.0", - "symfony/config": "~2.8", - "symfony/console": "~2.3|~3.0.0", - "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.8|~3.0.0", - "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0", - "symfony/expression-language": "~2.4|~3.0.0", - "symfony/finder": "~2.0,>=2.0.5|~3.0.0", - "symfony/process": "~2.0,>=2.0.5|~3.0.0", - "symfony/routing": "~2.8|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0", - "symfony/templating": "~2.2|~3.0.0", - "symfony/translation": "~2.0,>=2.0.5|~3.0.0", - "symfony/var-dumper": "~2.6|~3.0.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/class-loader": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" + "symfony/http-kernel": "^3.4|^4.0|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Component\\Debug\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -797,42 +1071,58 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", - "time": "2016-09-07T02:02:58+00:00" + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "abandoned": "symfony/error-handler", + "time": "2022-07-28T16:29:46+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.2.0", + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "dff51f72b0706335131b00a7f49606168c582594" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594", - "reference": "dff51f72b0706335131b00a7f49606168c582594", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ - "bootstrap.php" + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -849,49 +1139,58 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2016-05-18T14:26:46+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/polyfill-php54", - "version": "v1.2.0", + "name": "symfony/error-handler", + "version": "v4.4.44", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php54.git", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1" + "url": "https://github.com/symfony/error-handler.git", + "reference": "be731658121ef2d8be88f3a1ec938148a9237291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291", + "reference": "be731658121ef2d8be88f3a1ec938148a9237291", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1.3", + "psr/log": "^1|^2|^3", + "symfony/debug": "^4.4.5", + "symfony/var-dumper": "^4.4|^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php54\\": "" + "Symfony\\Component\\ErrorHandler\\": "" }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -900,54 +1199,82 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "support": { + "source": "https://github.com/symfony/error-handler/tree/v4.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2016-05-18T14:26:46+00:00" + "time": "2022-07-28T16:29:46+00:00" }, { - "name": "symfony/polyfill-php55", - "version": "v1.2.0", + "name": "symfony/event-dispatcher", + "version": "v4.4.44", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", "shasum": "" }, "require": { - "ircmaxell/password-compat": "~1.0", - "php": ">=5.3.3" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/polyfill-php80": "^1.16" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php55\\": "" + "Symfony\\Component\\EventDispatcher\\": "" }, - "files": [ - "bootstrap.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -956,324 +1283,2002 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2016-05-18T14:26:46+00:00" + "time": "2022-07-20T09:59:04+00:00" }, { - "name": "symfony/routing", - "version": "v2.8.11", + "name": "symfony/event-dispatcher-contracts", + "version": "v1.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6cee3ed22c778a7410119a3d51a20f60252a156c", - "reference": "6cee3ed22c778a7410119a3d51a20f60252a156c", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=7.1.3" }, - "conflict": { - "symfony/config": "<2.7" + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", - "psr/log": "~1.0", - "symfony/config": "~2.7|~3.0.0", - "symfony/expression-language": "~2.4|~3.0.0", - "symfony/http-foundation": "~2.3|~3.0.0", - "symfony/yaml": "~2.0,>=2.0.5|~3.0.0" + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/dependency-injection": "For loading routes from a service", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "fbfd73095ae958935396cf2243c47b01c677750c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/fbfd73095ae958935396cf2243c47b01c677750c", + "reference": "fbfd73095ae958935396cf2243c47b01c677750c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T09:13:00+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.4.49", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "191413c7b832c015bb38eae963f2e57498c3c173" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173", + "reference": "191413c7b832c015bb38eae963f2e57498c3c173", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v4.4.49" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-04T16:17:57+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.51", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7", + "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4.30|^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.43|<2.13,>=2" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.43|^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v4.4.51" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-10T13:31:29+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-23T20:18:32+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.4.44", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/f7751fd8b60a07f3f349947a309b5bdfce22d6ae", + "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "psr/log": "^1|^2|^3", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v4.4.44" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-20T09:59:04+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-08T15:21:10+00:00" + }, + { + "name": "tantek/cassis", + "version": "v0.3.19425", + "source": { + "type": "git", + "url": "https://github.com/tantek/cassis.git", + "reference": "7aaddd1883f4ac0f9447298d2f121ff72af46316" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tantek/cassis/zipball/7aaddd1883f4ac0f9447298d2f121ff72af46316", + "reference": "7aaddd1883f4ac0f9447298d2f121ff72af46316", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "cassis.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "CC-BY-SA-4.0" + ], + "support": { + "issues": "https://github.com/tantek/cassis/issues", + "source": "https://github.com/tantek/cassis/tree/v0.3.19425" + }, + "time": "2023-03-10T00:36:40+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "5.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "router", - "routing", - "uri", - "url" + "timer" ], - "time": "2016-08-16T14:56:08+00:00" - }, - { - "name": "tantek/cassis", - "version": "v0.2.16895", - "source": { - "type": "git", - "url": "https://github.com/tantek/cassis.git", - "reference": "357e30ad12017b4d67cac5f4400e8f371cd2f504" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tantek/cassis/zipball/357e30ad12017b4d67cac5f4400e8f371cd2f504", - "reference": "357e30ad12017b4d67cac5f4400e8f371cd2f504", - "shasum": "" - }, - "type": "library", - "autoload": { - "files": [ - "cassis.php" - ] + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, - "notification-url": "https://packagist.org/downloads/", - "time": "2016-04-04T15:31:04+00:00" - } - ], - "packages-dev": [ + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, { - "name": "doctrine/instantiator", - "version": "1.0.5", + "name": "phpunit/phpunit", + "version": "9.6.22", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "9.6-dev" } }, "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "constructor", - "instantiate" + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2024-12-05T13:48:26+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "name": "sebastian/cli-parser", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2015-02-03T12:10:50+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { - "name": "phpspec/prophecy", - "version": "v1.6.1", + "name": "sebastian/code-unit", + "version": "1.0.8", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1", - "sebastian/recursion-context": "^1.0" + "php": ">=7.3" }, "require-dev": { - "phpspec/phpspec": "^2.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2016-06-07T08:13:47+00:00" + "time": "2020-10-26T13:08:54+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "2.2.4", + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" + "php": ">=7.3" }, "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1288,40 +3293,49 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-10-06T15:47:00+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "1.4.1", + "name": "sebastian/comparator", + "version": "4.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1336,36 +3350,67 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "filesystem", - "iterator" + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-06-21T13:08:43+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "sebastian/complexity", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1382,34 +3427,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-06-21T13:50:34+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { - "name": "phpunit/php-timer", - "version": "1.0.8", + "name": "sebastian/diff", + "version": "4.0.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4|~5" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1422,42 +3480,60 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "timer" + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2016-05-12T18:03:57+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "1.4.8", + "name": "sebastian/environment", + "version": "5.1.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -1471,62 +3547,55 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-15T10:49:45+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { - "name": "phpunit/phpunit", - "version": "4.8.27", + "name": "sebastian/exporter", + "version": "4.0.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90", - "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, - "suggest": { - "phpunit/php-invoker": "~1.1" + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.8.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1541,49 +3610,73 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "phpunit", - "testing", - "xunit" + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2016-07-21T06:48:14+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", + "name": "sebastian/global-state", + "version": "5.0.7", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "ext-dom": "*", + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-soap": "*" + "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1598,44 +3691,51 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ - "mock", - "xunit" + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-10-02T06:51:40+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { - "name": "sebastian/comparator", - "version": "1.2.0", + "name": "sebastian/lines-of-code", + "version": "1.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -1648,56 +3748,52 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-07-26T15:48:44+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { - "name": "sebastian/diff", - "version": "1.4.1", + "name": "sebastian/object-enumerator", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1710,46 +3806,49 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-12-08T07:14:41+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { - "name": "sebastian/environment", - "version": "1.3.8", + "name": "sebastian/object-reflector", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1767,41 +3866,44 @@ "email": "sebastian@phpunit.de" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2016-08-18T05:49:44+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { - "name": "sebastian/exporter", - "version": "1.2.2", + "name": "sebastian/recursion-context", + "version": "4.0.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "php": ">=7.3" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1814,62 +3916,57 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2016-06-17T09:04:28+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { - "name": "sebastian/global-state", - "version": "1.1.1", + "name": "sebastian/resource-operations", + "version": "3.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -1887,37 +3984,43 @@ "email": "sebastian@phpunit.de" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-10-12T03:26:01+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { - "name": "sebastian/recursion-context", - "version": "1.0.2", + "name": "sebastian/type", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -1930,38 +4033,49 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11T19:50:13+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "1.0.6", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, + "require": { + "php": ">=7.3" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1980,64 +4094,155 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21T13:59:46+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { - "name": "symfony/yaml", - "version": "v2.8.11", + "name": "squizlabs/php_codesniffer", + "version": "3.11.1", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e7540734bad981fe59f8ef14b6fc194ae9df8d9c", - "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", "shasum": "" }, "require": { - "php": ">=5.3.9" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.x-dev" } }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" }, - "exclude-from-classmap": [ - "/Tests/" + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-11-16T12:02:36+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2016-09-02T01:57:56+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..d780283 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,30 @@ + + + IndieWebify Me Coding Standard + + vendor/* + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpunit.xml b/phpunit.xml index 63ca4b9..03675c3 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -4,4 +4,4 @@ tests/ - \ No newline at end of file + diff --git a/templates/footer.html.php b/templates/footer.html.php index 7c1839e..39361d6 100644 --- a/templates/footer.html.php +++ b/templates/footer.html.php @@ -1,5 +1,6 @@ - - + + + diff --git a/templates/header.html.php b/templates/header.html.php index c4b8c0f..db582b8 100644 --- a/templates/header.html.php +++ b/templates/header.html.php @@ -1,4 +1,4 @@ - + diff --git a/templates/index.html.php b/templates/index.html.php index fcc700a..24abb60 100644 --- a/templates/index.html.php +++ b/templates/index.html.php @@ -1,74 +1,74 @@
-
-
-

- IndieWebify.Me - A guide to getting you on the IndieWeb -

-
-
+
+
+

+ IndieWebify.Me + A guide to getting you on the IndieWeb +

+
+
-
-

What is the IndieWeb?

+
+

What is the IndieWeb?

-
- We should all own the content we're creating, rather than just posting to third-party content silos.Publish on your own domain, and syndicate out to silos. This is the basis of the "Indie Web" movement. – IndieWeb.org -
-
+
+ We should all own the content we're creating, rather than just posting to third-party content silos.Publish on your own domain, and syndicate out to silos. This is the basis of the "Indie Web" movement. – IndieWeb.org +
+

- + - + - + - +
-
- -

Federating IndieWeb Conversations Level 3

- -

1. Add Reply Contexts to your site

- -

Posting replies to other people’s posts is the next step after just being able to mention them with webmention.

- -

Usually a reply is a note just like any other, but linking in a special way to the post it’s in reply to. When marked up with h-entry and rel=in-reply-to and/or class=u-in-reply-to, your reply can show up as a comment on the original post.

- -

To test if your webmention sending is working, try replying to a post by someone who’s implemented comment receiving. There’s a list on the wiki.

- -

If you wish you can also go the extra mile and display a copy of the post you’re replying to. This is called a reply context, and is an excellent way to practise parsing posts on other people’s sites.

- -

2. Receive webmentions on your site

-

Now you can post replies which show up as comments on other people’s sites, the next step is to be able to receive comments yourself. There are several ways to do this.

- - - -

Once you’ve got webmention receiving set up, there are a few different ways of making sure it’s working correctly:

- - - -
+
+ +

Federating IndieWeb Conversations Level 3

+ +

1. Add Reply Contexts to your site

+ +

Posting replies to other people’s posts is the next step after just being able to mention them with webmention.

+ +

Usually a reply is a note just like any other, but linking in a special way to the post it’s in reply to. When marked up with h-entry and rel=in-reply-to and/or class=u-in-reply-to, your reply can show up as a comment on the original post.

+ +

To test if your webmention sending is working, try replying to a post by someone who’s implemented comment receiving. There’s a list on the wiki.

+ +

If you wish you can also go the extra mile and display a copy of the post you’re replying to. This is called a reply context, and is an excellent way to practise parsing posts on other people’s sites.

+ +

2. Receive webmentions on your site

+

Now you can post replies which show up as comments on other people’s sites, the next step is to be able to receive comments yourself. There are several ways to do this.

+ + + +

Once you’ve got webmention receiving set up, there are a few different ways of making sure it’s working correctly:

+ + + +
diff --git a/templates/send-webmentions.html.php b/templates/send-webmentions.html.php index 413304a..caf542f 100644 --- a/templates/send-webmentions.html.php +++ b/templates/send-webmentions.html.php @@ -1,56 +1,57 @@
-
- -

2. Add the ability to send Webmentions to other IndieWeb sites

- -

When you reply to something on another indieweb site, or mention someone with an indieweb site, sending a webmention lets them know they’ve been linked to.

- -

Sending webmentions allows you to write replies to other content and participate in cross-site conversations. You can send webmentions by:

- - - -

On the wiki: webmention

- - -
- -

Something Went Wrong!

-

When sending webmentions and pingbacks for , we got this problem:

-

- -

Successfully sent webmentions/pingbacks from

- - - -
-

No h-entries were found on !

- -

When you send webmentions from a page, the pages you’ve mentioned will usually fetch it and parse it for h-entry markup, to display as comments or notifications. You should mark up your posts with h-entry so the people you mention can do something useful with the information.

-
- -
- - -
-
- -
-
- -
-
- - -
-

Previous Step | Home

- - -
+
+ +

2. Add the ability to send Webmentions to other IndieWeb sites

+ +

When you reply to something on another indieweb site, or mention someone with an indieweb site, sending a webmention lets them know they’ve been linked to.

+ +

Sending webmentions allows you to write replies to other content and participate in cross-site conversations. You can send webmentions by:

+ + + +

On the wiki: webmention

+ + +
+ +

Something Went Wrong!

+

When sending webmentions and pingbacks for , we got this problem:

+

+ +

Successfully sent webmentions/pingbacks from

+ + + +
+

No h-entries were found on !

+ +

When you send webmentions from a page, the pages you’ve mentioned will usually fetch it and parse it for h-entry markup, to display as comments or notifications. You should mark up your posts with h-entry so the people you mention can do something useful with the information.

+
+ +
+ + +
+
+ +
+
+ +
+
+ + +
+

Previous Step | Home

+ + +
diff --git a/templates/silo-hint.html.php b/templates/silo-hint.html.php index b0a9abb..e4117db 100644 --- a/templates/silo-hint.html.php +++ b/templates/silo-hint.html.php @@ -1,33 +1,33 @@ - -
-

It looks like your site is hosted on the WordPress.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — here are some resources which might help you out:

-
    -
  1. Wordpress Support article on Domains
  2. -
  3. Wordpress.com custom domain premium upgrade
  4. -
-

Once you’ve got your own domain, check out the IndieWeb WordPress wiki page for tips and plugins for adding things like webmentions and microformats to your site.

-
+ +
+

It looks like your site is hosted on the WordPress.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — here are some resources which might help you out:

+
    +
  1. Wordpress Support article on Domains
  2. +
  3. Wordpress.com custom domain premium upgrade
  4. +
+

Once you’ve got your own domain, check out the IndieWeb WordPress wiki page for tips and plugins for adding things like webmentions and microformats to your site.

+
- -
-

It looks like your site is hosted on Tumblr.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Tumblr has an article demonstrating how to give your web presence your own domain.

-

Once you’ve got your own domain, check out the IndieWeb Tumblr wiki page for tips on adding indieweb functionality to your site, or exporting your data elsewhere.

-
+ +
+

It looks like your site is hosted on Tumblr.com Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Tumblr has an article demonstrating how to give your web presence your own domain.

+

Once you’ve got your own domain, check out the IndieWeb Tumblr wiki page for tips on adding indieweb functionality to your site, or exporting your data elsewhere.

+
- -
-

It looks like your site is hosted on Github.io Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Github has an article demonstrating how to give your web presence your own domain.

-

Once you’ve got your own domain, check out the IndieWeb Github wiki page for tips on adding indieweb functionality to your site.

-
+ +
+

It looks like your site is hosted on Github.io Silo without a custom domain name. In order to really own your content you need to own your URLs, but don’t worry — Github has an article demonstrating how to give your web presence your own domain.

+

Once you’ve got your own domain, check out the IndieWeb Github wiki page for tips on adding indieweb functionality to your site.

+
- -

It looks like you’re using WordPress to power your site — check out the IndieWeb WordPress wiki page for tips on how to indiewebify your WordPress site!

+ +

It looks like you’re using WordPress to power your site — check out the IndieWeb WordPress wiki page for tips on how to indiewebify your WordPress site!

- -

It looks like you’re using MediaWiki to power your site — check out the IndieWeb MediaWiki wiki page for tips on how to indiewebify your MediaWiki site!

+ +

It looks like you’re using MediaWiki to power your site — check out the IndieWeb MediaWiki wiki page for tips on how to indiewebify your MediaWiki site!

- -

It looks like you’re using idno to power your site — check out the IndieWeb idno wiki page for tips on how to indiewebify your idno site!

+ +

It looks like you’re using idno to power your site — check out the IndieWeb idno wiki page for tips on how to indiewebify your idno site!

diff --git a/templates/validate-h-card.html.php b/templates/validate-h-card.html.php index 50988ba..c9363e4 100644 --- a/templates/validate-h-card.html.php +++ b/templates/validate-h-card.html.php @@ -1,186 +1,186 @@ 'Honorific prefix', - 'given-name' => 'Given (often first) name', - 'additional-name' => 'Other/middle name', - 'family-name' => 'Family (often last) name', - 'sort-string' => 'String to sort by', - 'honorific-suffix' => 'Honorific suffix', - 'nickname' => 'Nickname', - 'email' => 'Email address', - 'logo' => 'Logo', - 'uid' => 'Unique identifier', - 'category' => 'Category/tag', - 'adr' => 'Postal Address', - 'post-office-box' => 'Post Office Box', - 'street-address' => 'Street number and name', - 'extended-address' => 'Extended address', - 'locality' => 'City/town/village', - 'region' => 'State/province/county', - 'postal-code' => 'Postal code', - 'country-name' => 'Country', - 'label' => 'Label', - 'geo' => 'Geo', - 'latitude' => 'Latitude', - 'longitude' => 'Longitude', - 'altitude' => 'Altitude', - 'tel' => 'Telephone', - 'bday' => 'Birth Date', - 'key' => 'Cryptographic public key', - 'org' => 'Organization', - 'job-title' => 'Job title', - 'role' => 'Description of role', - 'impp' => 'Instant Messaging and Presence Protocol', - 'sex' => 'Biological sex', - 'gender-identity' => 'Gender identity', - 'anniversary' => 'Anniversary', - ]; - - # default h-card to show properties for - $hCard = null; -?> + use BarnabyWalters\Mf2; + + $optional_properties = [ + 'honorific-prefix' => 'Honorific prefix', + 'given-name' => 'Given (often first) name', + 'additional-name' => 'Other/middle name', + 'family-name' => 'Family (often last) name', + 'sort-string' => 'String to sort by', + 'honorific-suffix' => 'Honorific suffix', + 'nickname' => 'Nickname', + 'email' => 'Email address', + 'logo' => 'Logo', + 'uid' => 'Unique identifier', + 'category' => 'Category/tag', + 'adr' => 'Postal Address', + 'post-office-box' => 'Post Office Box', + 'street-address' => 'Street number and name', + 'extended-address' => 'Extended address', + 'locality' => 'City/town/village', + 'region' => 'State/province/county', + 'postal-code' => 'Postal code', + 'country-name' => 'Country', + 'label' => 'Label', + 'geo' => 'Geo', + 'latitude' => 'Latitude', + 'longitude' => 'Longitude', + 'altitude' => 'Altitude', + 'tel' => 'Telephone', + 'bday' => 'Birth Date', + 'key' => 'Cryptographic public key', + 'org' => 'Organization', + 'job-title' => 'Job title', + 'role' => 'Description of role', + 'impp' => 'Instant Messaging and Presence Protocol', + 'sex' => 'Biological sex', + 'gender-identity' => 'Gender identity', + 'anniversary' => 'Anniversary', + ]; + + // default h-card to show properties for + $hCard = null; + ?>
-
- -

Publishing on the IndieWeb Level 2

- -

1. Mark up your content with microformats2

- -

Humans can already understand the things you post on your site. By adding a few short class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

- -

Check your homepage h-card:

- - -
-
- -
-
- -
-
- - -
-

Something Went Wrong!

-

When fetching , we got this problem:

-

-
- - - -
- - - -

Success!

-

This representative h-card was found on your site:

- - 0): - $hCard = $allHCards[0]; - $intro_phrase = 'An h-card was found on your site! Consider '; - if (count($allHCards) > 1) { - $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; - } - ?> - -

Almost there!

-

marking it up as the representative h-card.

-

To identify the h-card that represents the page, you can:

-
    -
  • Add class="u-url u-uid" on the h-card’s link to
  • -
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • -
-

Here is the first h-card found:

- - - -

No h-cards found

-

No h-cards were found on your site! Adding one can be as simple as this:

- -
<a href="" class="h-card" rel="me">Your Name</a>
- -

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

- - - - -
- - - - - -
-

Add a photo!

-

<img class="u-photo" src="…" />

-
- -

- -

URL

- -
    - -
  • - -
- -
-

Add your URLs! <a rel="me" class="u-url">…</a>

-
- - - -

Email

-
    - -
  • - -
- - - -

Note

-

- -
-

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

-
- - - $label) { - if (Mf2\hasProp($hCard, $name)) { - echo sprintf('

%s

    ', $label); - foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { - echo sprintf('
  • %s
  • ', $value); - } - echo '
'; - } - } - ?> - -

See the full list of h-card properties.

-
- - - $url)) ?> - -
- - - Want to be able to use h-card data in your code? Check out the open-source implementations. - - -
-

Previous Step | Home | Next Step

- - -
+
+ +

Publishing on the IndieWeb Level 2

+ +

1. Mark up your content with microformats2

+ +

Humans can already understand the things you post on your site. By adding a few short class names to your HTML, other people’s software can understand it and use it for things like reply contexts, cross-site comments, event RSVPs, and more.

+ +

Check your homepage h-card:

+ + +
+
+ +
+
+ +
+
+ + +
+

Something Went Wrong!

+

When fetching , we got this problem:

+

+
+ + + +
+ + + +

Success!

+

This representative h-card was found on your site:

+ + 0) : + $hCard = $allHCards[0]; + $intro_phrase = 'An h-card was found on your site! Consider '; + if (count($allHCards) > 1) { + $intro_phrase = 'Multiple h-cards were found on your site! Consider only having one and '; + } + ?> + +

Almost there!

+

marking it up as the representative h-card.

+

To identify the h-card that represents the page, you can:

+
    +
  • Add class="u-url u-uid" on the h-card’s link to
  • +
  • Or: add class="u-url" rel="me" on the h-card’s link to
  • +
+

Here is the first h-card found:

+ + + +

No h-cards found

+

No h-cards were found on your site! Adding one can be as simple as this:

+ +
<a href="" class="h-card" rel="me">Your Name</a>
+ +

You can also add other properties for a more detailed profile — see h-card on the microformats wiki for a full list.

+ + + + +
+ + + + + +
+

Add a photo!

+

<img class="u-photo" src="…" />

+
+ +

+ +

URL

+ +
    + +
  • + +
+ +
+

Add your URLs! <a rel="me" class="u-url">…</a>

+
+ + + +

Email

+
    + +
  • + +
+ + + +

Note

+

+ +
+

Got a brief bio like a Twitter/Instagram bio? Add it to your own h-card as a note property! <p class="p-note">…</p>

+
+ + + $label) { + if (Mf2\hasProp($hCard, $name)) { + echo sprintf('

%s

    ', $label); + foreach (Mf2\getPlaintextArray($hCard, $name) as $value) { + echo sprintf('
  • %s
  • ', $value); + } + echo '
'; + } + } + ?> + +

See the full list of h-card properties.

+
+ + + $url)) ?> + +
+ + + Want to be able to use h-card data in your code? Check out the open-source implementations. + + +
+

Previous Step | Home | Next Step

+ + +
diff --git a/templates/validate-h-entry.html.php b/templates/validate-h-entry.html.php index 6800366..da7d090 100644 --- a/templates/validate-h-entry.html.php +++ b/templates/validate-h-entry.html.php @@ -1,233 +1,234 @@
-
- -

Check your posts (notes, articles, etc.) are marked up with h-entry:

- -
-
- -
-
- -
-
- - -
- -

Something Went Wrong!

-

When fetching , we encountered this problem:

-

- -

Success!

- -

We found the following h-entry on your site:

- -
- - -

Name

-

- -

Name

-
-

The parsed name name is longer than the content, which is usually a sign is it malformed due to being implicitly rather than explicitly parsed.

- -

You should always manually specify what the name of a post is. If it doesn’t have one, make the name the same as the content, e.g. <div class="e-content p-name">…

-
- - -

Author

- - -
- - - -
-

Add a photo!

-

<img class="u-photo" src="…" />

-
- - - -
- -
-

You’re marking up your post’s author as a string — add h-card to make it a full h-card!

- -
<a class="p-author h-card" href="your-url.com">Your Name</a>
-
- - -
-

Add an author!

-
<a rel="author" class="p-author h-card" href="…">Your Name</a>
-
- - - - -

In Reply To

-
    - -
  • - - - - -

    The nested in-reply-to microformat should be an h-cite as it refers to off-site content.

    - - - - - -

    Give the nested microformat a URL property! <a class="u-url" href="…"></a>

    - - - The value for an in-reply-to property should be a URL or an embedded h-cite. - -
  • - -
- - -

Like Of

- - - - -

The nested h-cite microformat should be an h-cite as it refers to off-site content.

- - - - - -

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

- - - The value for a like-of property should be a URL or an embedded h-cite. - - - -

Repost Of

- - - - -

The nested h-cite microformat should be an h-cite as it refers to off-site content.

- - - - - -

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

- - - The value for a repost-of property should be a URL or an embedded h-cite. - - - - -

Content

- -
- -

It looks like your content is marked up as a plain property — consider using class="e-content" so that consumers can parse rich text (i.e. with images and formatting)

- - -
-

Add some content! <p class="e-content">…

-
- - -

Published - -

- - - - -

-
-

Add a publication datetime!

-

<time class="dt-published" datetime="YYYY-MM-DD HH:MM:SS">The Date</time>

-
- - -

URL - -

- -

Add a URL! <a class="u-url" href="…">…</a>

- - -

Syndicated Copies

- -
    - -
  • - -
- -
-

Add URLs of POSSEd copies!

-

<a rel="syndication" class="u-syndication" href="…">…</a>

-
- - -

Categories

- -
    - -
  • - -
- -

Add some categories! <a class="p-category" href="…">…</a>

- -
- -

No h-entry found

- -

Adding h-entry markup to posts on your site allows computers to understand them as easily as humans can, without publishing separate copies. All you need to do is add microformats2 h-entry classnames, for example:

- -
<article class="h-entry">
+    
+ +

Check your posts (notes, articles, etc.) are marked up with h-entry:

+ +
+
+ +
+
+ +
+
+ + +
+ +

Something Went Wrong!

+

When fetching , we encountered this problem:

+

+ +

Success!

+ +

We found the following h-entry on your site:

+ +
+ + +

Name

+

+ +

Name

+
+

The parsed name name is longer than the content, which is usually a sign is it malformed due to being implicitly rather than explicitly parsed.

+ +

You should always manually specify what the name of a post is. If it doesn’t have one, make the name the same as the content, e.g. <div class="e-content p-name">…

+
+ + +

Author

+ + +
+ + + +
+

Add a photo!

+

<img class="u-photo" src="…" />

+
+ + + +
+ +
+

You’re marking up your post’s author as a string — add h-card to make it a full h-card!

+ +
<a class="p-author h-card" href="your-url.com">Your Name</a>
+
+ + +
+

Add an author!

+
<a rel="author" class="p-author h-card" href="…">Your Name</a>
+
+ + + + +

In Reply To

+
    + +
  • + + + + +

    The nested in-reply-to microformat should be an h-cite as it refers to off-site content.

    + + + + + +

    Give the nested microformat a URL property! <a class="u-url" href="…"></a>

    + + + The value for an in-reply-to property should be a URL or an embedded h-cite. + +
  • + +
+ + +

Like Of

+ + + + +

The nested h-cite microformat should be an h-cite as it refers to off-site content.

+ + + + + +

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

+ + + The value for a like-of property should be a URL or an embedded h-cite. + + + +

Repost Of

+ + + + +

The nested h-cite microformat should be an h-cite as it refers to off-site content.

+ + + + + +

Give the nested microformat a URL property! <a class="u-url" href="…"></a>

+ + + The value for a repost-of property should be a URL or an embedded h-cite. + + + + +

Content

+ +
+ +

It looks like your content is marked up as a plain property — consider using class="e-content" so that consumers can parse rich text (i.e. with images and formatting)

+ + +
+

Add some content! <p class="e-content">…

+
+ + +

Published + +

+ + + + +

+
+

Add a publication datetime!

+

<time class="dt-published" datetime="YYYY-MM-DD HH:MM:SS">The Date</time>

+
+ + +

URL + +

+ +

Add a URL! <a class="u-url" href="…">…</a>

+ + +

Syndicated Copies

+ +
    + +
  • + +
+ +
+

Add URLs of POSSEd copies!

+

<a rel="syndication" class="u-syndication" href="…">…</a>

+
+ + +

Categories

+ +
    + +
  • + +
+ +

Add some categories! <a class="p-category" href="…">…</a>

+ +
+ +

No h-entry found

+ +

Adding h-entry markup to posts on your site allows computers to understand them as easily as humans can, without publishing separate copies. All you need to do is add microformats2 h-entry classnames, for example:

+ +
<article class="h-entry">
   <div class="e-content p-name">Hello world! This is my first indieweb post.</div>
 
   <a class="u-url" href="https://example.com/my-first-post">
-    Published <time class="dt-published"></time>
+    Published <time class="dt-published"></time>
   </a>
 </article>
- + - $url)) ?> -
+ $url)) ?> +
-

Your h-entries should have, at minimum, the following properties:

+

Your h-entries should have, at minimum, the following properties:

-
    -
  • e-content — the main content of the post
  • -
  • p-name — if your post is an article with a name, use this classname.
  • -
  • dt-published — the datetime the post was published at, in ISO8601 format, with a timezone
  • -
  • u-url — the canonical URL of the post, especially important on pages listing multiple posts
  • -
+
    +
  • e-content — the main content of the post
  • +
  • p-name — if your post is an article with a name, use this classname.
  • +
  • dt-published — the datetime the post was published at, in ISO8601 format, with a timezone
  • +
  • u-url — the canonical URL of the post, especially important on pages listing multiple posts
  • +
-

It’s a common convention for the published datetime to be a link to the post itself, but they can be separate if you want.

+

It’s a common convention for the published datetime to be a link to the post itself, but they can be separate if you want.

-

There should also be some way to discover the author of the post — either link to your homepage (which should have your h-card on it) from anywhere within the body of the page with rel=author, or optionally embed a p-author h-card in the h-entry.

+

There should also be some way to discover the author of the post — either link to your homepage (which should have your h-card on it) from anywhere within the body of the page with rel=author, or optionally embed a p-author h-card in the h-entry.

-

The web is an expressive medium, and as such there are many other properties which you can add to your posts. Check out the h-entry documentation for a full list.

- +

The web is an expressive medium, and as such there are many other properties which you can add to your posts. Check out the h-entry documentation for a full list.

+ - Want to be able to use h-entry data in your code? Check out the open-source implementations. + Want to be able to use h-entry data in your code? Check out the open-source implementations. - -
-

Previous Step | Home | Next Step

- + +
+

Previous Step | Home | Next Step

+ -
+
diff --git a/templates/validate-rel-me.html.php b/templates/validate-rel-me.html.php index 702dead..e0696fa 100644 --- a/templates/validate-rel-me.html.php +++ b/templates/validate-rel-me.html.php @@ -1,59 +1,60 @@
-
+
-

Become a citizen of the IndieWeb Level 1

+

Become a citizen of the IndieWeb Level 1

-

1. Get your own domain name

- -

A personal domain name is an inexpensive, internationally universal identifier which gives you more control over your space than other IDs (e.g. email address or phone number.)

- -

On the wiki: Personal Domains.

- -

2. Set up Web Sign In

- -

In order to be able to sign in using your domain name, connect it to your existing identities.

- -

You probably already have many disconnected profiles on the web. Linking between them and your domain name with the rel=me microformat ensures that it’s easy to see that you on Google/Twitter/Github/Flickr/Facebook/email are all the same person as your domain name.

- -

On the wiki: How to set up Web Sign In.

- - -
- -

Something Went Wrong!

-

When fetching , we got this problem:

-

- - -

We found the following rel=me URLs on your site:

- -
    - -
  • - -
- - - $url)) ?> -
- - -
-
- -
-
- -
-
- - Want to be able to use rel-me data in your code? Check out the open source implementations. +

1. Get your own domain name

+ +

A personal domain name is an inexpensive, internationally universal identifier which gives you more control over your space than other IDs (e.g. email address or phone number.)

+ +

On the wiki: Personal Domains.

+ +

2. Set up Web Sign In

+ +

In order to be able to sign in using your domain name, connect it to your existing identities.

+ +

You probably already have many disconnected profiles on the web. Linking between them and your domain name with the rel=me microformat ensures that it’s easy to see that you on Google/Twitter/Github/Flickr/Facebook/email are all the same person as your domain name.

+ +

On the wiki: How to set up Web Sign In.

+ + +
+ +

Something Went Wrong!

+

When fetching , we got this problem:

+

+ + +

We found the following rel=me URLs on your site:

+ +
    + +
  • + +
+ + + $url)) ?> +
+ + +
+
+ +
+
+ +
+
+ + Want to be able to use rel-me data in your code? Check out the open source implementations. - -
-

Home | Next Step

- + +
+

Home | Next Step

+ -
+
diff --git a/tests/RelMeTest.php b/tests/RelMeTest.php index 634c1e8..35833b4 100644 --- a/tests/RelMeTest.php +++ b/tests/RelMeTest.php @@ -1,27 +1,62 @@ + * @license https://opensource.org/licenses/MIT MIT + * @link https://indiewebify.me + */ + namespace IndieWeb; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * RelMeTest * - * @author barnabywalters + * @category Tests + * @package IndieWeb + * @author Display Name + * @license https://opensource.org/licenses/MIT MIT + * @link https://indiewebify.me */ -class RelMeTest extends PHPUnit_Framework_TestCase { - public function testUnparseUrl() { - $this->assertEquals('http://example.com/', unparseUrl(parse_url('http://example.com'))); - $this->assertEquals('http://example.com/?thing&more', unparseUrl(parse_url('http://example.com?thing&more'))); - } - - public function testNormaliseUrl() { - $this->assertEquals('http://example.com/', normaliseUrl('http://example.com')); - $this->assertEquals('http://example.com/?thing=1', normaliseUrl('http://example.com?thing=1')); - } - - public function testHttpParseHeaders() { - $test = <<assertEquals('http://example.com/', unparseUrl(parse_url('http://example.com'))); + $this->assertEquals('http://example.com/?thing&more', unparseUrl(parse_url('http://example.com?thing&more'))); + } + + /** + * Test Normalise URL + * + * @return void + */ + public function testNormaliseUrl() + { + $this->assertEquals('http://example.com/', normaliseUrl('http://example.com')); + $this->assertEquals('http://example.com/?thing=1', normaliseUrl('http://example.com?thing=1')); + } + + /** + * Test HTTP parse headers + * + * @return void + */ + public function testHttpParseHeaders() + { + $test = << 'text/html; charset=UTF-8', - 'Server' => 'Funky/1.0', - 'Set-Cookie' => array('foo=bar', 'baz=quux'), - 'Folded' => "works\r\n\ttoo" - ); - $result = http_parse_headers($test); - $this->assertEquals($expected, $result); - } - - /** @group network */ - /* There is already a test for this in indieweb/rel-me - public function testFollowOneRedirect() { - $this->assertEquals('https://brennannovak.com/', followOneRedirect('http://brennannovak.com')); - }*/ - - public function testRelMeDocumentUrlHandlesNoRedirect() { - $chain = mockFollowOneRedirect(array(null)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($meUrl, $url); - $this->assertTrue($isSecure); - } - - public function testRelMeDocumentUrlHandlesSingleSecureHttpRedirect() { - $finalUrl = normaliseUrl('http://example.org'); - $chain = mockFollowOneRedirect(array($finalUrl)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($finalUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() { - $finalUrl = normaliseUrl('http://example.org'); - $intermediateUrl = normaliseUrl('http://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('http://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesSingleSecureHttpsRedirect() { - $finalUrl = normaliseUrl('https://example.org'); - $chain = mockFollowOneRedirect(array($finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($finalUrl, $previous); - } - - public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() { - $finalUrl = normaliseUrl('https://example.org'); - $intermediateUrl = normaliseUrl('https://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertEquals($finalUrl, $url); - $this->assertTrue($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeDocumentUrlReportsInsecureRedirect() { - $finalUrl = normaliseUrl('http://example.org'); - $intermediateUrl = normaliseUrl('https://www.example.org'); - $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); - $meUrl = normaliseUrl('https://example.com'); - list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); - $this->assertFalse($isSecure); - $this->assertContains($intermediateUrl, $previous); - } - - public function testRelMeLinksFindsLinks() { - $relMeLinks = relMeLinks(<< 'text/html; charset=UTF-8', + 'Server' => 'Funky/1.0', + 'Set-Cookie' => array('foo=bar', 'baz=quux'), + 'Folded' => "works\r\n\ttoo" + ); + $result = http_parse_headers($test); + $this->assertEquals($expected, $result); + } + + // /** + // * @group network + // */ + // /* There is already a test for this in indieweb/rel-me + // public function testFollowOneRedirect() { + // $this->assertEquals('https://brennannovak.com/', followOneRedirect('http://brennannovak.com')); + // }*/ + + /** + * Test relMeDocumentUrl handles no redirect + * + * @return void + */ + public function testRelMeDocumentUrlHandlesNoRedirect() + { + $chain = mockFollowOneRedirect(array(null)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($meUrl, $url); + $this->assertTrue($isSecure); + } + + /** + * Test relMeDocumentUrl handles single secure http redirect + * + * @return void + */ + public function testRelMeDocumentUrlHandlesSingleSecureHttpRedirect() + { + $finalUrl = normaliseUrl('http://example.org'); + $chain = mockFollowOneRedirect(array($finalUrl)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($finalUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesMultipleSecureHttpRedirects() + { + $finalUrl = normaliseUrl('http://example.org'); + $intermediateUrl = normaliseUrl('http://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('http://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesSingleSecureHttpsRedirect() + { + $finalUrl = normaliseUrl('https://example.org'); + $chain = mockFollowOneRedirect(array($finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($finalUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles multiple redirects + * + * @return void + */ + public function testRelMeDocumentUrlHandlesMultipleSecureHttpsRedirects() + { + $finalUrl = normaliseUrl('https://example.org'); + $intermediateUrl = normaliseUrl('https://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertEquals($finalUrl, $url); + $this->assertTrue($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeDocumentUrl handles insecure redirect + * + * @return void + */ + public function testRelMeDocumentUrlReportsInsecureRedirect() + { + $finalUrl = normaliseUrl('http://example.org'); + $intermediateUrl = normaliseUrl('https://www.example.org'); + $chain = mockFollowOneRedirect(array($intermediateUrl, $finalUrl)); + $meUrl = normaliseUrl('https://example.com'); + list($url, $isSecure, $previous) = relMeDocumentUrl($meUrl, $chain); + $this->assertFalse($isSecure); + $this->assertContains($intermediateUrl, $previous); + } + + /** + * Test relMeLinks finds links + * + * @return void + */ + public function testRelMeLinksFindsLinks() + { + $relMeLinks = relMeLinks( + << Me EOT - , 'http://example.com'); - $this->assertEquals(array('http://example.org', 'http://twitter.com/barnabywalters'), $relMeLinks); - } - - // backlinkingRelMeSuccessNoRedirect tests - - public function testBacklinkingRelMeSuccessNoRedirect() { - $meUrl = $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl)); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertTrue($secure); - } - - public function testBacklinkingRelMeSuccessOneRedirect() { - $meUrl = 'http://example.com'; - $backlinkingMeUrl = 'http://example.org'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, $meUrl)); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertTrue($secure); - } - - public function testBacklinkingRelMeNoMatchInsecureRedirect() { - $meUrl = 'http://example.com'; - $backlinkingMeUrl = 'http://example.org'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertFalse($matches); - $this->assertFalse($secure); - } - - public function testBacklinkingRelMeSuccessInsecureRedirect() { - $meUrl = 'http://example.org'; - $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertTrue($matches); - $this->assertFalse($secure); - } - - public function testBacklinkingRelMeSecureRedirectNoMatch() { - $meUrl = 'http://example.org'; - $backlinkingMeUrl = 'http://example.com'; - $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'http://foo.org')); - list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); - $this->assertFalse($matches); - $this->assertTrue($secure); - } + , 'http://example.com' + ); + $this->assertEquals(array('http://example.org', 'http://twitter.com/barnabywalters'), $relMeLinks); + } + + /** + * BacklinkingRelMeSuccessNoRedirect tests + * + * @return void + */ + public function testBacklinkingRelMeSuccessNoRedirect() + { + $meUrl = $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl)); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertTrue($secure); + } + + public function testBacklinkingRelMeSuccessOneRedirect() + { + $meUrl = 'http://example.com'; + $backlinkingMeUrl = 'http://example.org'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, $meUrl)); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertTrue($secure); + } + + public function testBacklinkingRelMeNoMatchInsecureRedirect() + { + $meUrl = 'http://example.com'; + $backlinkingMeUrl = 'http://example.org'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertFalse($matches); + $this->assertFalse($secure); + } + + public function testBacklinkingRelMeSuccessInsecureRedirect() + { + $meUrl = 'http://example.org'; + $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'https://example.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertTrue($matches); + $this->assertFalse($secure); + } + + public function testBacklinkingRelMeSecureRedirectNoMatch() + { + $meUrl = 'http://example.org'; + $backlinkingMeUrl = 'http://example.com'; + $chain = mockFollowOneRedirect(array($backlinkingMeUrl, 'http://foo.org')); + list($matches, $secure, $previous) = backlinkingRelMeUrlMatches($backlinkingMeUrl, $meUrl, $chain); + $this->assertFalse($matches); + $this->assertTrue($secure); + } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 56ed5ce..d49e575 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -4,17 +4,28 @@ const TESTING = true; -ob_start(); require __DIR__ . '/../vendor/autoload.php'; -ob_end_clean(); -function mockFollowOneRedirect(array $responses) { - $i = 0; - $responses = array_values($responses); - - return function () use (&$i, $responses) { - $out = array_key_exists($i, $responses) ? $responses[$i] : null; - $i = $i + 1; - return $out; - }; -} \ No newline at end of file +/** + * Mock follow one redirect + * + * @param array $responses Responses + * + * @return \Closure + */ +function mockFollowOneRedirect(array $responses) +{ + $i = 0; + $responses = array_values($responses); + + /** + * Return the next response in the list + * + * @return mixed + */ + return function () use (&$i, $responses) { + $out = array_key_exists($i, $responses) ? $responses[$i] : null; + $i = $i + 1; + return $out; + }; +} diff --git a/tests/html-test-runner.php b/tests/html-test-runner.php index 1cb6b8c..7c58293 100644 --- a/tests/html-test-runner.php +++ b/tests/html-test-runner.php @@ -10,45 +10,49 @@ ob_end_clean(); if (PHP_SAPI === 'cli') { - $html = file_get_contents(__DIR__ . '/rel-me-test.html'); - $parser = new Mf2Parser($html); - $mf = $parser->parse(); - - $testSuites = Mf2\findMicroformatsByType($mf, 'h-x-test-suite'); - - if (count($testSuites) === 0) - die("Found no test suites in rel-me-test.html"); - - $testSuite = $testSuites[0]; - - echo "\n" . Mf2\getProp($testSuite, 'name') . "\n"; - echo "============================\n"; - - foreach ($testSuite['properties']['x-test-case'] as $testCase) { - echo "\n"; - $params = $testCase['properties']['x-parameter']; - $meUrl = array_shift($params); - if (count($params) === 0) - $redirects = mockFollowOneRedirect(array(null)); - else - $redirects = mockFollowOneRedirect($params); - - list($expectedUrl, $expectedSecure) = $testCase['properties']['x-expected-result']; - $expectedSecure = $expectedSecure === 'true'; - - // Begin testing - $meUrl = normaliseUrl($meUrl); - list($url, $secure, $previous) = relMeDocumentUrl($meUrl, $redirects); - // end testing - - if ($url === $expectedUrl and $secure === $expectedSecure): - echo "(pass) " . Mf2\getProp($testCase, 'name') . "\n"; - else: - echo "(fail) " . Mf2\getProp($testCase, 'name') . "\n"; - if ($url != $expectedUrl) - echo "- {$url} should match {$expectedUrl}\n"; - if ($secure != $expectedSecure) - echo "- {$secure} didn’t match {$expectedSecure}\n"; - endif; - } + $html = file_get_contents(__DIR__ . '/rel-me-test.html'); + $parser = new Mf2Parser($html); + $mf = $parser->parse(); + + $testSuites = Mf2\findMicroformatsByType($mf, 'h-x-test-suite'); + + if (count($testSuites) === 0) { + die("Found no test suites in rel-me-test.html"); + } + + $testSuite = $testSuites[0]; + + echo "\n" . Mf2\getProp($testSuite, 'name') . "\n"; + echo "============================\n"; + + foreach ($testSuite['properties']['x-test-case'] as $testCase) { + echo "\n"; + $params = $testCase['properties']['x-parameter']; + $meUrl = array_shift($params); + if (count($params) === 0) { + $redirects = mockFollowOneRedirect(array(null)); + } else { + $redirects = mockFollowOneRedirect($params); + } + + list($expectedUrl, $expectedSecure) = $testCase['properties']['x-expected-result']; + $expectedSecure = $expectedSecure === 'true'; + + // Begin testing + $meUrl = normaliseUrl($meUrl); + list($url, $secure, $previous) = relMeDocumentUrl($meUrl, $redirects); + // end testing + + if ($url === $expectedUrl and $secure === $expectedSecure) : + echo "(pass) " . Mf2\getProp($testCase, 'name') . "\n"; + else: + echo "(fail) " . Mf2\getProp($testCase, 'name') . "\n"; + if ($url != $expectedUrl) { + echo "- {$url} should match {$expectedUrl}\n"; + } + if ($secure != $expectedSecure) { + echo "- {$secure} didn’t match {$expectedSecure}\n"; + } + endif; + } } diff --git a/web/index.php b/web/index.php index f690379..525be6c 100644 --- a/web/index.php +++ b/web/index.php @@ -17,391 +17,509 @@ use Silex; use Symfony\Component\HttpFoundation as Http; -function renderTemplate($template, array $__templateData = array()) { - $render = function ($__path, $render=null) use ($__templateData) { - ob_start(); - extract($__templateData); - unset($__templateData); - include __DIR__ . '/../templates/' . $__path . '.php'; - return ob_get_clean(); - }; - - return $render($template, $render); +/** + * Render a template with data + * + * @param $template + * @param array $__templateData + * + * @return false|string + */ +function renderTemplate($template, array $__templateData = array()) +{ + $render = function ($__path, $render=null) use ($__templateData) { + ob_start(); + extract($__templateData); + unset($__templateData); + include __DIR__ . '/../templates/' . $__path . '.php'; + return ob_get_clean(); + }; + + return $render($template, $render); } -function render($template, array $data = array()) { - $isHtml = pathinfo($template, PATHINFO_EXTENSION) === 'html'; - $out = ''; - - $purifierConfig = HTMLPurifier_Config::createDefault(); - $data['purify'] = array(new HTMLPurifier($purifierConfig), 'purify'); - - if ($isHtml) - $out .= renderTemplate('header.html', $data); - $out .= renderTemplate($template, $data); - if ($isHtml) - $out .= renderTemplate('footer.html', $data); - return $out; +/** + * Render + * + * @param $template + * @param array $data + * + * @return string + */ +function render($template, array $data = array()) +{ + $isHtml = pathinfo($template, PATHINFO_EXTENSION) === 'html'; + $out = ''; + + $purifierConfig = HTMLPurifier_Config::createDefault(); + $data['purify'] = array(new HTMLPurifier($purifierConfig), 'purify'); + + if ($isHtml) { + $out .= renderTemplate('header.html', $data); + } + $out .= renderTemplate($template, $data); + if ($isHtml) { + $out .= renderTemplate('footer.html', $data); + } + return $out; } -function crossOriginResponse($resp, $code=200) { - $response = ($resp instanceof Http\Response) ? $resp : new Http\Response($resp, $code); - $response->headers->set('Access-Control-Allow-Origin', '*'); - return $response; +/** + * Cross Origin Response + * + * @param $resp + * @param $code + * + * @return Http\Response + */ +function crossOriginResponse($resp, $code=200) +{ + $response = ($resp instanceof Http\Response) ? $resp : new Http\Response($resp, $code); + $response->headers->set('Access-Control-Allow-Origin', '*'); + return $response; } -function httpGet($url) { - $client = new Guzzle\Http\Client(null, array( - #'ssl.certificate_authority' => __DIR__ . '/../mozilla-ca-certs.pem' - )); - ob_start(); - $url = web_address_to_uri($url, true); - ob_end_clean(); - - try { - $response = $client->get($url)->send(); - return array($response, null); - } catch (Guzzle\Common\Exception\GuzzleException $e) { - return array(null, $e); - } +/** + * HTTP Get + * + * @param $url + * + * @return array + */ +function httpGet($url) +{ + $client = new Guzzle\Http\Client( + null, array( + // 'ssl.certificate_authority' => __DIR__ . '/../mozilla-ca-certs.pem' + ) + ); + ob_start(); + $url = web_address_to_uri($url, true); + ob_end_clean(); + + try { + $response = $client->get($url)->send(); + return array($response, null); + } catch (Guzzle\Common\Exception\GuzzleException $e) { + return array(null, $e); + } } -function parseMf($resp, $url) { - $parser = new MfParser((string) $resp, $url); - return $parser->parse(); +/** + * Parse MF + * + * @param $resp + * @param $url + * + * @return string + */ +function parseMf($resp, $url) +{ + $parser = new MfParser((string) $resp, $url); + return $parser->parse(); } -function fetchMf($url) { - list($resp, $err) = httpGet($url); - if ($err) - return array(null, $err); - return array(parseMf($resp->getBody(), $url), null); +/** + * Fetch MF + * + * @param $url + * + * @return array + */ +function fetchMf($url) +{ + list($resp, $err) = httpGet($url); + if ($err) { + return array(null, $err); + } + return array(parseMf($resp->getBody(), $url), null); } -function errorResponder($template, $url) { - return function ($message, $code = 400) use ($template, $url) { - return crossOriginResponse(render($template, array( - 'error' => array('message' => $message), - 'url' => htmlspecialchars($url) - )), $code); - }; +function errorResponder($template, $url) +{ + return function ($message, $code = 400) use ($template, $url) { + return crossOriginResponse( + render( + $template, array( + 'error' => array('message' => $message), + 'url' => htmlspecialchars($url) + ) + ), $code + ); + }; } -function isWordpressDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.wordpress.com') !== false; +function isWordpressDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.wordpress.com') !== false; } -function isGithubDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.github.') !== false; +function isGithubDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.github.') !== false; } -function isTumblrDomain($url) { - return stristr(parse_url($url, PHP_URL_HOST), '.tumblr.com') !== false; +function isTumblrDomain($url) +{ + return stristr(parse_url($url, PHP_URL_HOST), '.tumblr.com') !== false; } -function detectBloggingSoftware($response) { - $d = new MfParser($response->getBody(1), $response->getEffectiveUrl()); - foreach ($d->query('//meta[@name="generator"]') as $generatorEl) { - if (stristr($generatorEl->getAttribute('content'), 'wordpress') !== false) - return 'wordpress'; - if (stristr($generatorEl->getAttribute('content'), 'mediawiki') !== false) - return 'mediawiki'; - if (stristr($generatorEl->getAttribute('content'), 'idno') !== false) - return 'idno'; - } - - return null; +function detectBloggingSoftware($response) +{ + $d = new MfParser($response->getBody(1), $response->getEffectiveUrl()); + foreach ($d->query('//meta[@name="generator"]') as $generatorEl) { + if (stristr($generatorEl->getAttribute('content'), 'wordpress') !== false) { + return 'wordpress'; + } + if (stristr($generatorEl->getAttribute('content'), 'mediawiki') !== false) { + return 'mediawiki'; + } + if (stristr($generatorEl->getAttribute('content'), 'idno') !== false) { + return 'idno'; + } + } + + return null; } -function datetimeProblem($datetimeStr) { - try { - $dt = new DateTime($datetimeStr); - } catch (Exception $e) { - return "The datetime is not valid ISO-8601."; - } - return false; +function datetimeProblem($datetimeStr) +{ + try { + $dt = new DateTime($datetimeStr); + } catch (Exception $e) { + return "The datetime is not valid ISO-8601."; + } + return false; } // Web server setup // Route static assets from CLI server if (PHP_SAPI === 'cli-server') { - error_reporting(E_ERROR | E_WARNING | E_PARSE); + error_reporting(E_ERROR | E_WARNING | E_PARSE); - if (file_exists(__DIR__ . $_SERVER['REQUEST_URI']) and !is_dir(__DIR__ . $_SERVER['REQUEST_URI'])) { - return false; - } + if (file_exists(__DIR__ . $_SERVER['REQUEST_URI']) and !is_dir(__DIR__ . $_SERVER['REQUEST_URI'])) { + return false; + } } else { - #error_reporting(0); + // error_reporting(0); } $app = new Silex\Application(); -$app->get('/', function () { - return render('index.html', array('composite_view' => true, 'showResult' => false)); -}); - -$app->get('/validate-rel-me/', function (Http\Request $request) { - if (!$request->query->has('url')) { - return render('validate-rel-me.html'); - } else { - ob_start(); - $url = web_address_to_uri($request->query->get('url'), true); - ob_end_clean(); - - $errorResponse = errorResponder('validate-rel-me.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere'); - - list($relMeUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url); - - if (!$secure) - return $errorResponse("Insecure redirect between {$previous[count($previous)-2]} and {$previous[count($previous)-1]}"); - - list($resp, $err) = httpGet($relMeUrl); - - if ($err) - return $errorResponse(htmlspecialchars($err->getMessage())); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $relMeUrl); - - if (empty($relMeLinks)) - return $errorResponse("No rel=me links could be found!"); - - return crossOriginResponse(render('validate-rel-me.html', array( - 'rels' => $relMeLinks, - 'url' => htmlspecialchars($url), - 'bloggingSoftware' => detectBloggingSoftware($resp) - ))); - } -}); +$app->get( + '/', function () { + return render('index.html', array('composite_view' => true, 'showResult' => false)); + } +); + +$app->get( + '/validate-rel-me/', function (Http\Request $request) { + if (!$request->query->has('url')) { + return render('validate-rel-me.html'); + } else { + ob_start(); + $url = web_address_to_uri($request->query->get('url'), true); + ob_end_clean(); + + $errorResponse = errorResponder('validate-rel-me.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere'); + } + + list($relMeUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url); + + if (!$secure) { + return $errorResponse("Insecure redirect between {$previous[count($previous)-2]} and {$previous[count($previous)-1]}"); + } + + list($resp, $err) = httpGet($relMeUrl); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $relMeUrl); + + if (empty($relMeLinks)) { + return $errorResponse("No rel=me links could be found!"); + } + + return crossOriginResponse( + render( + 'validate-rel-me.html', array( + 'rels' => $relMeLinks, + 'url' => htmlspecialchars($url), + 'bloggingSoftware' => detectBloggingSoftware($resp) + ) + ) + ); + } + } +); // TODO: currently this assumes that url2 has been found as an outbound rel-me link // on url1 — that url1 links to url2 is NOT checked // TODO: maybe encapsulate the one-directional checking into a function -$app->get('/rel-me-links/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - // url1 is me, url2 is external profile page - $url1 = $request->query->get('url1'); - $url2 = $request->query->get('url2'); - - $meUrl = IndieWeb\normaliseUrl($url1); - - list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); - if (!$secure) - return crossOriginResponse("Inbound rel-me URL redirects insecurely" . print_r($previous, true), 400); - - list($resp, $err) = httpGet($profileUrl); - if ($err) - return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); - if ($matches and $secure) - return crossOriginResponse('true', 200); - } - - return crossOriginResponse('false', 200); -}); - -# validate that url2 links back to url1 with rel=me -$app->get('/rel-me-check/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) { - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - } - - $url = IndieWeb\normaliseUrl($request->query->get('url1')); - $is_url_https = ( parse_url($url, PHP_URL_SCHEME) == 'https' ) ? true : false; - - list($inbound_url, $secure, $previous) = IndieWeb\relMeDocumentUrl($request->query->get('url2')); - - list($response, $error) = httpGet($inbound_url); - - $response_array = array( - 'pass' => false, - 'response' => '', - 'status' => $response->getStatusCode(), - 'secure' => null, - ); - - if ($error) { - $response_array['response'] = sprintf('HTTP error when fetching rel-me URL: %s - %s', $inbound_url, $error->getMessage()); - return crossOriginResponse(json_encode($response_array), 200); - } - - $relMeLinks = IndieWeb\relMeLinks($response->getBody(true), $inbound_url); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $url); - if ($matches) { - $response_array['pass'] = true; - $response_array['response'] = ( $is_url_https && !$secure ) ? 'link back is to http:// not https://' : 'works perfectly'; - $response_array['secure'] = $secure; - return crossOriginResponse(json_encode($response_array), 200); - } - } - - $response_array['response'] = 'does not link back'; - return crossOriginResponse(json_encode($response_array), 200); -}); +$app->get( + '/rel-me-links/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + // url1 is me, url2 is external profile page + $url1 = $request->query->get('url1'); + $url2 = $request->query->get('url2'); + + $meUrl = IndieWeb\normaliseUrl($url1); + + list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); + if (!$secure) { + return crossOriginResponse("Inbound rel-me URL redirects insecurely" . print_r($previous, true), 400); + } + + list($resp, $err) = httpGet($profileUrl); + if ($err) { + return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); + if ($matches and $secure) { + return crossOriginResponse('true', 200); + } + } + + return crossOriginResponse('false', 200); + } +); + +// validate that url2 links back to url1 with rel=me +$app->get( + '/rel-me-check/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + + $url = IndieWeb\normaliseUrl($request->query->get('url1')); + $is_url_https = ( parse_url($url, PHP_URL_SCHEME) == 'https' ) ? true : false; + + list($inbound_url, $secure, $previous) = IndieWeb\relMeDocumentUrl($request->query->get('url2')); + + list($response, $error) = httpGet($inbound_url); + + $response_array = array( + 'pass' => false, + 'response' => '', + 'status' => $response->getStatusCode(), + 'secure' => null, + ); + + if ($error) { + $response_array['response'] = sprintf('HTTP error when fetching rel-me URL: %s - %s', $inbound_url, $error->getMessage()); + return crossOriginResponse(json_encode($response_array), 200); + } + + $relMeLinks = IndieWeb\relMeLinks($response->getBody(true), $inbound_url); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $url); + if ($matches) { + $response_array['pass'] = true; + $response_array['response'] = ( $is_url_https && !$secure ) ? 'link back is to http:// not https://' : 'works perfectly'; + $response_array['secure'] = $secure; + return crossOriginResponse(json_encode($response_array), 200); + } + } + + $response_array['response'] = 'does not link back'; + return crossOriginResponse(json_encode($response_array), 200); + } +); // more forgiving version for the badge showing code; ignores secure -$app->get('/rel-me-links-info/', function (Http\Request $request) { - if (!$request->query->has('url1') or !$request->query->has('url2')) - return crossOriginResponse('Provide both url1 and url2 parameters', 400); - // url1 is me, url2 is external profile page - $url1 = $request->query->get('url1'); - $url2 = $request->query->get('url2'); - - $meUrl = IndieWeb\normaliseUrl($url1); - - list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); - - list($resp, $err) = httpGet($profileUrl); - if ($err) - return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); - - $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); - - foreach ($relMeLinks as $inboundRelMeUrl) { - list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); - if ($matches) - return crossOriginResponse('true', 200); - } - - return crossOriginResponse('false', 200); -}); - - -$app->get('/validate-h-card/', function (Http\Request $request) use($app) { - if (!$request->query->has('url')) { - return render('validate-h-card.html', [ - 'showResult' => false, - ]); - } else { - $url = IndieWeb\normaliseUrl($request->query->get('url')); - - # no scheme entered; use http:// and redirect - if (preg_match('#^https?://#', $url) === 0) { - return $app->redirect('/validate-h-card/?url=http://' . $url); - } - - $errorResponse = errorResponder('validate-h-card.html', $url); - - if (empty($url)) { - return $errorResponse('Empty URLs lead nowhere'); - } - - list($mfs, $err) = fetchMf($url); - - if ($err) { - return $errorResponse(htmlspecialchars($err->getMessage())); - } - - $allHCards = Mf2\findMicroformatsByType($mfs, 'h-card'); - $representativeHCard = Mf2\getRepresentativeHCard($mfs, $url); - - return crossOriginResponse( - render( - 'validate-h-card.html', - [ - 'showResult' => true, - 'allHCards' => $allHCards, - 'representativeHCard' => $representativeHCard, - 'url' => htmlspecialchars($url) - ] - ) - ); - } -}); - -$app->get('/validate-h-entry/', function (Http\Request $request) { - if (!$request->query->has('url')) { - return render('validate-h-entry.html'); - } else { - ob_start(); - $url = web_address_to_uri($request->query->get('url'), true); - ob_end_clean(); - $errorResponse = errorResponder('validate-h-entry.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere!'); - - list($mfs, $err) = fetchMf($url); - - if ($err) - return $errorResponse(htmlspecialchars($err->getMessage())); - - $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); - - if (count($hEntries) > 0) { - $hEntry = $hEntries[0]; - - if (Mf2\hasProp($hEntry, 'in-reply-to')) { - $postType = 'reply'; - } elseif (Mf2\hasProp($hEntry, 'like-of')) { - $postType = 'like'; - } elseif (Mf2\hasProp($hEntry, 'repost-of')) { - $postType = 'repost'; - } else { - $postType = 'post'; - } - - // Determine the state of the post name. - $content = Mf2\hasProp($hEntry, 'content') ? Mf2\getProp($hEntry, 'content') : (isset($hEntry['value']) ? $hEntry['value'] : null); - $parsedName = Mf2\getProp($hEntry, 'name'); - $nameState = null; - if ($content != null and $content != $parsedName) { - $nameState = mb_strlen($parsedName) > mb_strlen($content) ? 'invalid' : 'valid'; - } - } else { - $postType = $hEntry = $nameState = null; - } - - return crossOriginResponse(render('validate-h-entry.html', array( - 'showResult' => true, - 'postType' => $postType, - 'hEntry' => $hEntry, - 'nameState' => $nameState, - 'url' => htmlspecialchars($url) - ))); - } -}); - -$app->get('/send-webmentions/', function (Http\Request $request) { - return render('send-webmentions.html', array( - 'url' => $request->query->get('url', '') - )); -}); - -$app->post('/send-webmentions/', function (Http\Request $request) { - ob_start(); - $url = web_address_to_uri($request->get('url'), true); - ob_end_clean(); - $errorResponse = errorResponder('send-webmentions.html', $url); - - if (empty($url)) - return $errorResponse('Empty URLs lead nowhere!'); - - list($mfs, $err) = fetchMf($url); - if ($err) { - return $errorResponse(htmlspecialchars($err->getMessage())); - } - - $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); - - $mentioner = new MentionClient(); - $numSent = $mentioner->sendMentions($url); - - return crossOriginResponse(render('send-webmentions.html', array( - 'numSent' => $numSent, - 'url' => htmlspecialchars($url), - 'hEntriesFound' => count($hEntries) - ))); -}); +$app->get( + '/rel-me-links-info/', function (Http\Request $request) { + if (!$request->query->has('url1') or !$request->query->has('url2')) { + return crossOriginResponse('Provide both url1 and url2 parameters', 400); + } + // url1 is me, url2 is external profile page + $url1 = $request->query->get('url1'); + $url2 = $request->query->get('url2'); + + $meUrl = IndieWeb\normaliseUrl($url1); + + list($profileUrl, $secure, $previous) = IndieWeb\relMeDocumentUrl($url2); + + list($resp, $err) = httpGet($profileUrl); + if ($err) { + return crossOriginResponse("HTTP error when fetching inbound rel me document URL {$profileUrl}: {$err->getMessage()}", 400); + } + + $relMeLinks = IndieWeb\relMeLinks($resp->getBody(true), $profileUrl); + + foreach ($relMeLinks as $inboundRelMeUrl) { + list($matches, $secure, $previous) = IndieWeb\backlinkingRelMeUrlMatches($inboundRelMeUrl, $meUrl); + if ($matches) { + return crossOriginResponse('true', 200); + } + } + + return crossOriginResponse('false', 200); + } +); + + +$app->get( + '/validate-h-card/', function (Http\Request $request) use ($app) { + if (!$request->query->has('url')) { + return render( + 'validate-h-card.html', [ + 'showResult' => false, + ] + ); + } else { + $url = IndieWeb\normaliseUrl($request->query->get('url')); + + // no scheme entered; use http:// and redirect + if (preg_match('#^https?://#', $url) === 0) { + return $app->redirect('/validate-h-card/?url=http://' . $url); + } + + $errorResponse = errorResponder('validate-h-card.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere'); + } + + list($mfs, $err) = fetchMf($url); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $allHCards = Mf2\findMicroformatsByType($mfs, 'h-card'); + $representativeHCard = Mf2\getRepresentativeHCard($mfs, $url); + + return crossOriginResponse( + render( + 'validate-h-card.html', + [ + 'showResult' => true, + 'allHCards' => $allHCards, + 'representativeHCard' => $representativeHCard, + 'url' => htmlspecialchars($url) + ] + ) + ); + } + } +); + +$app->get( + '/validate-h-entry/', function (Http\Request $request) { + if (!$request->query->has('url')) { + return render('validate-h-entry.html'); + } else { + ob_start(); + $url = web_address_to_uri($request->query->get('url'), true); + ob_end_clean(); + $errorResponse = errorResponder('validate-h-entry.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere!'); + } + + list($mfs, $err) = fetchMf($url); + + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); + + if (count($hEntries) > 0) { + $hEntry = $hEntries[0]; + + if (Mf2\hasProp($hEntry, 'in-reply-to')) { + $postType = 'reply'; + } elseif (Mf2\hasProp($hEntry, 'like-of')) { + $postType = 'like'; + } elseif (Mf2\hasProp($hEntry, 'repost-of')) { + $postType = 'repost'; + } else { + $postType = 'post'; + } + + // Determine the state of the post name. + $content = Mf2\hasProp($hEntry, 'content') ? Mf2\getProp($hEntry, 'content') : (isset($hEntry['value']) ? $hEntry['value'] : null); + $parsedName = Mf2\getProp($hEntry, 'name'); + $nameState = null; + if ($content != null and $content != $parsedName) { + $nameState = mb_strlen($parsedName) > mb_strlen($content) ? 'invalid' : 'valid'; + } + } else { + $postType = $hEntry = $nameState = null; + } + + return crossOriginResponse( + render( + 'validate-h-entry.html', array( + 'showResult' => true, + 'postType' => $postType, + 'hEntry' => $hEntry, + 'nameState' => $nameState, + 'url' => htmlspecialchars($url) + ) + ) + ); + } + } +); + +$app->get( + '/send-webmentions/', function (Http\Request $request) { + return render( + 'send-webmentions.html', array( + 'url' => $request->query->get('url', '') + ) + ); + } +); + +$app->post( + '/send-webmentions/', function (Http\Request $request) { + ob_start(); + $url = web_address_to_uri($request->get('url'), true); + ob_end_clean(); + $errorResponse = errorResponder('send-webmentions.html', $url); + + if (empty($url)) { + return $errorResponse('Empty URLs lead nowhere!'); + } + + list($mfs, $err) = fetchMf($url); + if ($err) { + return $errorResponse(htmlspecialchars($err->getMessage())); + } + + $hEntries = Mf2\findMicroformatsByType($mfs, 'h-entry'); + + $mentioner = new MentionClient(); + $numSent = $mentioner->sendMentions($url); + + return crossOriginResponse( + render( + 'send-webmentions.html', array( + 'numSent' => $numSent, + 'url' => htmlspecialchars($url), + 'hEntriesFound' => count($hEntries) + ) + ) + ); + } +); $app->run();