From 1b0e99f7fe0d38a6764b7ecf0ae5c4e5fe2e8f6f Mon Sep 17 00:00:00 2001 From: Phan An 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 | 181 + 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, 11375 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..f8078c4 --- /dev/null +++ b/README.md @@ -0,0 +1,181 @@ +# Poddle – PHP Podcast Feed Parser [![Unit Tests](https://github.com/phanan/poddle/actions/workflows/unit.yml/badge.svg)](https://github.com/phanan/poddle/actions/workflows/unit.yml) + +![Poddle](./assets/banner.webp) + +> 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 +``` + +### 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#lazy-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 +``` + +### 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 the [`\Illuminate\Contracts\Support\Arrayable`](https://laravel.com/api/11.x/Illuminate/Contracts/Support/Arrayable.html) +and [`\Illuminate\Contracts\Support\Jsonable`](https://laravel.com/api/11.x/Illuminate/Contracts/Support/Jsonable.html) contracts, which provide two methods: + +```php +/** + * Get the instance as an array. All nested objects are also converted to arrays. + */ +public function toArray(): array; + +/** + * Convert the object to its JSON representation. + */ +public function toJson($options = 0): string; +``` + +Additionally, classes like `Channel` and `Episode` provide `fromArray` static methods to create instances from arrays. +These methods allow 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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 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 @@ + + + + + ./tests + + + 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 @@ +'; + } +} 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 @@ +'; + } +} 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 @@ +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 @@ +'; + } +} 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 @@ +'; + } +} 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 @@ +'; + } +} 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 @@ +'; + } +} 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 @@ +'; + } +} 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 @@ +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 @@ +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 $content */ + $content = $subElement->getContent(); + + return $content + ? new static($content[0]->getAttribute('text')) + : new static($subElement->getAttribute('text')); + } + + /** @return array */ + 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 @@ + + */ +class CategoryCollection extends Collection +{ + /** + * @param array $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> $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 @@ + $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 @@ + */ + 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 @@ +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 */ + 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 @@ + $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 */ + 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 @@ + + */ +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 @@ +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 */ + 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 @@ + $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 */ + 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 @@ +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 */ + 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 @@ + + */ +class FundingCollection extends Collection +{ + /** + * @param array $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> $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 @@ +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 @@ +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 */ + 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 @@ + + */ +class TranscriptCollection extends Collection +{ + /** + * @param array $items + */ + final public function __construct(array $items = []) + { + parent::__construct($items); + } + + /** + * @param array $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> $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 @@ +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 + */ + 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 @@ + + */ +class TxtCollection extends Collection +{ + /** + * @param array $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> $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 @@ +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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + + + + + Podcast Feed Parser + https://github.com/phanan/podcast-feed-parser + + Thu, 02 May 2024 06:44:38 +0000 + + + https://github.com/phanan.png + Phan An + https://phanan.net + + + en-US + Rice Cooker + Phan An © 2024 + Phan An (phanan) + episodic + + + + + + no + no + + Sponsor me on GitHub + My other Open Collective + + naj3eEZaWVVY9a38uhX8FekACyhtqP4JN + S6lpp-7ZCn8-dZfGc-OoyaG + + + trailer + Hiking Treks Trailer + + + D03EEC9B-B1B4-475B-92C8-54F853FA2A22 + Tue, 8 Jan 2019 01:15:00 GMT + 1079 + false + + + full + 4 + 2 + S02 EP04 Mt. Hood, Oregon + + Tips for trekking around the tallest mountain in Oregon + + + 22BCFEBF-44FB-4A19-8229-7AC678629F57 + Tue, 07 May 2019 12:00:00 GMT + 1024 + false + + + full + 3 + 2 + S02 EP03 Bouldering Around Boulder + + We explore fun walks to climbing areas about the beautiful Colorado city of Boulder. + + + href="http://example.com/podcasts/everything/ + + BE486CAA-B3D5-4FB0-8298-EFEBE71C5982 + Tue, 30 Apr 2019 13:00:00 EST + 3627 + false + + + full + 2 + 2 + S02 EP02 Caribou Mountain, Maine + + Put your fitness to the test with this invigorating hill climb. + + + + 142FAFE9-B1DF-4F6D-BAA8-79BDBAF653A9 + Tue, 23 May 2019 02:00:00 -0700 + 2434 + false + + + full + 4 + 1 + S01 EP04 Kuliouou Ridge Trail + + Oahu, Hawaii, has some picturesque hikes and this is one of the best! + + + B5FCEB80-317C-4CD0-A84B-807065B43FB9 + Tue, 27 Nov 2018 01:15:00 +0000 + 929 + false + + + full + 3 + 1 + S01 EP03 Blood Mountain Loop + + Hiking the Appalachian Trail and Freeman Trail in Georgia + + + F0C5D763-ED85-4449-9C09-81FEBDF6F126 + Tue, 23 Oct 2018 01:15:00 +0000 + 1440 + false + + + full + 2 + 1 + S01 EP02 Garden of the Gods Wilderness + + Wilderness Area Garden of the Gods in Illinois is a delightful spot for + an extended hike. + + + 821DD0B2-571D-4DFD-8E11-556E8C1EFE6A + Tue, 18 Sep 2018 01:15:00 +0000 + 839 + false + + + full + 1 + 1 + S01 EP01 Upper Priest Lake Trail to Continental Creek Trail + + We check out this powerfully scenic hike following the river in the Idaho + Panhandle National Forests. + + + EABDA7EE-1AC6-4B60-9E11-6B3F30B72F87 + Tue, 14 Aug 2018 01:15:00 +0000 + 1399 + false + + +