From df1e922ae6206944e55731e17791206aed35757d Mon Sep 17 00:00:00 2001 From: Yorda Date: Tue, 27 Jun 2023 11:34:51 -0600 Subject: [PATCH] Initial Release :art: --- .github/workflows/dependency-review.yml | 20 + .../workflows/fix-php-code-style-issues.yml | 21 + .github/workflows/phpunit.yml | 45 + .gitignore | 3 + Dockerfile | 19 + LICENSE.md | 21 + README.md | 261 + composer.json | 57 + composer.lock | 8251 +++++++++++++++++ config/scanator.php | 22 + content/logo.png | Bin 0 -> 33946 bytes docker-compose.yml | 23 + phpunit.xml | 29 + .../ScanatorConfigurationContract.php | 7 + .../ScanatorSqlConfiguration.php | 104 + src/Scanator.php | 21 + src/ScanatorProvider.php | 52 + src/Services/ScanatorService.php | 165 + src/Services/ScanatorServiceContract.php | 15 + src/Support/Detection.php | 73 + src/Support/DetectionManager.php | 34 + tests/Mocks/DirtyExampleSampleResponse.json | 30 + tests/Mocks/ExampleSampleResponse.json | 30 + .../SelectInformationSchemaResponse.json | 316 + tests/TestCase.php | 68 + tests/Unit/Services/ScanatorServiceTest.php | 77 + tests/Unit/Support/DetectionManagerTest.php | 58 + 27 files changed, 9822 insertions(+) create mode 100644 .github/workflows/dependency-review.yml create mode 100644 .github/workflows/fix-php-code-style-issues.yml create mode 100644 .github/workflows/phpunit.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/scanator.php create mode 100644 content/logo.png create mode 100644 docker-compose.yml create mode 100644 phpunit.xml create mode 100644 src/Configurations/ScanatorConfigurationContract.php create mode 100644 src/Configurations/ScanatorSqlConfiguration.php create mode 100644 src/Scanator.php create mode 100644 src/ScanatorProvider.php create mode 100644 src/Services/ScanatorService.php create mode 100644 src/Services/ScanatorServiceContract.php create mode 100644 src/Support/Detection.php create mode 100644 src/Support/DetectionManager.php create mode 100644 tests/Mocks/DirtyExampleSampleResponse.json create mode 100644 tests/Mocks/ExampleSampleResponse.json create mode 100644 tests/Mocks/SelectInformationSchemaResponse.json create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/Services/ScanatorServiceTest.php create mode 100644 tests/Unit/Support/DetectionManagerTest.php diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..fe461b4 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,20 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v3 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v2 diff --git a/.github/workflows/fix-php-code-style-issues.yml b/.github/workflows/fix-php-code-style-issues.yml new file mode 100644 index 0000000..7c98ad9 --- /dev/null +++ b/.github/workflows/fix-php-code-style-issues.yml @@ -0,0 +1,21 @@ +name: Linter + +on: [push] + +jobs: + php-code-styling: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + + - name: Fix PHP code style issues + uses: aglipanci/laravel-pint-action@0.1.0 + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Fix styling diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml new file mode 100644 index 0000000..0924a81 --- /dev/null +++ b/.github/workflows/phpunit.yml @@ -0,0 +1,45 @@ +name: phpunit + +on: + push: + pull_request: + +jobs: + run-tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: [8.1, 8.2] + laravel: [9.*, 10.*] + include: + - laravel: 10.* + testbench: 8 + - laravel: 9.* + testbench: 7.* + + name: PHP${{ matrix.php }} - Laravel ${{ matrix.laravel }} + + steps: + - name: Update apt + run: sudo apt-get update --fix-missing + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + coverage: none + + - name: Setup Problem Matches + run: | + echo "::add-matcher::${{ runner.tool_cache }}/php.json" + echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - name: Install dependencies + run: | + composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update + composer update --prefer-dist --no-interaction --no-suggest + - name: Execute tests + run: vendor/bin/phpunit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c290300 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.phpunit.result.cache +/coverage +/vendor diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..adc5899 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM php:8.1-fpm + +RUN apt-get update \ + && apt-get -y install libzip-dev zlib1g-dev git zip unzip libicu-dev g++ libbz2-dev libmemcached-dev \ + && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* \ + +RUN docker-php-ext-configure zip && docker-php-ext-install pdo pdo_mysql zip bz2 intl + +# Get latest Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Set working directory +WORKDIR /var/www + +RUN chown -R www-data:www-data /var/www + +# Expose port 9000 and start php-fpm server +EXPOSE 9000 +CMD ["php-fpm"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..fc42d68 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 YorCreative + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2109028 --- /dev/null +++ b/README.md @@ -0,0 +1,261 @@ +
+
+
+ + Logo + +
+

Laravel Scanator

+ +
+GitHub license +GitHub stars +GitHub issues +GitHub forks +PHPUnit +
+ +A Laravel package that provides functionalities for detecting sensitive information and patterns in the database, helping to ensure data privacy and security by empowering developers to easily integrate database scanning capabilities into their applications and take proactive measures to protect sensitive data. + +## Installation + +install the package via composer: + +```bash +composer require yorcreative/laravel-scanator +``` + +Publish the assets. + +```bash +php artisan vendor:publish --provider="YorCreative\Scanator\ScanatorServiceProvider" +php artisan vendor:publish --provider="YorCreative\Scanator\ScrubberServiceProvider" +``` + +## Configuration + +### Adjusting the Scanators Configuration File + +Adjust the configuration file to suite your application, located in `/config/scanator.php`. + +```php +return [ + 'sql' => [ + 'ignore_tables' => [ + 'failed_jobs', + 'migrations' + ], + 'ignore_columns' => [ + 'id', + 'created_at', + 'updated_at' + ], + 'ignore_types' => [ + 'timestamp' + ], + 'select' => [ + 'low_limit' => 3, + 'high_limit' => 10 + ], + ] +]; +``` + +### Adjusting the Scrubber Configuration File + +Adjust the `regex_loader` field to suite your application, located in `/config/scrubber.php`. +For more information on the Scrubber configuration file, please see the source documentation [here](https://github.com/YorCreative/Laravel-Scrubber). + +```php +return [ + ... + 'regex_loader' => ['*'], // Opt-in to specific regex classes OR include all with * wildcard. + ... +]; +``` + +## Usage + +This package is shipped without implementation. It is shipped as a tool and up to developers to choose how they implement to suite to applications needs. + +### Detection Manager + +The [DetectionManager](https://github.com/YorCreative/Laravel-Scanator/blob/dev/src/Support/DetectionManager.php#L8) +class is an essential component of the Laravel Scanator package. It manages and stores the [Detections](https://github.com/YorCreative/Laravel-Scanator/blob/dev/src/Support/Detection.php#L9) during the scanning process. +It provides methods to record detections, retrieve the list of detections, and obtain the scan start time. + +### Full Database Scan +This package ships with the ability to analyze and build out database schema and then scans for sensitive +information excluding any tables, columns or types from the Scanator configuration file finally to return the +Detection Manager class. + +```php +$detectionManager = Scanator::init(); + +$detections = $detectionManager->getDetections(); +``` + +### Selective Database Scan + +This package ships with the ability to selectively scan tables. + +```php +$detectionManager = new DetectionManager(); + +Scanator::analyze($detectionManager, 'table_name', ['columns', 'to', 'scan']); + +$detections = $detectionManager->getDetections(); +``` + +### Defining Excludable Tables + +The configuration file of this package offers the functionality to define excludable tables, allowing you to exclude them from the scanning process. + + +```php + 'ignore_tables' => [ + 'failed_jobs', + 'migrations' +], +``` + +### Defining Excludable Columns + +Similarly, you can define excludable columns within the configuration file to prevent the package from scanning them. + +```php +'ignore_columns' => [ + 'id', + 'created_at', + 'updated_at' +], +``` + +### Defining Excludable Data Types + +To further refine the scanning process, you can specify excludable data types in the configuration file. +The package will then disregard these data types during scanning. + +```php + 'ignore_types' => [ + 'timestamp' +], +``` + +### Defining Sample Size + +For greater control over the scanning procedure, the configuration file allows you to define the sample size extracted +from each table. + +```php +'select' => [ + 'low_limit' => 3, + 'high_limit' => 10 +], +``` + +## Scrubber Documentation + +This package builds on the [RegexRepository](https://github.com/YorCreative/Laravel-Scrubber/blob/main/src/Scrubber.php#L17) provided by the scrubber package. For complete documentation on the scrubber, see [here](https://github.com/YorCreative/Laravel-Scrubber) + +### Regex Class Opt-in + +You have the ability through the scrubber configuration file to define what regex classes you want loaded into the application +when it is bootstrapped. By default, this package ships with a wildcard value. + +### Regex Collection & Defining Opt-in + +To opt in, utilize the static properties on +the [RegexCollection](https://github.com/YorCreative/Laravel-Scrubber/blob/main/src/Repositories/RegexCollection.php) +class. + +```php + 'regex_loader' => [ + RegexCollection::$GOOGLE_API, + RegexCollection::$AUTHORIZATION_BEARER, + RegexCollection::$CREDIT_CARD_AMERICAN_EXPRESS, + RegexCollection::$CREDIT_CARD_DISCOVER, + RegexCollection::$CREDIT_CARD_VISA, + RegexCollection::$JSON_WEB_TOKEN + ], +``` + +### Creating Custom Extended Classes + +The Scrubber package ships with a command to create custom extended classes and allows further refining of database scans for the Scanator. + +```bash +php artisan make:regex-class {name} +``` + +This command will create a stubbed out class in `App\Scrubber\RegexCollection`. The Scrubber package will autoload +everything from the `App\Scrubber\RegexCollection` folder with the wildcard value on the `regex_loader` array in the +scrubber config file. You will need to provide a `Regex Pattern` and a `Testable String` for the class. + +### Opting Into Custom Extended Classes + +The `regex_loader` array takes strings, not objects. To opt in to specific custom extended regex classes, define the +class name as a string. + +For example if I have a custom extended class as such: + +```php + [ + RegexCollection::$GOOGLE_API, + RegexCollection::$AUTHORIZATION_BEARER, + RegexCollection::$CREDIT_CARD_AMERICAN_EXPRESS, + RegexCollection::$CREDIT_CARD_DISCOVER, + RegexCollection::$CREDIT_CARD_VISA, + RegexCollection::$JSON_WEB_TOKEN, + 'TestRegex' + ], +``` + +## Testing + +```bash +composer test +``` + +## Credits + +- [Yorda](https://github.com/yordadev) +- [All Scanator Contributors](../../contributors) +- [All Scrubber Contributors](https://github.com/YorCreative/Laravel-Scrubber/graphs/contributors) + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..2345b49 --- /dev/null +++ b/composer.json @@ -0,0 +1,57 @@ +{ + "name": "yorcreative/laravel-scanator", + "description": "A Laravel package that provides functionalities for detecting sensitive information and patterns in the database, helping to ensure data privacy and security by empowering developers to easily integrate database scanning capabilities into their applications and take proactive measures to protect sensitive data.", + "type": "library", + "license": "MIT", + "keywords": [ + "laravel", + "framework", + "scanator", + "database detection", + "sensitive information detection", + "secret detection", + "data privacy", + "security", + "developers", + "database scanning", + "protect sensitive data", + "application security", + "proactive measures", + "data protection", + "data security" + ], + "minimum-stability": "dev", + "require": { + "php": "^8.1", + "illuminate/contracts": "^v9|v10.*", + "yorcreative/laravel-scrubber": "v2.6.2" + }, + "require-dev": { + "ext-pdo_sqlite": "*", + "laravel/pint": "^1.0", + "orchestra/testbench": "*", + "phpunit/phpunit": "^9.5" + }, + "autoload": { + "psr-4": { + "YorCreative\\Scanator\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "YorCreative\\Scanator\\Tests\\": "tests" + } + }, + "scripts": { + "coverage": "vendor/bin/phpunit --coverage-html=coverage", + "lint": "vendor/bin/pint", + "test": "vendor/bin/phpunit" + }, + "extra": { + "laravel": { + "providers": [ + "YorCreative\\Scanator\\ScanatorProvider" + ] + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..5a28882 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8251 @@ +{ + "_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": "eb6edb1eeb4470d02a754a4d9b932849", + "packages": [ + { + "name": "brick/math", + "version": "v0.11.x-dev", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "8d60a347dd96c2c748f8993300a27d079a53144a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/8d60a347dd96c2c748f8993300a27d079a53144a", + "reference": "8d60a347dd96c2c748f8993300a27d079a53144a", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.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", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/v0.11" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:12:38+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "dev-main", + "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" + }, + "default-branch": true, + "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.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "d62dadcaaf16432c7c1364bf50be9e03f26ff043" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/d62dadcaaf16432c7c1364bf50be9e03f26ff043", + "reference": "d62dadcaaf16432c7c1364bf50be9e03f26ff043", + "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.1.x" + }, + "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": "2023-06-16T13:41:28+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "84a527db05647743d50373e0ec53a152f2cde568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "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.x" + }, + "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": "2022-12-15T16:57:16+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "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.2" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "27be0e7157333887136b9e02303c263065a7246b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/27be0e7157333887136b9e02303c263065a7246b", + "reference": "27be0e7157333887136b9e02303c263065a7246b", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "default-branch": true, + "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.x" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-06-07T14:47:52+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "bb96f0246364ea36d4d22364a39023a7e2974fc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/bb96f0246364ea36d4d22364a39023a7e2974fc8", + "reference": "bb96f0246364ea36d4d22364a39023a7e2974fc8", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "default-branch": true, + "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/master" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-10-31T13:41:40+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "60c5f57bee20beb1a4a3cc5fe9170de4a64521d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/60c5f57bee20beb1a4a3cc5fe9170de4a64521d2", + "reference": "60c5f57bee20beb1a4a3cc5fe9170de4a64521d2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "default-branch": true, + "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/1.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-02-25T23:46:23+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.7.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "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.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "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" + }, + "default-branch": true, + "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.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-05-21T14:04:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "4a94655427efd6906ed3eb628c79693291264713" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/4a94655427efd6906ed3eb628c79693291264713", + "reference": "4a94655427efd6906ed3eb628c79693291264713", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "default-branch": true, + "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" + }, + "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-05-21T19:15:14+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "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.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "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.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:11:26+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "1.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "a6a9904f03493b36f97f2f5cba20127d2e264bb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/a6a9904f03493b36f97f2f5cba20127d2e264bb3", + "reference": "a6a9904f03493b36f97f2f5cba20127d2e264bb3", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "default-branch": true, + "type": "library", + "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/1.0" + }, + "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-05-21T13:12:22+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.14.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "285cdd86a4beb433513b38f41a89b510e0724a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/285cdd86a4beb433513b38f41a89b510e0724a3e", + "reference": "285cdd86a4beb433513b38f41a89b510e0724a3e", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "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/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.62.1", + "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.2", + "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": { + "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", + "orchestra/testbench-core": "^8.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpdoc-parser": "^1.15", + "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" + }, + "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/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": "2023-06-27T13:26:12+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "5c1e047e38fee0cb8fbbe1ed4439ebfd96f64986" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/5c1e047e38fee0cb8fbbe1ed4439ebfd96f64986", + "reference": "5c1e047e38fee0cb8fbbe1ed4439ebfd96f64986", + "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" + }, + "default-branch": true, + "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-04-08T16:37:35+00:00" + }, + { + "name": "league/commonmark", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "4aec9f51ec30efd59164d2a2bd649171b8893c05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4aec9f51ec30efd59164d2a2bd649171b8893c05", + "reference": "4aec9f51ec30efd59164d2a2bd649171b8893c05", + "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.0", + "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", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.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": "2023-06-23T16:17:35+00:00" + }, + { + "name": "league/config", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "fbb4c4ab01d6d14a6db46923671bb1c2ee5b6691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/fbb4c4ab01d6d14a6db46923671bb1c2ee5b6691", + "reference": "fbb4c4ab01d6d14a6db46923671bb1c2ee5b6691", + "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" + }, + "default-branch": true, + "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": "2023-01-23T04:23:14+00:00" + }, + { + "name": "league/flysystem", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "b4d2b9d820cce156ed8daa997d467e290aafb9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b4d2b9d820cce156ed8daa997d467e290aafb9a8", + "reference": "b4d2b9d820cce156ed8daa997d467e290aafb9a8", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "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", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", + "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.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "default-branch": true, + "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.x" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-06-13T13:41:34+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/543f64c397fefdf9cfeac443ffb6beff602796b3", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "default-branch": true, + "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": { + "issues": "https://github.com/thephpleague/flysystem-local/issues", + "source": "https://github.com/thephpleague/flysystem-local/tree/3.15.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2023-05-02T20:02:14+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "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.11.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "monolog/monolog", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "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.1", + "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" + }, + "default-branch": true, + "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.4.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-06-21T08:46:11+00:00" + }, + { + "name": "nesbot/carbon", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "8e75661c0f78371d8fddc77f9af181ed501acc26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8e75661c0f78371d8fddc77f9af181ed501acc26", + "reference": "8e75661c0f78371d8fddc77f9af181ed501acc26", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "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" + }, + "default-branch": true, + "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": "2023-06-09T20:08:09+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "b6b3f41ea96ebf082657d271d9b1bac6071d7d29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/b6b3f41ea96ebf082657d271d9b1bac6071d7d29", + "reference": "b6b3f41ea96ebf082657d271d9b1bac6071d7d29", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-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.2" + }, + "time": "2022-12-21T00:59:21+00:00" + }, + { + "name": "nette/utils", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "0a94bd77ff1775e039aa4416abc9807d12c198ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/0a94bd77ff1775e039aa4416abc9807d12c198ba", + "reference": "0a94bd77ff1775e039aa4416abc9807d12c198ba", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.3" + }, + "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()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "default-branch": true, + "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/master" + }, + "time": "2023-04-07T14:16:07+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": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "default-branch": true, + "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.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/container", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "90db7b9ac2a2c5b849fcb69dde58f3ae182c68f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/90db7b9ac2a2c5b849fcb69dde58f3ae182c68f5", + "reference": "90db7b9ac2a2c5b849fcb69dde58f3ae182c68f5", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "default-branch": true, + "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/master" + }, + "time": "2022-07-19T17:36:59+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "e275e2d67d53964a3f13e056886ecd769edee021" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/e275e2d67d53964a3f13e056886ecd769edee021", + "reference": "e275e2d67d53964a3f13e056886ecd769edee021", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "suggest": { + "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" + }, + "default-branch": true, + "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": "https://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "source": "https://github.com/php-fig/event-dispatcher/tree/master" + }, + "time": "2022-06-29T17:22:39+00:00" + }, + { + "name": "psr/http-client", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "default-branch": true, + "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/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "6d70f402f0eddb2b154b22950b5381bbf5b28469" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/6d70f402f0eddb2b154b22950b5381bbf5b28469", + "reference": "6d70f402f0eddb2b154b22950b5381bbf5b28469", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "default-branch": true, + "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/tree/master" + }, + "time": "2023-05-17T18:32:11+00:00" + }, + { + "name": "psr/http-message", + "version": "dev-master", + "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" + }, + "default-branch": true, + "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": "dev-master", + "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" + }, + "default-branch": true, + "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": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "2d280c2aaa23a120f35d55cfde8581954a8e77fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/2d280c2aaa23a120f35d55cfde8581954a8e77fa", + "reference": "2d280c2aaa23a120f35d55cfde8581954a8e77fa", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "default-branch": true, + "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/master" + }, + "time": "2022-04-08T16:41:45+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.x-dev", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "bef858d57e5ede26bae2e2f2b51b21fd7f6e7590" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/bef858d57e5ede26bae2e2f2b51b21fd7f6e7590", + "reference": "bef858d57e5ede26bae2e2f2b51b21fd7f6e7590", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "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." + }, + "default-branch": true, + "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.x" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-05-29T22:02:16+00:00" + }, + { + "name": "symfony/console", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "7f16bd3b4ae06c1f9c054ab0139d4cd8dc4a09b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/7f16bd3b4ae06c1f9c054ab0139d4cd8dc4a09b0", + "reference": "7f16bd3b4ae06c1f9c054ab0139d4cd8dc4a09b0", + "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/lock": "^5.4|^6.0|^7.0", + "symfony/process": "^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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-23T17:06:40+00:00" + }, + { + "name": "symfony/css-selector", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", + "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", + "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.3.0-RC1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-03-20T16:43:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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.3.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/error-handler", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d7d32da07f73cc0742d1ffac9116e746bbeb26d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d7d32da07f73cc0742d1ffac9116e746bbeb26d0", + "reference": "d7d32da07f73cc0742d1ffac9116e746bbeb26d0", + "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" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0|^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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T16:34:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9ebe352542105f5f7186610a83deb18b90fae3d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9ebe352542105f5f7186610a83deb18b90fae3d3", + "reference": "9ebe352542105f5f7186610a83deb18b90fae3d3", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T16:34:37+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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.3.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "1bb60aa99f06979e6078007a812eb7c5ffc8efc2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/1bb60aa99f06979e6078007a812eb7c5ffc8efc2", + "reference": "1bb60aa99f06979e6078007a812eb7c5ffc8efc2", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T16:34:37+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6e86c2439a735f0fa9748c879c7a71df3175e842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6e86c2439a735f0fa9748c879c7a71df3175e842", + "reference": "6e86c2439a735f0fa9748c879c7a71df3175e842", + "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.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0|^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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-24T11:52:37+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "22e35a21edbcb3582446c74ffcbf19d94447b8bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/22e35a21edbcb3582446c74ffcbf19d94447b8bf", + "reference": "22e35a21edbcb3582446c74ffcbf19d94447b8bf", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.2.7|^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.3", + "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": "<5.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.3|^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.3|^7.0", + "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.3|^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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-24T11:52:37+00:00" + }, + { + "name": "symfony/mailer", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "9bca4bd63f3739fb1199fa537ac8f09fef17dacc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/9bca4bd63f3739fb1199fa537ac8f09fef17dacc", + "reference": "9bca4bd63f3739fb1199fa537ac8f09fef17dacc", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-03T15:11:12+00:00" + }, + { + "name": "symfony/mime", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "85738201628bd45a7d8ee6e91d0c8b4346aa04a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/85738201628bd45a7d8ee6e91d0c8b4346aa04a8", + "reference": "85738201628bd45a7d8ee6e91d0c8b4346aa04a8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.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/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-03T15:11:12+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:30:37+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "f9c7affe77a00ae32ca127ca6833d034e6d33f25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f9c7affe77a00ae32ca127ca6833d034e6d33f25", + "reference": "f9c7affe77a00ae32ca127ca6833d034e6d33f25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-30T17:25:47+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "4d30d60ba762ce6792e014576b57fa48ad5c5a68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/4d30d60ba762ce6792e014576b57fa48ad5c5a68", + "reference": "4d30d60ba762ce6792e014576b57fa48ad5c5a68", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + } + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "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.3.0-RC1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-19T08:06:44+00:00" + }, + { + "name": "symfony/routing", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "d02d2c4bfc9e5bac947a675e893c13ac9031f902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/d02d2c4bfc9e5bac947a675e893c13ac9031f902", + "reference": "d02d2c4bfc9e5bac947a675e893c13ac9031f902", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-20T10:37:57+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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.3.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/string", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "89bc6d5dcc94c89781e1f986e4d01b7ee91d684b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/89bc6d5dcc94c89781e1f986e4d01b7ee91d684b", + "reference": "89bc6d5dcc94c89781e1f986e4d01b7ee91d684b", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T16:34:37+00:00" + }, + { + "name": "symfony/translation", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "1676865fc8c50f0c64d4c560984fbff0d5befe20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/1676865fc8c50f0c64d4c560984fbff0d5befe20", + "reference": "1676865fc8c50f0c64d4c560984fbff0d5befe20", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.13", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-26T07:26:49+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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.3.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": "2023-05-30T17:17:10+00:00" + }, + { + "name": "symfony/uid", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "cfdc9354fa05db01e86ba18c8ed5bf93153d2fb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/cfdc9354fa05db01e86ba18c8ed5bf93153d2fb0", + "reference": "cfdc9354fa05db01e86ba18c8ed5bf93153d2fb0", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T16:34:37+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "4415fa3b61b7259aca2bf925ab97c03865072ac5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4415fa3b61b7259aca2bf925ab97c03865072ac5", + "reference": "4415fa3b61b7259aca2bf925ab97c03865072ac5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-21T12:09:04+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "416a55b7b527db57e323f5fefa77e2492b64a0b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/416a55b7b527db57e323f5fefa77e2492b64a0b6", + "reference": "416a55b7b527db57e323f5fefa77e2492b64a0b6", + "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" + }, + "default-branch": true, + "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/master" + }, + "time": "2023-05-30T10:13:11+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "default-branch": true, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-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.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2022-10-16T01:01:54+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" + }, + { + "name": "yorcreative/laravel-scrubber", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/YorCreative/Laravel-Scrubber.git", + "reference": "cd084cf9ed2cb39664d32690f0c8afdafbf8c421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/YorCreative/Laravel-Scrubber/zipball/cd084cf9ed2cb39664d32690f0c8afdafbf8c421", + "reference": "cd084cf9ed2cb39664d32690f0c8afdafbf8c421", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.4.5", + "illuminate/contracts": "^9.0|^10.0", + "monolog/monolog": "^2.0|^3", + "php": "^8.1" + }, + "require-dev": { + "ext-pdo_sqlite": "*", + "laravel/pint": "^1.0", + "orchestra/testbench": "^7.0|^8.4", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "YorCreative\\Scrubber\\ScrubberServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "YorCreative\\Scrubber\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A laravel package that scrubs sensitive information for you.", + "keywords": [ + "framework", + "laravel", + "laravel log scrubber", + "log scrub", + "scrub logs", + "scrub sensitive information", + "scrubber", + "secret scrubber", + "senstive information scrubber" + ], + "support": { + "issues": "https://github.com/YorCreative/Laravel-Scrubber/issues", + "source": "https://github.com/YorCreative/Laravel-Scrubber/tree/v2.6.2" + }, + "time": "2023-06-23T22:52:04+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "3aa0a786dd096763a5e4be2cc3bacb774859552a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/3aa0a786dd096763a5e4be2cc3bacb774859552a", + "reference": "3aa0a786dd096763a5e4be2cc3bacb774859552a", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^10.1.0", + "vimeo/psalm": "^5.4" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2023-05-30T06:43:41+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "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", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "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.0" + }, + "time": "2023-06-12T08:44:38+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "d34238d1651eb62fc39ab4efe26df74dc293ebbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/d34238d1651eb62fc39ab4efe26df74dc293ebbb", + "reference": "d34238d1651eb62fc39ab4efe26df74dc293ebbb", + "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" + }, + "default-branch": true, + "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/master" + }, + "time": "2022-11-06T05:05:05+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.10.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "c472786bca01e4812a9bb7933b23edfc5b6877b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/c472786bca01e4812a9bb7933b23edfc5b6877b7", + "reference": "c472786bca01e4812a9bb7933b23edfc5b6877b7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.18.0", + "illuminate/view": "^10.5.1", + "laravel-zero/framework": "^10.0.2", + "mockery/mockery": "^1.5.1", + "nunomaduro/larastan": "^2.5.1", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.4.0" + }, + "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": "2023-06-20T15:55:03+00:00" + }, + { + "name": "mockery/mockery", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "bb805e3017b14ae361338fde78dd03b23378ef4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/bb805e3017b14ae361338fde78dd03b23378ef4d", + "reference": "bb805e3017b14ae361338fde78dd03b23378ef4d", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3", + "psalm/plugin-phpunit": "^0.18", + "vimeo/psalm": "^5.9" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.6.x-dev" + } + }, + "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": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "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": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/main" + }, + "time": "2023-06-07T09:18:36+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "928a96f585b86224ebc78f8f09d0482cf15b04f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/928a96f585b86224ebc78f8f09d0482cf15b04f5", + "reference": "928a96f585b86224ebc78f8f09d0482cf15b04f5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "default-branch": true, + "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.x" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T17:24:01+00:00" + }, + { + "name": "nikic/php-parser", + "version": "4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "default-branch": true, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-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/v4.16.0" + }, + "time": "2023-06-25T14:52:30+00:00" + }, + { + "name": "orchestra/testbench", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "c669d2cb6dc869f98d299c5dbf600051ba6deb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/c669d2cb6dc869f98d299c5dbf600051ba6deb3e", + "reference": "c669d2cb6dc869f98d299c5dbf600051ba6deb3e", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.21", + "laravel/framework": ">=10.14.0 <10.15.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": ">=8.5.7 <8.6.0", + "php": "^8.1", + "phpunit/phpunit": "^9.6 || ^10.1", + "spatie/laravel-ray": "^1.32.4", + "symfony/process": "^6.2", + "symfony/yaml": "^6.2", + "vlucas/phpdotenv": "^5.4.1" + }, + "default-branch": true, + "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.5.9" + }, + "time": "2023-06-27T13:42:07+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v8.5.8", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "c9c36e8ef9a8b91cbcc85f629be5ff3670133737" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/c9c36e8ef9a8b91cbcc85f629be5ff3670133737", + "reference": "c9c36e8ef9a8b91cbcc85f629be5ff3670133737", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.1" + }, + "require-dev": { + "fakerphp/faker": "^1.21", + "laravel/framework": "^10.13.5", + "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 tresting (^6.4 || ^7.1.4).", + "fakerphp/faker": "Allow using Faker for testing (^1.21).", + "laravel/framework": "Required for testing (^10.13.5).", + "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/yaml": "Required for CLI Commander (^6.2).", + "vlucas/phpdotenv": "Required for CLI Commander (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/helpers.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": "2023-06-22T05:28:42+00:00" + }, + { + "name": "phar-io/manifest", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "67729272c564ab9f953c81f48db44e8b1cb1e1c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/67729272c564ab9f953c81f48db44e8b1cb1e1c3", + "reference": "67729272c564ab9f953c81f48db44e8b1cb1e1c3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.3 || ^8.0" + }, + "default-branch": true, + "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/master" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-06-01T14:19:47+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "8a507b131b8f7747f670116d749983737405940a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/8a507b131b8f7747f670116d749983737405940a", + "reference": "8a507b131b8f7747f670116d749983737405940a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "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-master": "9.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 that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-06-26T07:35:23+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "38b24367e1b340aa78b96d7cab042942d917bb84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/38b24367e1b340aa78b96d7cab042942d917bb84", + "reference": "38b24367e1b340aa78b96d7cab042942d917bb84", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-11T16:23:04+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.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/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9683af405df064cf17fa2d43d40380978daf0801" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9683af405df064cf17fa2d43d40380978daf0801", + "reference": "9683af405df064cf17fa2d43d40380978daf0801", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1 || ^2", + "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": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-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/9.6" + }, + "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": "2023-06-26T07:25:57+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": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "b247957a1c8dc81a671770f74b479c0a78a818f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b247957a1c8dc81a671770f74b479c0a78a818f1", + "reference": "b247957a1c8dc81a671770f74b479c0a78a818f1", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:46:14+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-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", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.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": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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": "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", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.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/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "20bdda85c7c585ab265c0c37ec052a019bae29c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/20bdda85c7c585ab265c0c37ec052a019bae29c4", + "reference": "20bdda85c7c585ab265c0c37ec052a019bae29c4", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "default-branch": true, + "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": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/main" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-03-25T08:11:39+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "47794d19e3215ace9e005a8f200cd7cc7be52572" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/47794d19e3215ace9e005a8f200cd7cc7be52572", + "reference": "47794d19e3215ace9e005a8f200cd7cc7be52572", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "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.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-13T14:35:04+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.32.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "288f30c94c9725dfd78d8a1b82b230521f4d697e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/288f30c94c9725dfd78d8a1b82b230521f4d697e", + "reference": "288f30c94c9725dfd78d8a1b82b230521f4d697e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0", + "php": "^7.4|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.37", + "symfony/stopwatch": "4.2|^5.1|^6.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", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/pest-plugin-snapshots": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.29.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.32.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-23T07:04:32+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.37.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "dea16182d4bc9d9833adec7e39fbb3d7b553425d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/dea16182d4bc9d9833adec7e39fbb3d7b553425d", + "reference": "dea16182d4bc9d9833adec7e39fbb3d7b553425d", + "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", + "symfony/var-dumper": "^4.2|^5.1|^6.0" + }, + "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", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "type": "library", + "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.37.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-05-17T06:35:47+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1", + "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "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/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "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.3.0-RC1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-16T10:14:28+00:00" + }, + { + "name": "symfony/yaml", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "7a0d2073505b0c9016ff9cae179f93f76d4489b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7a0d2073505b0c9016ff9cae179f93f76d4489b1", + "reference": "7a0d2073505b0c9016ff9cae179f93f76d4489b1", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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/6.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-03T15:11:12+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "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.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/20b3e48eb799537683780bc8782fbbe9bc25934a", + "reference": "20b3e48eb799537683780bc8782fbbe9bc25934a", + "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": "2023-02-14T22:58:03+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "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": "<=9.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.0" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2023-01-11T23:05:44+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": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": { + "ext-pdo_sqlite": "*" + }, + "plugin-api-version": "2.3.0" +} diff --git a/config/scanator.php b/config/scanator.php new file mode 100644 index 0000000..6d6ebec --- /dev/null +++ b/config/scanator.php @@ -0,0 +1,22 @@ + [ + 'ignore_tables' => [ + 'failed_jobs', + 'migrations', + ], + 'ignore_columns' => [ + 'id', + 'created_at', + 'updated_at', + ], + 'ignore_types' => [ + 'timestamp', + ], + 'select' => [ + 'low_limit' => 3, + 'high_limit' => 10, + ], + ], +]; diff --git a/content/logo.png b/content/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ed07a9eba93cfd90ddfc9be55be511f64a615b GIT binary patch literal 33946 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 B5c&WB literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..76fe715 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3' + +services: + #PHP Service + laravel-scrubber: + build: + context: "" + dockerfile: Dockerfile + container_name: laravel-scanator + tty: true + environment: + SERVICE_NAME: laravel-scanator + SERVICE_TAGS: dev + working_dir: /var/www + volumes: + - .:/var/www + networks: + - yorcreative + +networks: + yorcreative: + driver: bridge + diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..8c85337 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,29 @@ + + + + + ./tests/Unit + + + + + ./src + + + + + + + + + + + + + + + diff --git a/src/Configurations/ScanatorConfigurationContract.php b/src/Configurations/ScanatorConfigurationContract.php new file mode 100644 index 0000000..c4082d5 --- /dev/null +++ b/src/Configurations/ScanatorConfigurationContract.php @@ -0,0 +1,7 @@ +getSqlLimitLow().','.$this->getSqlLimitHigh(); + } + + public function getSqlLimitLow(): int + { + return $this->sql_limit_low; + } + + public function setSqlLimitLow(int $sql_limit_low): self + { + $this->sql_limit_low = $sql_limit_low; + + return $this; + } + + public function getSqlLimitHigh(): int + { + return $this->sql_limit_high; + } + + public function setSqlLimitHigh(int $sql_limit_high): self + { + $this->sql_limit_high = $sql_limit_high; + + return $this; + } + + public function getSqlIgnoreTypes(): array + { + return $this->sql_ignore_types; + } + + public function setSqlIgnoreTypes(array $sql_ignore_types): self + { + $this->sql_ignore_types = $sql_ignore_types; + + return $this; + } + + public function getSqlIgnoreColumns(): array + { + return $this->sql_ignore_columns; + } + + public function setSqlIgnoreColumns(array $sql_ignore_columns): self + { + $this->sql_ignore_columns = $sql_ignore_columns; + + return $this; + } + + public function getSqlIgnoreTables(): array + { + return $this->sql_ignore_tables; + } + + public function setSqlIgnoreTables(array $sql_ignore_tables): self + { + $this->sql_ignore_tables = $sql_ignore_tables; + + return $this; + } +} diff --git a/src/Scanator.php b/src/Scanator.php new file mode 100644 index 0000000..e451ac3 --- /dev/null +++ b/src/Scanator.php @@ -0,0 +1,21 @@ +app->singleton(ScanatorServiceContract::class, function (Application $app) { + // @todo add more database configurations and pivot what configuration is built + $config = (new ScanatorSqlConfiguration()) + ->setSqlIgnoreColumns(config('scanator.sql.ignore_columns')) + ->setSqlIgnoreTables(config('scanator.sql.ignore_tables')) + ->setSqlIgnoreTypes(config('scanator.sql.ignore_types')) + ->setSqlLimitHigh(config('scanator.sql.select.high_limit')) + ->setSqlLimitLow(config('scanator.sql.select.low_limit')); + + return new ScanatorService( + $app->make(ConnectionInterface::class), + ScrubberService::getRegexRepository(), + $config + ); + }); + } + + public function register() + { + $this->mergeConfigFrom(dirname(__DIR__, 1).'/config/scanator.php', 'scanator'); + + $this->app->register(ScrubberServiceProvider::class); + + $this->publishes([ + dirname(__DIR__, 1).'/config' => base_path('config'), + ]); + } + + public function provides() + { + return [ + ScanatorServiceContract::class, + ]; + } +} diff --git a/src/Services/ScanatorService.php b/src/Services/ScanatorService.php new file mode 100644 index 0000000..f7053a7 --- /dev/null +++ b/src/Services/ScanatorService.php @@ -0,0 +1,165 @@ +each(function (array $table) use (&$manager) { + $column_names = array_column($table['columns'], 'column_name'); + self::analyze($manager, $table['table_name'], $column_names); + }); + + return $manager; + } + + protected function retrieveSchema(): Collection + { + $database_name = $this->db_connection->getDatabaseName(); + + $tables = $this->db_connection->select($this->scanator_config->getSqlSchemaQuery(), [$database_name]); + + $tables_with_columns = []; + + foreach ($tables as $table) { + + if ($this->isTableIgnorable($table_name = $table->TABLE_NAME)) { + continue; + } + + if (! $this->hasTableAlready($tables_with_columns, $table_name)) { + $tables_with_columns[$table_name] = [ + 'table_name' => $table_name, + 'columns' => [], + ]; + } + + if ($this->isColumnAndDataTypeIgnorable($table)) { + continue; + } + + $tables_with_columns[$table_name]['columns'][$columnName = $table->COLUMN_NAME] = [ + 'column_name' => $columnName, + 'data_type' => $table->DATA_TYPE, + 'character_maximum_length' => $table->CHARACTER_MAXIMUM_LENGTH, + 'column_default' => $table->COLUMN_DEFAULT, + 'is_nullable' => $table->IS_NULLABLE === 'YES', + ]; + } + + return new Collection(array_values($tables_with_columns)); + } + + private function hasTableAlready(array $tables, $table_name) + { + return isset($tables[$table_name]); + } + + private function isTableIgnorable($table_name): bool + { + return in_array($table_name, $this->scanator_config->getSqlIgnoreTables()); + } + + private function isColumnAndDataTypeIgnorable(stdClass $table): bool + { + return + $this->isColumnIgnorable($table->COLUMN_NAME) + || $this->isDataTypeIgnorable($table->DATA_TYPE); + } + + private function isColumnIgnorable($column_name): bool + { + return ! ctype_lower($column_name) || in_array($column_name, $this->scanator_config->getSqlIgnoreColumns()); + } + + private function isDataTypeIgnorable($data_type): bool + { + return in_array($data_type, $this->scanator_config->getSqlIgnoreTypes()); + } + + public function analyze(DetectionManager &$detectionManager, string $table_name, array|string $columns = '*'): void + { + self::retrieveTestSample($table_name, $columns)->each(function (stdClass $sample) use (&$detectionManager, $table_name) { + $this->scanSample((array) $sample, $table_name, $detectionManager); + }); + } + + protected function retrieveTestSample(string $table, array|string $columns = '*'): Collection + { + if (is_array($columns)) { + $columns = implode(', ', $columns); + } + + $query = sprintf($this->scanator_config->getSqlTableSampleQuery(), $columns, $table); + $samples = $this->db_connection->select($query); + + return new Collection($samples); + } + + private function scanSample(array $sample, string $table_name, DetectionManager &$detectionManager) + { + $this->regexRepository->getRegexCollection()->each(function (RegexCollectionInterface $regexClass) use ($sample, $table_name, &$detectionManager) { + if ($this->checkSample($regexClass, json_encode($sample))) { + $column = $this->determineColumn($sample); + $detectionManager->recordDetection( + new Detection($table_name, $column, $sample[$column], $regexClass, $detectionManager->getScanStart()) + ); + } + }); + } + + /** + * @param array $sample + */ + private function checkSample(RegexCollectionInterface $regexClass, string $sample): bool + { + return $this->regexRepository::check($regexClass->getPattern(), $sample) > 0; + } + + public function determineColumn(array $sample): string + { + $confirmation = false; + $hitColumn = ''; + + foreach ($sample as $column => $value) { + if (! $confirmation) { + $this->getRegexCollection()->each(function (RegexCollectionInterface $regexClass) use (&$hitColumn, &$confirmation, $column, $value) { + if (! $confirmation) { + + if ($this->checkSample($regexClass, json_encode($value))) { + $hitColumn = $column; + $confirmation = true; + } + } + }); + } + } + + return $hitColumn; + } + + public function getRegexCollection(): Collection + { + return $this->regexRepository->getRegexCollection(); + } +} diff --git a/src/Services/ScanatorServiceContract.php b/src/Services/ScanatorServiceContract.php new file mode 100644 index 0000000..316b82c --- /dev/null +++ b/src/Services/ScanatorServiceContract.php @@ -0,0 +1,15 @@ +found_at = Carbon::now()->toDateTimeImmutable(); + } + + public function getSignature(): string + { + return md5(json_encode(['table' => $this->table, 'column' => $this->column])); + } + + public function toJson(): string + { + return json_encode($this->toArray()); + } + + public function getSample(): mixed + { + return $this->sample; + } + + public function toArray(): array + { + return [ + 'table' => $this->table, + 'column' => $this->column, + 'regex_class' => $this->regexClass, + 'found_at' => $this->found_at, + 'scan_start' => $this->scan_start, + ]; + } + + public function getColumn(): string + { + return $this->column; + } + + public function getTable(): string + { + return $this->table; + } + + public function getRegexClass(): RegexCollectionInterface + { + return $this->regexClass; + } + + public function getFoundAt(): DateTimeImmutable + { + return $this->found_at; + } + + public function getScanStart(): DateTimeImmutable + { + return $this->scan_start; + } +} diff --git a/src/Support/DetectionManager.php b/src/Support/DetectionManager.php new file mode 100644 index 0000000..349d6ff --- /dev/null +++ b/src/Support/DetectionManager.php @@ -0,0 +1,34 @@ +scan_start = Carbon::now()->toDateTimeImmutable(); + $this->detections = new Collection(); + } + + public function recordDetection(Detection $detection): void + { + $this->detections->getOrPut($detection->getSignature(), $detection); + } + + public function getDetections(): Collection + { + return $this->detections; + } + + public function getScanStart(): \DateTimeImmutable + { + return $this->scan_start; + } +} diff --git a/tests/Mocks/DirtyExampleSampleResponse.json b/tests/Mocks/DirtyExampleSampleResponse.json new file mode 100644 index 0000000..38a2037 --- /dev/null +++ b/tests/Mocks/DirtyExampleSampleResponse.json @@ -0,0 +1,30 @@ +[ + { + "id": 1203, + "string": "EAACEdEose0cBAdSAIzs2npcdqDa3vThXNiQx5JVD15rGwW", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1204, + "string": "EAACEdEose0cBAdSAIzs2npcdqDa3vThXNiQx5JVD15rGwW", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1205, + "string": "EAACEdEose0cBAdSAIzs2npcdqDa3vThXNiQx5JVD15rGwW", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1206, + "string": "EAACEdEose0cBAdSAIzs2npcdqDa3vThXNiQx5JVD15rGwW", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + } +] diff --git a/tests/Mocks/ExampleSampleResponse.json b/tests/Mocks/ExampleSampleResponse.json new file mode 100644 index 0000000..87b6dcb --- /dev/null +++ b/tests/Mocks/ExampleSampleResponse.json @@ -0,0 +1,30 @@ +[ + { + "id": 1203, + "string": "nothing-to-see-here", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1204, + "string": "def-a-feature-not-a-bug", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1205, + "string": "its-fine", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + }, + { + "id": 1206, + "string": "worked-on-my-machine", + "array": "\"{\\\"key\\\":\\\"value\\\",\\\"test\\\":{\\\"something\\\":\\\"please\\\"}}\"", + "created_at": "2023-06-10 17:08:04", + "updated_at": "2023-06-10 17:08:04" + } +] diff --git a/tests/Mocks/SelectInformationSchemaResponse.json b/tests/Mocks/SelectInformationSchemaResponse.json new file mode 100644 index 0000000..39b80af --- /dev/null +++ b/tests/Mocks/SelectInformationSchemaResponse.json @@ -0,0 +1,316 @@ +[ + { + "TABLE_NAME": "examples", + "COLUMN_NAME": "id", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "examples", + "COLUMN_NAME": "string", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "examples", + "COLUMN_NAME": "array", + "DATA_TYPE": "json", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "examples", + "COLUMN_NAME": "created_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "examples", + "COLUMN_NAME": "updated_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "id", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "uuid", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "connection", + "DATA_TYPE": "text", + "CHARACTER_MAXIMUM_LENGTH": "65535", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "queue", + "DATA_TYPE": "text", + "CHARACTER_MAXIMUM_LENGTH": "65535", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "payload", + "DATA_TYPE": "longtext", + "CHARACTER_MAXIMUM_LENGTH": "4294967295", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "exception", + "DATA_TYPE": "longtext", + "CHARACTER_MAXIMUM_LENGTH": "4294967295", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "failed_jobs", + "COLUMN_NAME": "failed_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": "CURRENT_TIMESTAMP", + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "migrations", + "COLUMN_NAME": "id", + "DATA_TYPE": "int", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "migrations", + "COLUMN_NAME": "migration", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "migrations", + "COLUMN_NAME": "batch", + "DATA_TYPE": "int", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "password_reset_tokens", + "COLUMN_NAME": "email", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "password_reset_tokens", + "COLUMN_NAME": "token", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "password_reset_tokens", + "COLUMN_NAME": "created_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "id", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "tokenable_type", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "tokenable_id", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "name", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "token", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "64", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "abilities", + "DATA_TYPE": "text", + "CHARACTER_MAXIMUM_LENGTH": "65535", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "last_used_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "expires_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "created_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "personal_access_tokens", + "COLUMN_NAME": "updated_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "USER", + "DATA_TYPE": "char", + "CHARACTER_MAXIMUM_LENGTH": "32", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "CURRENT_CONNECTIONS", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "TOTAL_CONNECTIONS", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "id", + "DATA_TYPE": "bigint", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "name", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "email", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "email_verified_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "password", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "255", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "NO" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "remember_token", + "DATA_TYPE": "varchar", + "CHARACTER_MAXIMUM_LENGTH": "100", + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "created_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + }, + { + "TABLE_NAME": "users", + "COLUMN_NAME": "updated_at", + "DATA_TYPE": "timestamp", + "CHARACTER_MAXIMUM_LENGTH": null, + "COLUMN_DEFAULT": null, + "IS_NULLABLE": "YES" + } +] + + diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..c551c56 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,68 @@ +app->instance(ConnectionInterface::class, $connection); + } + + protected function getMockFor($filename) + { + if (! Str::endsWith($filename, '.json')) { + $filename .= '.json'; + } + + return json_decode(file_get_contents(__DIR__.'/Mocks/'.$filename), true); + } + + protected function getMockInformationSchema() + { + $expectedTables = $this->getMockFor('SelectInformationSchemaResponse'); + + foreach ($expectedTables as $key => $table) { + $expectedTables[$key] = (object) $table; + } + + return $expectedTables; + } + + protected function getMockCleanSample() + { + return $this->transformToObject($this->getMockFor('ExampleSampleResponse')); + } + + protected function getMockDirtySample() + { + return $this->transformToObject($this->getMockFor('DirtyExampleSampleResponse')); + } + + protected function transformToObject(array $samples) + { + foreach ($samples as $key => $sample) { + $samples[$key] = (object) $sample; + } + + return $samples; + } +} diff --git a/tests/Unit/Services/ScanatorServiceTest.php b/tests/Unit/Services/ScanatorServiceTest.php new file mode 100644 index 0000000..a3ddad7 --- /dev/null +++ b/tests/Unit/Services/ScanatorServiceTest.php @@ -0,0 +1,77 @@ +expects('getDatabaseName')->andReturn('test_scanator_db'); + + $connection->shouldReceive('select')->andReturn($this->getMockInformationSchema())->once(); + + $this->mockConnection($connection); + + $service = $this->app->make(ScanatorServiceContract::class); + + $reflectionClass = new ReflectionClass(ScanatorService::class); + + $reflectionMethod = $reflectionClass->getMethod('retrieveSchema'); + + $schema = $reflectionMethod->invoke($service); + + $this->assertCount(4, $schema); + } + + public function testItCanRetrieveSampleData() + { + $connection = Mockery::mock(ConnectionInterface::class); + + $sampleMock = $this->getMockCleanSample(); + + $connection->shouldReceive('select')->andReturn($sampleMock); + + $this->mockConnection($connection); + + $service = $this->app->make(ScanatorServiceContract::class); + + $reflectionClass = new ReflectionClass(ScanatorService::class); + + $reflectionMethod = $reflectionClass->getMethod('retrieveTestSample'); + + $sample = $reflectionMethod->invoke($service, 'examples'); + + $this->assertEquals(new Collection($sampleMock), $sample); + } + + public function testItCanReturnDetections() + { + $connection = Mockery::mock(ConnectionInterface::class); + + $connection->expects('getDatabaseName')->andReturn('test_scanator_db'); + + $connection->shouldReceive('select')->andReturn($this->getMockInformationSchema())->once(); + + $connection->shouldReceive('select')->andReturn($this->getMockDirtySample())->once(); + + $connection->shouldReceive('select')->andReturn($this->getMockCleanSample())->times(3); + + $this->mockConnection($connection); + + $service = $this->app->make(ScanatorServiceContract::class); + + $detectionManager = $service->init(); + + $this->assertCount(1, $detectionManager->getDetections()); + } +} diff --git a/tests/Unit/Support/DetectionManagerTest.php b/tests/Unit/Support/DetectionManagerTest.php new file mode 100644 index 0000000..e78e343 --- /dev/null +++ b/tests/Unit/Support/DetectionManagerTest.php @@ -0,0 +1,58 @@ +manager = new DetectionManager(); + + $this->detection = new Detection( + 'table', + 'column', + 'sample', + Scanator::getRegexCollection()->get('google_api'), + Carbon::now()->toDateTimeImmutable() + ); + } + + public function testItCanGetScanStartTime() + { + $this->assertInstanceOf(DateTimeImmutable::class, $this->manager->getScanStart()); + } + + public function testItCanGetDetections() + { + $this->assertEmpty($this->manager->getDetections()); + + $this->manager->recordDetection($this->detection); + + $this->assertCount(1, $this->manager->getDetections()); + } + + public function testDetectionProvidesInformation() + { + $this->assertInstanceOf(DateTimeImmutable::class, $this->detection->getScanStart()); + $this->assertInstanceOf(DateTimeImmutable::class, $this->detection->getFoundAt()); + + $this->assertEquals('table', $this->detection->getTable()); + $this->assertEquals('column', $this->detection->getColumn()); + $this->assertEquals('sample', $this->detection->getSample()); + $this->assertInstanceOf(RegexCollectionInterface::class, $this->detection->getRegexClass()); + + $this->assertIsArray($this->detection->toArray()); + $this->assertIsString($this->detection->toJson()); + } +}