From 397e03f821e280ffdbdbc2904fdcc21193c10e20 Mon Sep 17 00:00:00 2001 From: Phan An <me@phanan.net> Date: Fri, 17 May 2024 19:41:24 +0800 Subject: [PATCH] feat: v1 features --- .editorconfig | 8 + .github/FUNDING.yml | 1 + .github/workflows/unit.yml | 35 + .gitignore | 4 + README.md | 179 + assets/banner.webp | Bin 0 -> 96960 bytes composer.json | 59 + composer.lock | 9341 +++++++++++++++++ phpstan.neon | 9 + phpunit.xml | 14 + pint.json | 3 + src/Enums/EpisodeType.php | 10 + src/Enums/PodcastType.php | 9 + .../InvalidCategoryElementException.php | 16 + .../InvalidClosureElementException.php | 16 + .../InvalidDateTimeFormatException.php | 13 + src/Exceptions/InvalidDurationException.php | 15 + src/Exceptions/InvalidElementException.php | 26 + .../InvalidEpisodeElementException.php | 16 + .../InvalidFundingElementException.php | 16 + .../InvalidGuidElementException.php | 16 + .../InvalidTranscriptElementException.php | 16 + src/Exceptions/InvalidTxtElementException.php | 16 + src/Poddle.php | 157 + src/Values/Category.php | 66 + src/Values/CategoryCollection.php | 42 + src/Values/Channel.php | 51 + src/Values/ChannelMetadata.php | 50 + src/Values/Enclosure.php | 50 + src/Values/Episode.php | 47 + src/Values/EpisodeCollection.php | 18 + src/Values/EpisodeGuid.php | 49 + src/Values/EpisodeMetadata.php | 129 + src/Values/Funding.php | 44 + src/Values/FundingCollection.php | 42 + src/Values/Serializable.php | 16 + src/Values/Transcript.php | 54 + src/Values/TranscriptCollection.php | 46 + src/Values/Txt.php | 46 + src/Values/TxtCollection.php | 42 + tests/PoddleTest.php | 122 + tests/TestCase.php | 9 + tests/Values/CategoryCollectionTest.php | 23 + tests/Values/CategoryTest.php | 70 + tests/Values/EnclosureTest.php | 35 + tests/Values/EpisodeGuidTest.php | 33 + tests/Values/FundingCollectionTest.php | 23 + tests/Values/FundingTest.php | 33 + tests/Values/TxtCollectionTest.php | 23 + tests/Values/TxtTest.php | 27 + tests/fixtures/sample.xml | 188 + 51 files changed, 11373 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/unit.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/banner.webp create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 phpstan.neon create mode 100644 phpunit.xml create mode 100644 pint.json create mode 100644 src/Enums/EpisodeType.php create mode 100644 src/Enums/PodcastType.php create mode 100644 src/Exceptions/InvalidCategoryElementException.php create mode 100644 src/Exceptions/InvalidClosureElementException.php create mode 100644 src/Exceptions/InvalidDateTimeFormatException.php create mode 100644 src/Exceptions/InvalidDurationException.php create mode 100644 src/Exceptions/InvalidElementException.php create mode 100644 src/Exceptions/InvalidEpisodeElementException.php create mode 100644 src/Exceptions/InvalidFundingElementException.php create mode 100644 src/Exceptions/InvalidGuidElementException.php create mode 100644 src/Exceptions/InvalidTranscriptElementException.php create mode 100644 src/Exceptions/InvalidTxtElementException.php create mode 100644 src/Poddle.php create mode 100644 src/Values/Category.php create mode 100644 src/Values/CategoryCollection.php create mode 100644 src/Values/Channel.php create mode 100644 src/Values/ChannelMetadata.php create mode 100644 src/Values/Enclosure.php create mode 100644 src/Values/Episode.php create mode 100644 src/Values/EpisodeCollection.php create mode 100644 src/Values/EpisodeGuid.php create mode 100644 src/Values/EpisodeMetadata.php create mode 100644 src/Values/Funding.php create mode 100644 src/Values/FundingCollection.php create mode 100644 src/Values/Serializable.php create mode 100644 src/Values/Transcript.php create mode 100644 src/Values/TranscriptCollection.php create mode 100644 src/Values/Txt.php create mode 100644 src/Values/TxtCollection.php create mode 100644 tests/PoddleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Values/CategoryCollectionTest.php create mode 100644 tests/Values/CategoryTest.php create mode 100644 tests/Values/EnclosureTest.php create mode 100644 tests/Values/EpisodeGuidTest.php create mode 100644 tests/Values/FundingCollectionTest.php create mode 100644 tests/Values/FundingTest.php create mode 100644 tests/Values/TxtCollectionTest.php create mode 100644 tests/Values/TxtTest.php create mode 100644 tests/fixtures/sample.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6906a51 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +[*] +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[{*.php,*.xml,*.xml.dist,*.rss}] +indent_size = 4 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0b20fe2 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [phanan] diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml new file mode 100644 index 0000000..5a679d6 --- /dev/null +++ b/.github/workflows/unit.yml @@ -0,0 +1,35 @@ +name: Unit Tests +on: + pull_request: + branches: + - main + push: + branches: + - main + workflow_dispatch: + branches: + - main +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + php-version: [ 8.1, 8.2 ] + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + tools: composer:v2 + - name: Install PHP dependencies + uses: ramsey/composer-install@v3 + with: + composer-options: --prefer-dist + - name: Run code style checker + run: composer cs + - name: Run static analysis + run: composer analyze -- --no-progress + - name: Run tests + run: composer test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92dc3f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.phpunit.cache/ +.idea/ +.phpunit.result.cache +vendor/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..5428929 --- /dev/null +++ b/README.md @@ -0,0 +1,179 @@ +# Poddle – PHP Podcast Feed Parser + + + +Effortlessly parse podcast feeds in PHP following [PSP-1 Podcast RSS Standard](https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification). + +## Requirements & Installation + +Poddle requires PHP 8.1 or higher. You can install the library via Composer by running the following command: + +```bash +composer require phanan/poddle +``` + +## Usage + +To parse a podcast feed, call the `fromUrl` method with the feed URL: + +```php +$poddle = \PhanAn\Poddle::fromUrl('https://example.com/feed.xml'); +``` + +If you have the feed content as an XML string, you can use the `fromXml` method instead: + +```php +$poddle = \PhanAn\Poddle::fromXml($xml); +``` + +Both methods return a `Poddle` object, which you can use to access the feed's channel and episodes. + +### Channel + +To access the podcast channel, call `getChannel` on the `Poddle` object: + +```php +/** @var \PhanAn\Poddle\Values\Channel $channel */ +$channel = $poddle->getChannel(); +``` + +All channel's [required elements](https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#required-channel-elements) per the PSP-1 standard are available as properties on the `Channel` object: + +```php +$channel->title; // string +$channel->link; // string +$channel->description; // string +$channel->language; // string +$channel->image; // string +$channel->categories; // \PhanAn\Poddle\Values\CategoryCollection<\PhanAn\Poddle\Values\Category> +$channel->explicit; // bool +``` + +All channel’s [recommended elements](https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#recommended-channel-elements) are available via the `metadata` property: + +```php +$channel->metadata; // \PhanAn\Poddle\Values\ChannelMetadata +$channel->metadata->locked; // bool +$channel->metadata->guid; // ?string +$channel->metadata->author; // ?string +$channel->metadata->copyright; // ?string +$channel->metadata->txts; // \PhanAn\Poddle\Values\TxtCollection<\PhanAn\Poddle\Values\Txt> +$channel->metadata->fundings; // \PhanAn\Poddle\Values\FundingCollection<\PhanAn\Poddle\Values\Funding> +$channel->metadata->type; // ?\PhanAn\Poddle\Values\PodcastType +$channel->metadata->complete; // bool +``` + +To return the channel as an array, call the `toArray` method: + +```php +$array = $channel->toArray(); +``` + +### Episodes + +To access the podcast episodes, call `getEpisodes` on the `Poddle` object: + +```php +$episodes = $poddle->getEpisodes(); +``` + +This method returns a [lazy collection](https://laravel.com/docs/11.x/collections) of `\PhanAn\Poddle\Values\Episode` objects. You can iterate over the collection to access each episode: + +```php +$episodes->each(function (\PhanAn\Poddle\Values\Episode $episode) { + // Access episode properties +}); +``` + +All episode's [required elements](https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#required-item-elements) per the PSP-1 standard are available as properties on the `Episode` object: + +```php +$episode->title; // string +$episode->enclosure; // \PhanAn\Poddle\Values\Enclosure +$episode->guid; // \PhanAn\Poddle\Values\EpisodeGuid +``` + +All episode's [recommended elements](https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#recommended-item-elements) are available via the `metadata` property: + +```php +$episode->metadata; // \PhanAn\Poddle\Values\EpisodeMetadata +$episode->metadata->link; // ?string +$episode->metadata->pubDate; // ?\DateTime +$episode->metadata->description; // ?string +$episode->metadata->duration; // ?int +$episode->metadata->image; // ?string +$episode->metadata->explicit; // ?bool +$episode->metadata->transcripts; // \PhanAn\Poddle\Values\TranscriptCollection<\PhanAn\Poddle\Values\Transcript> +$episode->metadata->episode; // ?int +$episode->metadata->season; // ?int +$episode->metadata->type; // ?\PhanAn\Poddle\Values\EpisodeType +$episode->metadata->block; // ?bool +``` + +To return the episode as an array, call the `toArray` method: + +```php +$array = $episode->toArray(); +``` + +### Other elements and values + +If you need to access other elements or values not covered by the PSP-1 standard, you can make use of the `$xmlReader` property on the `Poddle` object: + +```php +$xmlReader = $poddle->xmlReader; +``` + +This property is an instance of `Saloon\XmlWrangler\XmlReader` and allows you to navigate the XML document directly. For example, to access the feed's `lastBuildDate` value: + +```php +$poddle = \PhanAn\Poddle::fromUrl('https://example.com/feed.xml'); +$poddle->xmlReader->value('rss.channel.lastBuildDate')?->sole(); // 'Thu, 02 May 2024 06:44:38 +0000' +``` + +For more information on how to use `XmlReader`, refer to [Saloon\XmlWrangler documentation](https://github.com/saloonphp/xml-wrangler). + +The original feed content is available via the `xml` property on the `Poddle` object: + +```php +$xml = $poddle->xml; // string +``` + +## Serialization and Deserialization + +All classes under the `PhanAn\Poddle\Values` namespace implement `\Illuminate\Contracts\Support\Arrayable` +and `\Illuminate\Contracts\Support\Jsonable`, allowing you to easily serialize and deserialize the objects, +making it straightforward to store and retrieve the data in a database or JSON file. +For instance, you can create an Eloquent [custom cast](https://laravel.com/docs/11.x/eloquent-mutators#custom-casts) in Laravel this way: + +```php +use Illuminate\Contracts\Database\Eloquent\CastsAttributes; +use PhanAn\Poddle\Values\Channel; + +class ChannelCast implements CastsAttributes +{ + public function get($model, string $key, $value, array $attributes): Channel + { + return Channel::fromArray(json_decode($value, true)); + } + + /** @param Channel $value */ + public function set($model, string $key, $value, array $attributes) + { + return $value->toJson(); + } +} +``` + +Then, you can use the cast in your Eloquent model: + +```php +use Illuminate\Database\Eloquent\Model; + +class Podcast extends Model +{ + protected $casts = [ + 'channel' => ChannelCast::class, + ]; +} +``` diff --git a/assets/banner.webp b/assets/banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..820fb0dcdfba5db5577dd65be152a40e79968c1c GIT binary patch literal 96960 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⁢ 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 P_#O6vhJ&t?rT_o{ZCj^V literal 0 HcmV?d00001 diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..2b3a94f --- /dev/null +++ b/composer.json @@ -0,0 +1,59 @@ +{ + "name": "phanan/poddle", + "description": "Parse podcast feeds with PHP following PSP-1 Podcast RSS Standard", + "authors": [ + { + "name": "Phan An", + "email": "me@phanan.net" + } + ], + "keywords": [ + "podcast", + "xml", + "rss", + "feed", + "parser", + "psp-1" + ], + "license": "MIT", + "type": "library", + "require": { + "php": ">=8.1", + "saloonphp/xml-wrangler": "^1.2", + "illuminate/collections": "^10.48", + "illuminate/http": "^10.48", + "illuminate/support": "^10.48", + "guzzlehttp/guzzle": "^7.8" + }, + "require-dev": { + "phpunit/phpunit": ">=10.5", + "laravel/pint": "^1.15", + "larastan/larastan": "^2.9", + "orchestra/testbench": "*", + "laravel/tinker": "^2.9" + }, + "scripts": { + "test": "phpunit tests", + "cs": "pint --test", + "cs:fix": "pint", + "analyze": "phpstan analyse" + }, + "post-install-cmd": [ + "composer dump-autoload" + ], + "autoload": { + "psr-4": { + "PhanAn\\Poddle\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "config": { + "preferred-install": "dist", + "optimize-autoloader": true + }, + "minimum-stability": "stable" +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..c02b21b --- /dev/null +++ b/composer.lock @@ -0,0 +1,9341 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "760a5029772edb21a4251ecdd6a76717", + "packages": [ + { + "name": "azjezz/psl", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/azjezz/psl.git", + "reference": "1ade4f1a99fe07a8e06f8dee596609aa07585422" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/azjezz/psl/zipball/1ade4f1a99fe07a8e06f8dee596609aa07585422", + "reference": "1ade4f1a99fe07a8e06f8dee596609aa07585422", + "shasum": "" + }, + "require": { + "ext-bcmath": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-sodium": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "revolt/event-loop": "^1.0.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.22.0", + "php-coveralls/php-coveralls": "^2.6.0", + "php-standard-library/psalm-plugin": "^2.2.1", + "phpbench/phpbench": "^1.2.14", + "phpunit/phpunit": "^9.6.10", + "roave/infection-static-analysis-plugin": "^1.32.0", + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.13.1" + }, + "suggest": { + "php-standard-library/psalm-plugin": "Psalm integration" + }, + "type": "library", + "extra": { + "thanks": { + "name": "hhvm/hsl", + "url": "https://github.com/hhvm/hsl" + } + }, + "autoload": { + "files": [ + "src/bootstrap.php" + ], + "psr-4": { + "Psl\\": "src/Psl" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "azjezz", + "email": "azjezz@protonmail.com" + } + ], + "description": "PHP Standard Library", + "support": { + "issues": "https://github.com/azjezz/psl/issues", + "source": "https://github.com/azjezz/psl/tree/2.9.1" + }, + "funding": [ + { + "url": "https://github.com/azjezz", + "type": "github" + } + ], + "time": "2024-04-05T05:18:37+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "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%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "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%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "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": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "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": "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", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "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": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "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.2" + }, + "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": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "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", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "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.6.2" + }, + "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": "2023-12-03T20:05:35+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "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" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.48.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/91e2b9e218afa4e5c377510faa11957042831ba3", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-04-30T12:52:59+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.21" + }, + "time": "2024-04-30T12:46:16+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-11-08T14:08:06+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.3", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-02-02T11:59:32+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.27.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-04-07T19:17:50+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.25.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-03-15T19:58:44+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-04-12T21:02:21+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.72.3", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-01-25T10:35:09+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "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": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "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": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "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": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "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/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "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": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "revolt/event-loop", + "version": "v1.0.6", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/25de49af7223ba039f64da4ae9a28ec2d10d0254", + "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Revolt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], + "support": { + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.6" + }, + "time": "2023-11-30T05:34:44+00:00" + }, + { + "name": "saloonphp/xml-wrangler", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/saloonphp/xml-wrangler.git", + "reference": "87d0c57687ca0abc2c1195cc76c866b18d634561" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/saloonphp/xml-wrangler/zipball/87d0c57687ca0abc2c1195cc76c866b18d634561", + "reference": "87d0c57687ca0abc2c1195cc76c866b18d634561", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.1", + "spatie/array-to-xml": "^3.2", + "veewee/xml": "^2.11.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.5", + "guzzlehttp/guzzle": "^7.8", + "illuminate/collections": "^10.30", + "pestphp/pest": "^2.24", + "phpstan/phpstan": "^1.9", + "psr/http-message": "^2.0", + "saloonphp/saloon": "^3.0", + "spatie/ray": "^1.33" + }, + "suggest": { + "illuminate/collections": "Used for the collect and lazyCollect methods when reading XML." + }, + "type": "library", + "autoload": { + "psr-4": { + "Saloon\\XmlWrangler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sam Carré", + "email": "29132017+Sammyjo20@users.noreply.github.com", + "role": "Developer" + } + ], + "description": "Easily Read & Write XML in PHP", + "homepage": "https://github.com/saloonphp/xml-wrangler", + "support": { + "issues": "https://github.com/saloonphp/xml-wrangler/issues", + "source": "https://github.com/saloonphp/xml-wrangler/tree/v1.2.1" + }, + "funding": [ + { + "url": "https://github.com/sammyjo20", + "type": "github" + }, + { + "url": "https://ko-fi.com/sammyjo20", + "type": "ko_fi" + } + ], + "time": "2023-12-05T13:09:03+00:00" + }, + { + "name": "spatie/array-to-xml", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f56b220fe2db1ade4c88098d83413ebdfc3bf876", + "reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\ArrayToXml\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" + } + ], + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", + "keywords": [ + "array", + "convert", + "xml" + ], + "support": { + "source": "https://github.com/spatie/array-to-xml/tree/3.3.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-01T10:20:27+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "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": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "reference": "1c5d5c2103c3762aff27a27e1e2409e30a79083b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d84384f3f67de3cb650db64d685d70395dacfc3f", + "reference": "d84384f3f67de3cb650db64d685d70395dacfc3f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "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/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.7" + }, + "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-04-23T10:36:43+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.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/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "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/v6.4.7" + }, + "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-04-29T11:24:44+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "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": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" + }, + "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/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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\\Grapheme\\": "" + } + }, + "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 grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "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 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "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/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ffeb9591c61f65a68d47f77d12b83fa530227a69", + "reference": "ffeb9591c61f65a68d47f77d12b83fa530227a69", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "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 an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "7495687c58bfd88b7883823747b0656d90679123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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 tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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 translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.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-04-18T09:32:20+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "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/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "veewee/xml", + "version": "2.14.0", + "source": { + "type": "git", + "url": "https://github.com/veewee/xml.git", + "reference": "143c5655c3af11b187157af16340ee69a244e633" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/veewee/xml/zipball/143c5655c3af11b187157af16340ee69a244e633", + "reference": "143c5655c3af11b187157af16340ee69a244e633", + "shasum": "" + }, + "require": { + "azjezz/psl": "^2.0.3", + "ext-dom": "*", + "ext-libxml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-xsl": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "webmozart/assert": "^1.10" + }, + "require-dev": { + "php-standard-library/psalm-plugin": "^2.2", + "symfony/finder": "^6.1", + "veewee/composer-run-parallel": "^1.0.0", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/bootstrap.php" + ], + "psr-4": { + "VeeWee\\Xml\\": "src/Xml" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Toon Verwerft", + "email": "toonverwerft@gmail.com" + } + ], + "description": "XML without worries", + "keywords": [ + "Xpath", + "array-to-xml", + "dom", + "dom-manipulation", + "reader", + "writer", + "xml", + "xml-to-array", + "xml_decode", + "xml_encode", + "xsd", + "xslt" + ], + "support": { + "issues": "https://github.com/veewee/xml/issues", + "source": "https://github.com/veewee/xml/tree/2.14.0" + }, + "funding": [ + { + "url": "https://github.com/veewee", + "type": "github" + } + ], + "time": "2024-01-14T12:13:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "larastan/larastan", + "version": "v2.9.6", + "source": { + "type": "git", + "url": "https://github.com/larastan/larastan.git", + "reference": "93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/larastan/larastan/zipball/93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f", + "reference": "93d5b95d2e29cdb8203363d44abfdbc0bc7ef57f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.0", + "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.0", + "php": "^8.0.2", + "phpmyadmin/sql-parser": "^5.9.0", + "phpstan/phpstan": "^1.10.66" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0", + "nikic/php-parser": "^4.19.1", + "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", + "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", + "phpunit/phpunit": "^9.6.13 || ^10.5.16" + }, + "suggest": { + "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Larastan\\Larastan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Can Vural", + "email": "can9119@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/larastan/larastan/issues", + "source": "https://github.com/larastan/larastan/tree/v2.9.6" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/canvural", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-05-09T11:53:26+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.15.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/3600b5d17aff52f6100ea4921849deacbbeb8656", + "reference": "3600b5d17aff52f6100ea4921849deacbbeb8656", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.54.0", + "illuminate/view": "^10.48.8", + "larastan/larastan": "^2.9.5", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.11", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.34.7" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-04-30T15:02:26+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.9.0" + }, + "time": "2024-01-04T16:10:04+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "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", + "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.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^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.0.2" + }, + "time": "2024-03-05T20:51:40+00:00" + }, + { + "name": "orchestra/canvas", + "version": "v8.11.8", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas.git", + "reference": "31b1f338fb9d2f3c97ccbc62b27d3e5bf86a02e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas/zipball/31b1f338fb9d2f3c97ccbc62b27d3e5bf86a02e5", + "reference": "31b1f338fb9d2f3c97ccbc62b27d3e5bf86a02e5", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^10.48.4", + "illuminate/database": "^10.48.4", + "illuminate/filesystem": "^10.48.4", + "illuminate/support": "^10.48.4", + "orchestra/canvas-core": "^8.10.2", + "orchestra/testbench-core": "^8.19", + "php": "^8.1", + "symfony/polyfill-php83": "^1.28", + "symfony/yaml": "^6.2" + }, + "require-dev": { + "laravel/framework": "^10.48.4", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5.1", + "phpstan/phpstan": "^1.10.56", + "phpunit/phpunit": "^10.5", + "spatie/laravel-ray": "^1.33" + }, + "bin": [ + "canvas" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.0-dev" + }, + "laravel": { + "providers": [ + "Orchestra\\Canvas\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas/tree/v8.11.8" + }, + "time": "2024-03-21T14:41:18+00:00" + }, + { + "name": "orchestra/canvas-core", + "version": "v8.10.2", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas-core.git", + "reference": "3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc", + "reference": "3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^10.38.1", + "illuminate/filesystem": "^10.38.1", + "php": "^8.1", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "orchestra/canvas": "<8.11.0", + "orchestra/testbench-core": "<8.2.0" + }, + "require-dev": { + "laravel/framework": "^10.38.1", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.19", + "phpstan/phpstan": "^1.10.6", + "phpunit/phpunit": "^10.1", + "symfony/yaml": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.0-dev" + }, + "laravel": { + "providers": [ + "Orchestra\\Canvas\\Core\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\Core\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators Builder for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas-core/tree/v8.10.2" + }, + "time": "2023-12-28T01:27:59+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v8.22.3", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "bb2efe836350a86210310e678995aa47e4929be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/bb2efe836350a86210310e678995aa47e4929be4", + "reference": "bb2efe836350a86210310e678995aa47e4929be4", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.21", + "laravel/framework": "^10.40", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.23.9", + "orchestra/workbench": "^1.4 || ^8.4", + "php": "^8.1", + "phpunit/phpunit": "^9.6 || ^10.1", + "symfony/process": "^6.2", + "symfony/yaml": "^6.2", + "vlucas/phpdotenv": "^5.4.1" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v8.22.3" + }, + "time": "2024-04-16T09:42:06+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v8.23.10", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "0b4bf76d9ab2b5d6f3a7d9a956e5affbd04bbe4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/0b4bf76d9ab2b5d6f3a7d9a956e5affbd04bbe4d", + "reference": "0b4bf76d9ab2b5d6f3a7d9a956e5affbd04bbe4d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.1", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "brianium/paratest": "<6.4.0 || >=7.0.0 <7.1.4 || >=8.0.0", + "laravel/framework": "<10.48.2 || >=11.0.0", + "nunomaduro/collision": "<6.4.0 || >=7.0.0 <7.4.0 || >=8.0.0", + "orchestra/testbench-dusk": "<8.21.0 || >=9.0.0", + "orchestra/workbench": "<1.0.0", + "phpunit/phpunit": "<9.6.0 || >=10.6.0" + }, + "require-dev": { + "fakerphp/faker": "^1.21", + "laravel/framework": "^10.48.2", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5.1", + "phpstan/phpstan": "^1.10.7", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ray": "^1.32.4", + "symfony/process": "^6.2", + "symfony/yaml": "^6.2", + "vlucas/phpdotenv": "^5.4.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel testing (^6.4 || ^7.1.4).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.21).", + "laravel/framework": "Required for testing (^10.48.2).", + "mockery/mockery": "Allow using Mockery for testing (^1.5.1).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^6.4 || ^7.4).", + "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^8.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^9.6 || ^10.1).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^6.2).", + "symfony/yaml": "Required for Testbench CLI (^6.2).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2024-04-21T08:00:04+00:00" + }, + { + "name": "orchestra/workbench", + "version": "v8.4.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "7db7009377fd1afe25c783e9092af911cd04b3a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/7db7009377fd1afe25c783e9092af911cd04b3a9", + "reference": "7db7009377fd1afe25c783e9092af911cd04b3a9", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.21", + "laravel/framework": "^10.38.1", + "laravel/tinker": "^2.8.2", + "orchestra/canvas": "^8.11.4", + "orchestra/testbench-core": "^8.22", + "php": "^8.1", + "spatie/laravel-ray": "^1.32.4", + "symfony/polyfill-php83": "^1.28", + "symfony/yaml": "^6.2" + }, + "require-dev": { + "laravel/pint": "^1.4", + "mockery/mockery": "^1.5.1", + "phpstan/phpstan": "^1.10.7", + "phpunit/phpunit": "^10.1", + "symfony/process": "^6.2" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Workbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Workbench Companion for Laravel Packages Development", + "keywords": [ + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/workbench/issues", + "source": "https://github.com/orchestral/workbench/tree/v8.4.0" + }, + "time": "2024-03-13T06:02:29+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": "phpmyadmin/sql-parser", + "version": "5.9.0", + "source": { + "type": "git", + "url": "https://github.com/phpmyadmin/sql-parser.git", + "reference": "011fa18a4e55591fac6545a821921dd1d61c6984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/011fa18a4e55591fac6545a821921dd1d61c6984", + "reference": "011fa18a4e55591fac6545a821921dd1d61c6984", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpmyadmin/motranslator": "<3.0" + }, + "require-dev": { + "phpbench/phpbench": "^1.1", + "phpmyadmin/coding-standard": "^3.0", + "phpmyadmin/motranslator": "^4.0 || ^5.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.9.12", + "phpstan/phpstan-phpunit": "^1.3.3", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.11", + "zumba/json-serializer": "~3.0.2" + }, + "suggest": { + "ext-mbstring": "For best performance", + "phpmyadmin/motranslator": "Translate messages to your favorite locale" + }, + "bin": [ + "bin/highlight-query", + "bin/lint-query", + "bin/sql-parser", + "bin/tokenize-query" + ], + "type": "library", + "autoload": { + "psr-4": { + "PhpMyAdmin\\SqlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" + } + ], + "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", + "homepage": "https://github.com/phpmyadmin/sql-parser", + "keywords": [ + "analysis", + "lexer", + "parser", + "query linter", + "sql", + "sql lexer", + "sql linter", + "sql parser", + "sql syntax highlighter", + "sql tokenizer" + ], + "support": { + "issues": "https://github.com/phpmyadmin/sql-parser/issues", + "source": "https://github.com/phpmyadmin/sql-parser" + }, + "funding": [ + { + "url": "https://www.phpmyadmin.net/donate/", + "type": "other" + } + ], + "time": "2024-01-20T20:34:02+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-05-15T08:00:59+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "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": "10.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": "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/10.1.14" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:33:41+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "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/10.5.20" + }, + "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": "2024-04-24T06:32:35+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "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": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.3", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + }, + "time": "2024-04-02T15:57:53+00:00" + }, + { + "name": "rector/rector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "73eb63e4f9011dba6b7c66c3262543014e352f34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/73eb63e4f9011dba6b7c66c3262543014e352f34", + "reference": "73eb63e4f9011dba6b7c66c3262543014e352f34", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.57" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-05-10T05:31:15+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "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": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-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 for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "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": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.6.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-04-24T13:22:11+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.36.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "1852faa96e5aa6778ea3401ec3176eee77268718" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/1852faa96e5aa6778ea3401ec3176eee77268718", + "reference": "1852faa96e5aa6778ea3401ec3176eee77268718", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0|^11.0", + "php": "^7.4|^8.0", + "rector/rector": "^0.19.2|^1.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.41.1", + "symfony/stopwatch": "4.2|^5.1|^6.0|^7.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0|^10.0|^11.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.22|^2.0", + "phpstan/phpstan": "^1.10.57", + "phpunit/phpunit": "^9.3|^10.1", + "spatie/pest-plugin-snapshots": "^1.1|^2.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.36.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-05-02T08:26:02+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.41.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0|^7.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.63", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.19.2", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "bin": [ + "bin/remove-ray.sh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.41.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-04-24T14:21:46+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "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 Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "ffec95ba269e541eb2232126c0c20f83086b5c68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/ffec95ba269e541eb2232126c0c20f83086b5c68", + "reference": "ffec95ba269e541eb2232126c0c20f83086b5c68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.7" + }, + "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-04-18T09:22:46+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.7" + }, + "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-04-28T10:28:08+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": [ + "BSD-3-Clause" + ], + "authors": [ + { + "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": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/ff49e02f6489b38f7cc3d1bd3971adc0f872569c", + "reference": "ff49e02f6489b38f7cc3d1bd3971adc0f872569c", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=7.1", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "mikey179/vfsstream": "^1.6.0", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-04-28T00:58:54+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-03-18T04:31:04+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/783b034024fda8eafa19675fb2552f8654d3a3e9", + "reference": "783b034024fda8eafa19675fb2552f8654d3a3e9", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.9 | ^2.0", + "php": ">=7.2", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-05-30T22:51:52+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..ea9b987 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,9 @@ +includes: + - vendor/larastan/larastan/extension.neon + +parameters: + paths: + - src/ + - tests/ + + level: 5 diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..baeb151 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<phpunit + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + colors="true" + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" + displayDetailsOnTestsThatTriggerWarnings="true" + displayDetailsOnIncompleteTests="true" + cacheDirectory=".phpunit.cache"> + <testsuites> + <testsuite name="unit"> + <directory suffix="Test.php">./tests</directory> + </testsuite> + </testsuites> +</phpunit> diff --git a/pint.json b/pint.json new file mode 100644 index 0000000..684f282 --- /dev/null +++ b/pint.json @@ -0,0 +1,3 @@ +{ + "preset": "psr12" +} diff --git a/src/Enums/EpisodeType.php b/src/Enums/EpisodeType.php new file mode 100644 index 0000000..c47dcf5 --- /dev/null +++ b/src/Enums/EpisodeType.php @@ -0,0 +1,10 @@ +<?php + +namespace PhanAn\Poddle\Enums; + +enum EpisodeType: string +{ + case FULL = 'full'; + case TRAILER = 'trailer'; + case BONUS = 'bonus'; +} diff --git a/src/Enums/PodcastType.php b/src/Enums/PodcastType.php new file mode 100644 index 0000000..71f6d98 --- /dev/null +++ b/src/Enums/PodcastType.php @@ -0,0 +1,9 @@ +<?php + +namespace PhanAn\Poddle\Enums; + +enum PodcastType: string +{ + case EPISODIC = 'episodic'; + case SERIAL = 'serial'; +} diff --git a/src/Exceptions/InvalidCategoryElementException.php b/src/Exceptions/InvalidCategoryElementException.php new file mode 100644 index 0000000..345d996 --- /dev/null +++ b/src/Exceptions/InvalidCategoryElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidCategoryElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#itunescategory'; + } + + protected function elementName(): string + { + return '<itunes:category>'; + } +} diff --git a/src/Exceptions/InvalidClosureElementException.php b/src/Exceptions/InvalidClosureElementException.php new file mode 100644 index 0000000..31a6ec6 --- /dev/null +++ b/src/Exceptions/InvalidClosureElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidClosureElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#enclosure'; + } + + protected function elementName(): string + { + return '<enclosure>'; + } +} diff --git a/src/Exceptions/InvalidDateTimeFormatException.php b/src/Exceptions/InvalidDateTimeFormatException.php new file mode 100644 index 0000000..f0f6d61 --- /dev/null +++ b/src/Exceptions/InvalidDateTimeFormatException.php @@ -0,0 +1,13 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +use Exception; + +class InvalidDateTimeFormatException extends Exception +{ + public function __construct(string $datetime) + { + parent::__construct("Invalid datetime format: $datetime. Make sure the value conforms to RFC 2822 specs."); + } +} diff --git a/src/Exceptions/InvalidDurationException.php b/src/Exceptions/InvalidDurationException.php new file mode 100644 index 0000000..822b66c --- /dev/null +++ b/src/Exceptions/InvalidDurationException.php @@ -0,0 +1,15 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +use Exception; + +class InvalidDurationException extends Exception +{ + public function __construct(string $duration) + { + parent::__construct( + "Invalid duration: $duration. Duration must be in [HH:]MM:SS format or as number of seconds." + ); + } +} diff --git a/src/Exceptions/InvalidElementException.php b/src/Exceptions/InvalidElementException.php new file mode 100644 index 0000000..e0db4a8 --- /dev/null +++ b/src/Exceptions/InvalidElementException.php @@ -0,0 +1,26 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +use Exception; +use Throwable; + +abstract class InvalidElementException extends Exception +{ + abstract protected function specUrl(): string; + abstract protected function elementName(): string; + + public function __construct(Throwable $previous = null) + { + parent::__construct( + sprintf( + 'Invalid %s element. A valid %s element must conform to the specifications at %s.', + $this->elementName(), + $this->elementName(), + $this->specUrl() + ), + 400, + $previous + ); + } +} diff --git a/src/Exceptions/InvalidEpisodeElementException.php b/src/Exceptions/InvalidEpisodeElementException.php new file mode 100644 index 0000000..53d6d66 --- /dev/null +++ b/src/Exceptions/InvalidEpisodeElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidEpisodeElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#required-item-elements'; + } + + protected function elementName(): string + { + return '<item>'; + } +} diff --git a/src/Exceptions/InvalidFundingElementException.php b/src/Exceptions/InvalidFundingElementException.php new file mode 100644 index 0000000..5adde21 --- /dev/null +++ b/src/Exceptions/InvalidFundingElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidFundingElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#channel-podcast-funding'; + } + + protected function elementName(): string + { + return '<podcast:funding>'; + } +} diff --git a/src/Exceptions/InvalidGuidElementException.php b/src/Exceptions/InvalidGuidElementException.php new file mode 100644 index 0000000..33664b6 --- /dev/null +++ b/src/Exceptions/InvalidGuidElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidGuidElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#guid'; + } + + protected function elementName(): string + { + return '<guid>'; + } +} diff --git a/src/Exceptions/InvalidTranscriptElementException.php b/src/Exceptions/InvalidTranscriptElementException.php new file mode 100644 index 0000000..e26dfda --- /dev/null +++ b/src/Exceptions/InvalidTranscriptElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidTranscriptElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#podcasttranscript'; + } + + protected function elementName(): string + { + return '<podcast:transcript>'; + } +} diff --git a/src/Exceptions/InvalidTxtElementException.php b/src/Exceptions/InvalidTxtElementException.php new file mode 100644 index 0000000..0088594 --- /dev/null +++ b/src/Exceptions/InvalidTxtElementException.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Exceptions; + +class InvalidTxtElementException extends InvalidElementException +{ + protected function specUrl(): string + { + return 'https://github.com/Podcast-Standards-Project/PSP-1-Podcast-RSS-Specification#podcasttxt'; + } + + protected function elementName(): string + { + return '<podcast:txt>'; + } +} diff --git a/src/Poddle.php b/src/Poddle.php new file mode 100644 index 0000000..b467fd5 --- /dev/null +++ b/src/Poddle.php @@ -0,0 +1,157 @@ +<?php + +namespace PhanAn\Poddle; + +use Generator; +use Illuminate\Support\Facades\Http; +use Illuminate\Support\Str; +use PhanAn\Poddle\Enums\PodcastType; +use PhanAn\Poddle\Values\CategoryCollection; +use PhanAn\Poddle\Values\Channel; +use PhanAn\Poddle\Values\ChannelMetadata; +use PhanAn\Poddle\Values\Episode; +use PhanAn\Poddle\Values\EpisodeCollection; +use PhanAn\Poddle\Values\FundingCollection; +use PhanAn\Poddle\Values\TxtCollection; +use Saloon\XmlWrangler\Exceptions\QueryAlreadyReadException; +use Saloon\XmlWrangler\Exceptions\XmlReaderException; +use Saloon\XmlWrangler\XmlReader; +use Throwable; +use VeeWee\Xml\Encoding\Exception\EncodingException; + +class Poddle +{ + public readonly XmlReader $xmlReader; + + public function __construct(public readonly string $xml) + { + $this->xmlReader = XmlReader::fromString($xml); + } + + public static function fromUrl(string $url, int $timeoutInSeconds = 30): self + { + return new self(Http::timeout($timeoutInSeconds)->get($url)->body()); + } + + public static function fromXml(string $xml): self + { + return new self($xml); + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + public function getChannel(): Channel + { + return new Channel( + url: $this->getSoleValue('atom:link@href'), + title: $this->getSoleValue('title'), + description: $this->getSoleValue('description'), + link: $this->getSoleValue('link'), + language: $this->getSoleValue('language'), + categories: $this->getCategories(), + explicit: $this->getSoleValue('itunes:explicit') === 'yes', + image: $this->getSoleValue('itunes:image@href'), + metadata: $this->getMetadata() + ); + } + + public function getEpisodes(): EpisodeCollection + { + return new EpisodeCollection(function (): Generator { + foreach ($this->xmlReader->element('rss.channel.item')->collectLazy() as $item) { + yield Episode::fromXmlElement($item); + } + }); + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + private function getSoleValue(string ...$queries): ?string + { + foreach ($queries as $query) { + if (!Str::startsWith('/rss/channel/', $query)) { + $query = '/rss/channel/'.ltrim($query, '/'); + } + + if (Str::contains($query, '@')) { + [$query, $attribute] = explode('@', $query, 2); + $value = $this->xmlReader->xpathElement($query)->first()?->getAttribute($attribute); // @phpstan-ignore-line + } else { + $value = $this->xmlReader->xpathValue($query)->first(); + } + + if ($value) { + return $value; + } + } + + return null; + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + private function getMetadata(): ChannelMetadata + { + return new ChannelMetadata( + locked: $this->getSoleValue('podcast:locked') === 'yes', + guid: $this->getSoleValue('guid'), + author: $this->getSoleValue('itunes:author'), + copyright: $this->getSoleValue('copyright'), + txts: $this->getTxts(), + fundings: $this->getFundings(), + type: PodcastType::tryFrom($this->getSoleValue('itunes:type') ?? ''), + complete: $this->getSoleValue('itunes:complete') === 'yes', + ); + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + private function getFundings(): FundingCollection + { + return FundingCollection::fromXmlElements( + $this->xmlReader->element('rss.channel.podcast:funding')->collectLazy() + ); + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + private function getCategories(): CategoryCollection + { + return CategoryCollection::fromXmlElements( + $this->xmlReader->element('rss.channel.itunes:category')->collectLazy() + ); + } + + /** + * @throws EncodingException + * @throws QueryAlreadyReadException + * @throws Throwable + * @throws XmlReaderException + */ + private function getTxts(): TxtCollection + { + return TxtCollection::fromXmlElements( + $this->xmlReader->element('rss.channel.podcast:txt')->collectLazy() + ); + } +} diff --git a/src/Values/Category.php b/src/Values/Category.php new file mode 100644 index 0000000..a25495a --- /dev/null +++ b/src/Values/Category.php @@ -0,0 +1,66 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidCategoryElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Category extends Serializable +{ + final public function __construct(public readonly string $text, public readonly ?Category $subCategory = null) + { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + text: $element->getAttribute('text'), + subCategory: self::getSubCategoryFromXmlElement($element) + ); + } catch (Throwable $exception) { + throw new InvalidCategoryElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + text: Arr::get($data, 'text'), + subCategory: optional(Arr::get($data, 'sub_category'), static fn ($sub) => static::fromArray($sub)) + ); + } + + /** + * Get the subcategory from the given XML element. + * NOTE: Following Apple's guide (https://help.apple.com/itc/podcasts_connect/#/itcb54353390), + * we only take the first subcategory if there are multiple. + */ + private static function getSubCategoryFromXmlElement(Element $element): ?Category + { + /** @var Element|null $subElement */ + $subElement = Arr::get($element->getContent(), 'itunes:category'); + + if (!$subElement) { + return null; + } + + /** @var string|array<Element> $content */ + $content = $subElement->getContent(); + + return $content + ? new static($content[0]->getAttribute('text')) + : new static($subElement->getAttribute('text')); + } + + /** @return array<string, mixed> */ + public function toArray(): array + { + return [ + 'text' => $this->text, + 'sub_category' => $this->subCategory?->toArray(), + ]; + } +} diff --git a/src/Values/CategoryCollection.php b/src/Values/CategoryCollection.php new file mode 100644 index 0000000..fdf4c0a --- /dev/null +++ b/src/Values/CategoryCollection.php @@ -0,0 +1,42 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Collection; +use Illuminate\Support\Enumerable; +use Saloon\XmlWrangler\Data\Element; + +/** + * @template TKey of array-key + * @template TModel of Category + * @extends Collection<TKey, TModel> + */ +class CategoryCollection extends Collection +{ + /** + * @param array<TModel> $items + */ + final public function __construct(array $items = []) + { + parent::__construct($items); + } + + public static function fromXmlElements(Enumerable $elements): static + { + return tap(new static(), static function (self $collection) use ($elements): void { + $elements->each(static fn (Element $element) => $collection->add(Category::fromXmlElement($element))); + }); + } + + /** + * @param array<array-key, array<array-key, mixed>> $data + */ + public static function fromArray(array $data): static + { + return tap(new static(), static function (self $collection) use ($data): void { + foreach ($data as $item) { + $collection->add(Category::fromArray($item)); + } + }); + } +} diff --git a/src/Values/Channel.php b/src/Values/Channel.php new file mode 100644 index 0000000..081c47e --- /dev/null +++ b/src/Values/Channel.php @@ -0,0 +1,51 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; + +class Channel extends Serializable +{ + final public function __construct( + public readonly string $url, + public readonly string $title, + public readonly string $description, + public readonly string $link, + public readonly string $language, + public readonly CategoryCollection $categories, + public readonly bool $explicit, + public readonly string $image, + public readonly ChannelMetadata $metadata, + ) { + } + + public static function fromArray(array $data): static + { + return new static( + url: Arr::get($data, 'url'), + title: Arr::get($data, 'title'), + description: Arr::get($data, 'description'), + link: Arr::get($data, 'link'), + language: Arr::get($data, 'language'), + categories: CategoryCollection::fromArray(Arr::get($data, 'categories', [])), + explicit: Arr::get($data, 'explicit', false), + image: Arr::get($data, 'image'), + metadata: ChannelMetadata::fromArray(Arr::get($data, 'metadata', [])), + ); + } + + public function toArray(): array + { + return [ + 'url' => $this->url, + 'title' => $this->title, + 'description' => $this->description, + 'link' => $this->link, + 'language' => $this->language, + 'categories' => $this->categories->toArray(), + 'explicit' => $this->explicit, + 'image' => $this->image, + 'metadata' => $this->metadata->toArray(), + ]; + } +} diff --git a/src/Values/ChannelMetadata.php b/src/Values/ChannelMetadata.php new file mode 100644 index 0000000..0358fca --- /dev/null +++ b/src/Values/ChannelMetadata.php @@ -0,0 +1,50 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Enums\PodcastType; + +class ChannelMetadata extends Serializable +{ + final public function __construct( + public readonly bool $locked, + public readonly ?string $guid, + public readonly ?string $author, + public readonly ?string $copyright, + public readonly TxtCollection $txts, + public readonly FundingCollection $fundings, + public readonly ?PodcastType $type, + public readonly bool $complete + ) { + } + + public static function fromArray(array $data): static + { + return new static( + locked: Arr::get($data, 'locked', false), + guid: Arr::get($data, 'guid'), + author: Arr::get($data, 'author'), + copyright: Arr::get($data, 'copyright'), + txts: TxtCollection::fromArray(Arr::get($data, 'txts', [])), + fundings: FundingCollection::fromArray(Arr::get($data, 'fundings', [])), + type: PodcastType::tryFrom(Arr::get($data, 'type') ?? ''), + complete: Arr::get($data, 'complete', false), + ); + } + + /** @return array<string, mixed> */ + public function toArray(): array + { + return [ + 'locked' => $this->locked, + 'guid' => $this->guid, + 'author' => $this->author, + 'copyright' => $this->copyright, + 'txts' => $this->txts->toArray(), + 'fundings' => $this->fundings->toArray(), + 'type' => $this->type->value, + 'complete' => $this->complete, + ]; + } +} diff --git a/src/Values/Enclosure.php b/src/Values/Enclosure.php new file mode 100644 index 0000000..554a417 --- /dev/null +++ b/src/Values/Enclosure.php @@ -0,0 +1,50 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidClosureElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Enclosure extends Serializable +{ + final public function __construct( + public readonly string $url, + public readonly string $type, + public readonly int $length + ) { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + url: $element->getAttribute('url'), + type: $element->getAttribute('type'), + length: intval($element->getAttribute('length')), + ); + } catch (Throwable $exception) { + throw new InvalidClosureElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + url: Arr::get($data, 'url'), + type: Arr::get($data, 'type'), + length: Arr::get($data, 'length'), + ); + } + + /** @return array<string, string|int> */ + public function toArray(): array + { + return [ + 'url' => $this->url, + 'type' => $this->type, + 'length' => $this->length, + ]; + } +} diff --git a/src/Values/Episode.php b/src/Values/Episode.php new file mode 100644 index 0000000..e35595b --- /dev/null +++ b/src/Values/Episode.php @@ -0,0 +1,47 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidEpisodeElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Episode extends Serializable +{ + final public function __construct( + public readonly string $title, + public readonly EpisodeGuid $guid, + public readonly Enclosure $enclosure, + public readonly EpisodeMetadata $metadata + ) { + } + + public static function fromXmlElement(Element $item): static + { + try { + /** @var array<string, Element> $content */ + $content = $item->getContent(); + + return new static( + title: Arr::get($content, 'title', Arr::get($content, 'itunes:title'))->getContent(), + guid: EpisodeGuid::fromXmlElement(Arr::get($content, 'guid')), + enclosure: Enclosure::fromXmlElement(Arr::get($content, 'enclosure')), + metadata: EpisodeMetadata::fromXmlElement($item) + ); + } catch (Throwable $exception) { + throw new InvalidEpisodeElementException($exception); + } + } + + /** @return array<string, mixed> */ + public function toArray(): array + { + return [ + 'title' => $this->title, + 'guid' => $this->guid->toArray(), + 'enclosure' => $this->enclosure->toArray(), + 'metadata' => $this->metadata->toArray(), + ]; + } +} diff --git a/src/Values/EpisodeCollection.php b/src/Values/EpisodeCollection.php new file mode 100644 index 0000000..602e5de --- /dev/null +++ b/src/Values/EpisodeCollection.php @@ -0,0 +1,18 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\LazyCollection; + +/** + * @template TKey of array-key + * @template TModel of Episode + * @extends LazyCollection<TKey, TModel> + */ +class EpisodeCollection extends LazyCollection +{ + final public function __construct($source = null) + { + parent::__construct($source); + } +} diff --git a/src/Values/EpisodeGuid.php b/src/Values/EpisodeGuid.php new file mode 100644 index 0000000..2118c98 --- /dev/null +++ b/src/Values/EpisodeGuid.php @@ -0,0 +1,49 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidGuidElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class EpisodeGuid extends Serializable +{ + final public function __construct(public readonly string $guid, public readonly bool $isPermaLink) + { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + guid: $element->getContent(), + isPermaLink: $element->getAttribute('isPermaLink') === 'true', + ); + } catch (Throwable $exception) { + throw new InvalidGuidElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + guid: Arr::get($data, 'guid'), + isPermaLink: Arr::get($data, 'is_perma_link'), + ); + } + + /** @return array<string, string|bool> */ + public function toArray(): array + { + return [ + 'guid' => $this->guid, + 'is_perma_link' => $this->isPermaLink, + ]; + } + + public function __toString(): string + { + return $this->guid; + } +} diff --git a/src/Values/EpisodeMetadata.php b/src/Values/EpisodeMetadata.php new file mode 100644 index 0000000..58b2131 --- /dev/null +++ b/src/Values/EpisodeMetadata.php @@ -0,0 +1,129 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use DateTime; +use DateTimeInterface; +use Illuminate\Support\Arr; +use PhanAn\Poddle\Enums\EpisodeType; +use PhanAn\Poddle\Exceptions\InvalidDateTimeFormatException; +use PhanAn\Poddle\Exceptions\InvalidDurationException; +use Saloon\XmlWrangler\Data\Element; + +class EpisodeMetadata extends Serializable +{ + final public function __construct( + public readonly ?string $link, + public readonly ?DateTime $pubDate, + public readonly ?string $description, + public readonly ?int $duration, + public readonly ?string $image, + public readonly ?bool $explicit, + public readonly TranscriptCollection $transcripts, + public readonly ?int $episode, + public readonly ?int $season, + public readonly ?EpisodeType $type, + public readonly ?bool $block, + ) { + } + + public static function fromXmlElement(Element $item): static + { + /** @var array<string, Element> $content */ + $content = $item->getContent(); + + return new static( + link: Arr::get($content, 'link')?->getContent(), + pubDate: self::parseDateTime(Arr::get($content, 'pubDate')?->getContent()), + description: Arr::get($content, 'description')?->getContent(), + duration: self::parseDuration(Arr::get($content, 'itunes:duration')?->getContent()), + image: Arr::get($content, 'itunes:image')?->getAttribute('href'), + explicit: Arr::get($content, 'itunes:explicit')?->getContent() === 'true', + transcripts: self::getTranscripts(Arr::get($content, 'podcast:transcript')), + episode: optional(Arr::get($content, 'itunes:episode')?->getContent(), 'intval'), + season: optional(Arr::get($content, 'itunes:season')?->getContent(), 'intval'), + type: EpisodeType::tryFrom(Arr::get($content, 'itunes:episodeType')?->getContent() ?? ''), + block: Arr::get($content, 'itunes:block')?->getContent() === 'yes', + ); + } + + public static function fromArray(array $data): static + { + return new static( + link: Arr::get($data, 'link'), + pubDate: self::parseDateTime(Arr::get($data, 'pub_date')), + description: Arr::get($data, 'description'), + duration: self::parseDuration(Arr::get($data, 'duration')), + image: Arr::get($data, 'image'), + explicit: Arr::get($data, 'explicit'), + transcripts: TranscriptCollection::fromArray(Arr::get($data, 'transcripts', [])), + episode: optional(Arr::get($data, 'episode'), 'intval'), + season: optional(Arr::get($data, 'season'), 'intval'), + type: EpisodeType::tryFrom(Arr::get($data, 'type') ?? ''), + block: optional( + Arr::get($data, 'block'), + static fn ($value) => filter_var($value, FILTER_VALIDATE_BOOLEAN) + ), + ); + } + + private static function getTranscripts(Element|array|null $value): TranscriptCollection + { + if (!$value) { + return TranscriptCollection::make(); + } + + if ($value instanceof Element) { + $content = $value->getContent(); + + return is_array($content) + ? TranscriptCollection::fromXmlElements($content) + : TranscriptCollection::fromXmlElements([$value]); + } + + return TranscriptCollection::fromXmlElements($value); + } + + private static function parseDateTime(?string $input): ?DateTime + { + $formatted = $input ? DateTime::createFromFormat(DateTimeInterface::RFC2822, $input) : null; + + if ($formatted === false) { + throw new InvalidDateTimeFormatException($input); + } + + return $formatted; + } + + private static function parseDuration(string|int|null $duration): ?int + { + $duration = (string) $duration; + + return $duration + ? match (sscanf($duration, '%d:%d:%d', $x, $y, $z)) { + 1 => $x, + 2 => $x * 60 + $y, + 3 => $x * 3600 + $y * 60 + $z, + default => throw new InvalidDurationException($duration), + } + : null; + } + + /** @return array<string, mixed> */ + public function toArray(): array + { + return [ + 'link' => $this->link, + 'pub_date' => $this->pubDate?->format(DateTimeInterface::RFC2822), + 'description' => $this->description, + 'duration' => $this->duration, + 'image' => $this->image, + 'explicit' => $this->explicit, + 'transcripts' => $this->transcripts->toArray(), + 'episode' => $this->episode, + 'season' => $this->season, + 'type' => $this->type?->value, + 'block' => $this->block, + ]; + } +} diff --git a/src/Values/Funding.php b/src/Values/Funding.php new file mode 100644 index 0000000..1e602de --- /dev/null +++ b/src/Values/Funding.php @@ -0,0 +1,44 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidFundingElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Funding extends Serializable +{ + final public function __construct(public readonly string $url, public readonly string $text) + { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + url: $element->getAttribute('url'), + text: $element->getContent(), + ); + } catch (Throwable $exception) { + throw new InvalidFundingElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + url: Arr::get($data, 'url'), + text: Arr::get($data, 'text'), + ); + } + + /** @return array<string, string> */ + public function toArray(): array + { + return [ + 'url' => $this->url, + 'text' => $this->text, + ]; + } +} diff --git a/src/Values/FundingCollection.php b/src/Values/FundingCollection.php new file mode 100644 index 0000000..19f4388 --- /dev/null +++ b/src/Values/FundingCollection.php @@ -0,0 +1,42 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Collection; +use Illuminate\Support\Enumerable; +use Saloon\XmlWrangler\Data\Element; + +/** + * @template TKey of array-key + * @template TModel of Funding + * @extends Collection<TKey, TModel> + */ +class FundingCollection extends Collection +{ + /** + * @param array<TModel> $items + */ + final public function __construct(array $items = []) + { + parent::__construct($items); + } + + public static function fromXmlElements(Enumerable $elements): static + { + return tap(new static(), static function (self $collection) use ($elements): void { + $elements->each(static fn (Element $element) => $collection->add(Funding::fromXmlElement($element))); + }); + } + + /** + * @param array<array-key, array<array-key, mixed>> $data + */ + public static function fromArray(array $data): static + { + return tap(new static(), static function (self $collection) use ($data): void { + foreach ($data as $item) { + $collection->add(Funding::fromArray($item)); + } + }); + } +} diff --git a/src/Values/Serializable.php b/src/Values/Serializable.php new file mode 100644 index 0000000..b77382c --- /dev/null +++ b/src/Values/Serializable.php @@ -0,0 +1,16 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Jsonable; + +abstract class Serializable implements Arrayable, Jsonable +{ + abstract public function toArray(): array; + + public function toJson($options = 0): false|string + { + return json_encode($this->toArray(), $options); + } +} diff --git a/src/Values/Transcript.php b/src/Values/Transcript.php new file mode 100644 index 0000000..269b731 --- /dev/null +++ b/src/Values/Transcript.php @@ -0,0 +1,54 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidTranscriptElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Transcript extends Serializable +{ + final public function __construct( + public readonly string $url, + public readonly string $type, + public readonly ?string $language, + public readonly ?string $rel + ) { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + url: $element->getAttribute('url'), + type: $element->getAttribute('type'), + language: $element->getAttribute('language'), + rel: $element->getAttribute('rel'), + ); + } catch (Throwable $exception) { + throw new InvalidTranscriptElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + url: Arr::get($data, 'url'), + type: Arr::get($data, 'type'), + language: Arr::get($data, 'language'), + rel: Arr::get($data, 'rel'), + ); + } + + /** @return array<string, string|null> */ + public function toArray(): array + { + return [ + 'url' => $this->url, + 'type' => $this->type, + 'language' => $this->language, + 'rel' => $this->rel, + ]; + } +} diff --git a/src/Values/TranscriptCollection.php b/src/Values/TranscriptCollection.php new file mode 100644 index 0000000..aa557dc --- /dev/null +++ b/src/Values/TranscriptCollection.php @@ -0,0 +1,46 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Collection; +use Saloon\XmlWrangler\Data\Element; + +/** + * @template TKey of array-key + * @template TModel of Transcript + * @extends Collection<TKey, TModel> + */ +class TranscriptCollection extends Collection +{ + /** + * @param array<TModel> $items + */ + final public function __construct(array $items = []) + { + parent::__construct($items); + } + + /** + * @param array<array-key, Element> $elements + */ + public static function fromXmlElements(array $elements): static + { + return tap(new static(), static function (self $collection) use ($elements): void { + foreach ($elements as $element) { + $collection->add(Transcript::fromXmlElement($element)); + } + }); + } + + /** + * @param array<array-key, array<array-key, mixed>> $data + */ + public static function fromArray(array $data): static + { + return tap(new static(), static function (self $collection) use ($data): void { + foreach ($data as $item) { + $collection->add(Transcript::fromArray($item)); + } + }); + } +} diff --git a/src/Values/Txt.php b/src/Values/Txt.php new file mode 100644 index 0000000..9286eb9 --- /dev/null +++ b/src/Values/Txt.php @@ -0,0 +1,46 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Arr; +use PhanAn\Poddle\Exceptions\InvalidTxtElementException; +use Saloon\XmlWrangler\Data\Element; +use Throwable; + +class Txt extends Serializable +{ + final public function __construct(public readonly string $content, public readonly ?string $purpose) + { + } + + public static function fromXmlElement(Element $element): static + { + try { + return new static( + content: $element->getContent(), + purpose: $element->getAttribute('purpose'), + ); + } catch (Throwable $exception) { + throw new InvalidTxtElementException($exception); + } + } + + public static function fromArray(array $data): static + { + return new static( + content: Arr::get($data, 'content'), + purpose: Arr::get($data, 'purpose'), + ); + } + + /** + * @return array<string, string|null> + */ + public function toArray(): array + { + return [ + 'content' => $this->content, + 'purpose' => $this->purpose, + ]; + } +} diff --git a/src/Values/TxtCollection.php b/src/Values/TxtCollection.php new file mode 100644 index 0000000..11027f6 --- /dev/null +++ b/src/Values/TxtCollection.php @@ -0,0 +1,42 @@ +<?php + +namespace PhanAn\Poddle\Values; + +use Illuminate\Support\Collection; +use Illuminate\Support\Enumerable; +use Saloon\XmlWrangler\Data\Element; + +/** + * @template TKey of array-key + * @template TModel of Txt + * @extends Collection<TKey, TModel> + */ +class TxtCollection extends Collection +{ + /** + * @param array<TModel> $items + */ + final public function __construct(array $items = []) + { + parent::__construct($items); + } + + public static function fromXmlElements(Enumerable $elements): static + { + return tap(new static(), static function (self $collection) use ($elements): void { + $elements->each(static fn (Element $element) => $collection->add(Txt::fromXmlElement($element))); + }); + } + + /** + * @param array<array-key, array<array-key, mixed>> $data + */ + public static function fromArray(array $data): static + { + return tap(new static(), static function (self $collection) use ($data): void { + foreach ($data as $item) { + $collection->add(Txt::fromArray($item)); + } + }); + } +} diff --git a/tests/PoddleTest.php b/tests/PoddleTest.php new file mode 100644 index 0000000..1e6f675 --- /dev/null +++ b/tests/PoddleTest.php @@ -0,0 +1,122 @@ +<?php + +namespace Tests; + +use Illuminate\Support\Facades\Http; +use Illuminate\Support\LazyCollection; +use PhanAn\Poddle\Poddle; +use PhanAn\Poddle\Values\Channel; +use PhanAn\Poddle\Values\Episode; +use PhanAn\Poddle\Values\EpisodeCollection; + +class PoddleTest extends TestCase +{ + public function testGetChannel(): void + { + $channel = Poddle::fromXml(file_get_contents(__DIR__ . '/fixtures/sample.xml'))->getChannel(); + self::assertChannel($channel); + } + + public function testGetEpisodes(): void + { + $episodes = Poddle::fromXml(file_get_contents(__DIR__ . '/fixtures/sample.xml'))->getEpisodes(); + self::assertEpisodes($episodes); + } + + public function testParseUrl(): void + { + Http::fake([ + 'https://mypodcast.com/feed' => Http::response(file_get_contents(__DIR__ . '/fixtures/sample.xml')) + ]); + + $parser = Poddle::fromUrl('https://mypodcast.com/feed'); + + self::assertChannel($parser->getChannel()); + self::assertEpisodes($parser->getEpisodes()); + } + + private static function assertChannel(Channel $channel): void + { + self::assertEqualsCanonicalizing([ + 'url' => 'https://phanan.net', + 'title' => 'Podcast Feed Parser', + 'description' => 'Parse podcast feeds with PHP following PSP-1 Podcast RSS Standard', + 'link' => 'https://github.com/phanan/podcast-feed-parser', + 'language' => 'en-US', + 'categories' => [ + [ + 'text' => 'News', + 'sub_category' => [ + 'text' => 'Tech News', + 'sub_category' => null, + ], + ], + ], + 'explicit' => false, + 'image' => 'https://github.com/phanan.png', + 'metadata' => [ + 'locked' => false, + 'guid' => null, + 'author' => 'Phan An (phanan)', + 'copyright' => 'Phan An © 2024', + 'txts' => [ + [ + 'content' => 'naj3eEZaWVVY9a38uhX8FekACyhtqP4JN', + 'purpose' => null, + ], + [ + 'content' => 'S6lpp-7ZCn8-dZfGc-OoyaG', + 'purpose' => 'verify', + ], + ], + 'fundings' => [ + [ + 'url' => 'https://github.com/sponsors/phanan', + 'text' => 'Sponsor me on GitHub', + ], + [ + 'url' => 'https://opencollective.com/koel', + 'text' => 'My other Open Collective', + ], + ], + 'type' => 'episodic', + 'complete' => false, + ], + ], $channel->toArray()); + } + + public function assertEpisodes(EpisodeCollection $episodes): void + { + self::assertInstanceOf(LazyCollection::class, $episodes); + self::assertSame(8, $episodes->count()); + + /** @var Episode $firstEpisode */ + $firstEpisode = $episodes->first(); + + self::assertEqualsCanonicalizing([ + 'title' => 'Hiking Treks Trailer', + 'guid' => [ + 'guid' => 'D03EEC9B-B1B4-475B-92C8-54F853FA2A22', + 'is_perma_link' => false, + ], + 'enclosure' => [ + 'url' => 'http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3', + 'type' => 'audio/mpeg', + 'length' => 498537, + ], + 'metadata' => [ + 'link' => null, + 'pubDate' => 'Tue, 08 Jan 2019 01:15:00 +0000', + 'description' => 'The Sunset Explorers share tips, techniques and recommendations for great hikes', + 'duration' => 1079, + 'image' => null, + 'explicit' => false, + 'transcripts' => [], + 'episode' => null, + 'season' => null, + 'type' => 'trailer', + 'block' => false, + ] + ], $firstEpisode->toArray()); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..239c2ba --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,9 @@ +<?php + +namespace Tests; + +use Orchestra\Testbench\TestCase as BaseTestCase; + +class TestCase extends BaseTestCase +{ +} diff --git a/tests/Values/CategoryCollectionTest.php b/tests/Values/CategoryCollectionTest.php new file mode 100644 index 0000000..e8dcc72 --- /dev/null +++ b/tests/Values/CategoryCollectionTest.php @@ -0,0 +1,23 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Values\CategoryCollection; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class CategoryCollectionTest extends TestCase +{ + public function testCreateFromXmlElements(): void + { + $collection = CategoryCollection::fromXmlElements(collect([ + new Element(attributes: ['text' => 'News']), + new Element(attributes: ['text' => 'Entertainment']), + ])); + + self::assertEqualsCanonicalizing([ + ['text' => 'News', 'sub_category' => null], + ['text' => 'Entertainment', 'sub_category' => null], + ], $collection->toArray()); + } +} diff --git a/tests/Values/CategoryTest.php b/tests/Values/CategoryTest.php new file mode 100644 index 0000000..4683dc7 --- /dev/null +++ b/tests/Values/CategoryTest.php @@ -0,0 +1,70 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Exceptions\InvalidCategoryElementException; +use PhanAn\Poddle\Values\Category; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class CategoryTest extends TestCase +{ + public function testCreateFromXmlElement(): void + { + $element = new Element(attributes: ['text' => 'News']); + $category = Category::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'text' => 'News', + 'sub_category' => null, + ], $category->toArray()); + } + + public function testCreateWithSubcategory(): void + { + $element = new Element( + content: ['itunes:category' => new Element(attributes: ['text' => 'Tech News'])], + attributes: ['text' => 'News'], + ); + + $category = Category::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'text' => 'News', + 'sub_category' => [ + 'text' => 'Tech News', + 'sub_category' => null, + ], + ], $category->toArray()); + } + + public function testMultipleSubcategories(): void + { + $element = new Element( + content: [ + 'itunes:category' => new Element(content: [ + new Element(attributes: ['text' => 'Gadgets']), + new Element(attributes: ['text' => 'Tech News']), + ]), + ], + attributes: ['text' => 'News'], + ); + + $category = Category::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'text' => 'News', + 'sub_category' => [ + 'text' => 'Gadgets', + 'sub_category' => null, + ], + ], $category->toArray()); + } + + public function testCreateFromInvalidXmlElement(): void + { + self::expectException(InvalidCategoryElementException::class); + + Category::fromXmlElement(new Element()); + } +} diff --git a/tests/Values/EnclosureTest.php b/tests/Values/EnclosureTest.php new file mode 100644 index 0000000..549a343 --- /dev/null +++ b/tests/Values/EnclosureTest.php @@ -0,0 +1,35 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Exceptions\InvalidClosureElementException; +use PhanAn\Poddle\Values\Enclosure; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class EnclosureTest extends TestCase +{ + public function testCreateFromXmlElement(): void + { + $element = new Element(attributes: [ + 'url' => 'https://example.com/audio.mp3', + 'type' => 'audio/mpeg', + 'length' => '123456', + ]); + + $enclosure = Enclosure::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'url' => 'https://example.com/audio.mp3', + 'type' => 'audio/mpeg', + 'length' => 123456, + ], $enclosure->toArray()); + } + + public function testCreateFromInvalidXmlElement(): void + { + self::expectException(InvalidClosureElementException::class); + + Enclosure::fromXmlElement(new Element()); + } +} diff --git a/tests/Values/EpisodeGuidTest.php b/tests/Values/EpisodeGuidTest.php new file mode 100644 index 0000000..258e9fd --- /dev/null +++ b/tests/Values/EpisodeGuidTest.php @@ -0,0 +1,33 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Exceptions\InvalidGuidElementException; +use PhanAn\Poddle\Values\EpisodeGuid; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class EpisodeGuidTest extends TestCase +{ + public function testCreateFromXmlElement(): void + { + $element = new Element( + content: 'a34d23b2-0cc0-4851-88fe-e3d9b74f4c31', + attributes: ['isPermaLink' => 'false'] + ); + + $guid = EpisodeGuid::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'content' => 'a34d23b2-0cc0-4851-88fe-e3d9b74f4c31', + 'is_perma_link' => false, + ], $guid->toArray()); + } + + public function testCreateFromInvalidXmlElement(): void + { + self::expectException(InvalidGuidElementException::class); + + EpisodeGuid::fromXmlElement(new Element()); + } +} diff --git a/tests/Values/FundingCollectionTest.php b/tests/Values/FundingCollectionTest.php new file mode 100644 index 0000000..15da55f --- /dev/null +++ b/tests/Values/FundingCollectionTest.php @@ -0,0 +1,23 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Values\FundingCollection; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class FundingCollectionTest extends TestCase +{ + public function testCreateFromXmlElements(): void + { + $collection = FundingCollection::fromXmlElements(collect([ + new Element('Buy me a coffee!', ['url' => 'https://buymea.coffee']), + new Element('Buy me a beer!', ['url' => 'https://buymea.beer']) + ])); + + self::assertEqualsCanonicalizing([ + ['text' => 'Buy me a coffee!', 'url' => 'https://buymea.coffee'], + ['text' => 'Buy me a beer!', 'url' => 'https://buymea.beer'], + ], $collection->toArray()); + } +} diff --git a/tests/Values/FundingTest.php b/tests/Values/FundingTest.php new file mode 100644 index 0000000..bb9e9dc --- /dev/null +++ b/tests/Values/FundingTest.php @@ -0,0 +1,33 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Exceptions\InvalidFundingElementException; +use PhanAn\Poddle\Values\Funding; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class FundingTest extends TestCase +{ + public function testCreateFromXmlElement(): void + { + $element = new Element( + content: 'Buy me a coffee!', + attributes: ['url' => 'https://buymea.coffee/phanan'] + ); + + $enclosure = Funding::fromXmlElement($element); + + self::assertEqualsCanonicalizing([ + 'url' => 'https://buymea.coffee/phanan', + 'text' => 'Buy me a coffee!', + ], $enclosure->toArray()); + } + + public function testCreateFromInvalidXmlElement(): void + { + self::expectException(InvalidFundingElementException::class); + + Funding::fromXmlElement(new Element()); + } +} diff --git a/tests/Values/TxtCollectionTest.php b/tests/Values/TxtCollectionTest.php new file mode 100644 index 0000000..3e46f85 --- /dev/null +++ b/tests/Values/TxtCollectionTest.php @@ -0,0 +1,23 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Values\TxtCollection; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class TxtCollectionTest extends TestCase +{ + public function testCreateFromXmlElements(): void + { + $txtCollection = TxtCollection::fromXmlElements(collect([ + new Element(content: 'Hello, world!'), + new Element(content: 'Goodbye, world!', attributes: ['purpose' => 'verify']), + ])); + + self::assertEqualsCanonicalizing([ + ['content' => 'Hello, world!', 'purpose' => null], + ['content' => 'Goodbye, world!', 'purpose' => 'verify'], + ], $txtCollection->toArray()); + } +} diff --git a/tests/Values/TxtTest.php b/tests/Values/TxtTest.php new file mode 100644 index 0000000..50ea0dc --- /dev/null +++ b/tests/Values/TxtTest.php @@ -0,0 +1,27 @@ +<?php + +namespace Tests\Values; + +use PhanAn\Poddle\Exceptions\InvalidTxtElementException; +use PhanAn\Poddle\Values\Txt; +use Saloon\XmlWrangler\Data\Element; +use Tests\TestCase; + +class TxtTest extends TestCase +{ + public function testCreateFromXmlElement(): void + { + $txt = Txt::fromXmlElement(new Element(content: 'Hello, world!')); + self::assertEqualsCanonicalizing(['content' => 'Hello, world!', 'purpose' => null], $txt->toArray()); + + $txt = Txt::fromXmlElement(new Element(content: 'Hello, world!', attributes: ['purpose' => 'greeting'])); + self::assertEqualsCanonicalizing(['content' => 'Hello, world!', 'purpose' => 'greeting'], $txt->toArray()); + } + + public function testCreateFromInvalidXmlElement(): void + { + $this->expectException(InvalidTxtElementException::class); + + Txt::fromXmlElement(new Element()); + } +} diff --git a/tests/fixtures/sample.xml b/tests/fixtures/sample.xml new file mode 100644 index 0000000..3e1abf6 --- /dev/null +++ b/tests/fixtures/sample.xml @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" + xmlns:atom="http://www.w3.org/2005/Atom" + xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" + xmlns:podcast="https://podcastindex.org/namespace/1.0"> + + <channel> + <title>Podcast Feed Parser</title> + <link>https://github.com/phanan/podcast-feed-parser</link> + <description><![CDATA[Parse podcast feeds with PHP following PSP-1 Podcast RSS Standard]]></description> + <lastBuildDate>Thu, 02 May 2024 06:44:38 +0000</lastBuildDate> + + <image> + <url>https://github.com/phanan.png</url> + <title>Phan An</title> + <link>https://phanan.net</link> + </image> + <atom:link rel="self" type="application/rss+xml" title="Podcast Feed Parser" href="https://phanan.net"/> + <language>en-US</language> + <generator>Rice Cooker</generator> + <copyright>Phan An © 2024</copyright> + <itunes:author>Phan An (phanan)</itunes:author> + <itunes:type>episodic</itunes:type> + <itunes:category text="News"> + <itunes:category text="Tech News"/> + </itunes:category> + + <itunes:image href="https://github.com/phanan.png"/> + <itunes:block>no</itunes:block> + <itunes:explicit>no</itunes:explicit> + + <podcast:funding url="https://github.com/sponsors/phanan">Sponsor me on GitHub</podcast:funding> + <podcast:funding url="https://opencollective.com/koel">My other Open Collective</podcast:funding> + + <podcast:txt>naj3eEZaWVVY9a38uhX8FekACyhtqP4JN</podcast:txt> + <podcast:txt purpose="verify">S6lpp-7ZCn8-dZfGc-OoyaG</podcast:txt> + + <item> + <itunes:episodeType>trailer</itunes:episodeType> + <itunes:title>Hiking Treks Trailer</itunes:title> + <description><![CDATA[The Sunset Explorers share tips, techniques and recommendations for great hikes]]></description> + <enclosure + length="498537" + type="audio/mpeg" + url="http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3" + /> + <guid>D03EEC9B-B1B4-475B-92C8-54F853FA2A22</guid> + <pubDate>Tue, 8 Jan 2019 01:15:00 GMT</pubDate> + <itunes:duration>1079</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>4</itunes:episode> + <itunes:season>2</itunes:season> + <title>S02 EP04 Mt. Hood, Oregon</title> + <description> + Tips for trekking around the tallest mountain in Oregon + </description> + <enclosure + length="8727310" + type="audio/x-m4a" + url="http://example.com/podcasts/everything/mthood.m4a" + /> + <guid>22BCFEBF-44FB-4A19-8229-7AC678629F57</guid> + <pubDate>Tue, 07 May 2019 12:00:00 GMT</pubDate> + <itunes:duration>1024</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>3</itunes:episode> + <itunes:season>2</itunes:season> + <title>S02 EP03 Bouldering Around Boulder</title> + <description> + We explore fun walks to climbing areas about the beautiful Colorado city of Boulder. + </description> + <itunes:image + href="http://example.com/podcasts/everything/AllAboutEverything/Episode2.jpg" + /> + <link>href="http://example.com/podcasts/everything/</link> + <enclosure + length="5650889" + type="video/mp4" + url="http://example.com/podcasts/boulder.mp4" + /> + <guid>BE486CAA-B3D5-4FB0-8298-EFEBE71C5982</guid> + <pubDate>Tue, 30 Apr 2019 13:00:00 EST</pubDate> + <itunes:duration>3627</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>2</itunes:episode> + <itunes:season>2</itunes:season> + <title>S02 EP02 Caribou Mountain, Maine</title> + <description> + Put your fitness to the test with this invigorating hill climb. + </description> + <itunes:image + href="http://example.com/podcasts/everything/AllAboutEverything/Episode3.jpg" + /> + <enclosure + length="5650889" + type="audio/x-m4v" + url="http://example.com/podcasts/everything/caribou.m4v" + /> + <guid>142FAFE9-B1DF-4F6D-BAA8-79BDBAF653A9</guid> + <pubDate>Tue, 23 May 2019 02:00:00 -0700</pubDate> + <itunes:duration>2434</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>4</itunes:episode> + <itunes:season>1</itunes:season> + <title>S01 EP04 Kuliouou Ridge Trail</title> + <description> + Oahu, Hawaii, has some picturesque hikes and this is one of the best! + </description> + <enclosure + length="498537" + type="audio/mpeg" + url="http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3" + /> + <guid>B5FCEB80-317C-4CD0-A84B-807065B43FB9</guid> + <pubDate>Tue, 27 Nov 2018 01:15:00 +0000</pubDate> + <itunes:duration>929</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>3</itunes:episode> + <itunes:season>1</itunes:season> + <title>S01 EP03 Blood Mountain Loop</title> + <description> + Hiking the Appalachian Trail and Freeman Trail in Georgia + </description> + <enclosure + length="498537" + type="audio/mpeg" + url="http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3" + /> + <guid>F0C5D763-ED85-4449-9C09-81FEBDF6F126</guid> + <pubDate>Tue, 23 Oct 2018 01:15:00 +0000</pubDate> + <itunes:duration>1440</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>2</itunes:episode> + <itunes:season>1</itunes:season> + <title>S01 EP02 Garden of the Gods Wilderness</title> + <description> + Wilderness Area Garden of the Gods in Illinois is a delightful spot for + an extended hike. + </description> + <enclosure + length="498537" + type="audio/mpeg" + url="http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3" + /> + <guid>821DD0B2-571D-4DFD-8E11-556E8C1EFE6A</guid> + <pubDate>Tue, 18 Sep 2018 01:15:00 +0000</pubDate> + <itunes:duration>839</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + <item> + <itunes:episodeType>full</itunes:episodeType> + <itunes:episode>1</itunes:episode> + <itunes:season>1</itunes:season> + <title>S01 EP01 Upper Priest Lake Trail to Continental Creek Trail</title> + <description> + We check out this powerfully scenic hike following the river in the Idaho + Panhandle National Forests. + </description> + <enclosure + length="498537" + type="audio/mpeg" + url="http://example.com/podcasts/everything/AllAboutEverythingEpisode4.mp3" + /> + <guid>EABDA7EE-1AC6-4B60-9E11-6B3F30B72F87</guid> + <pubDate>Tue, 14 Aug 2018 01:15:00 +0000</pubDate> + <itunes:duration>1399</itunes:duration> + <itunes:explicit>false</itunes:explicit> + </item> + </channel> +</rss>