From 93d924a5eb908a6cd5a778ad3eae04fc785d24e5 Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Mon, 28 Oct 2024 18:37:21 +0300 Subject: [PATCH 1/5] v2 --- .github/CONTRIBUTING.md | 55 + .github/ISSUE_TEMPLATE/bug.yml | 66 + .github/ISSUE_TEMPLATE/config.yml | 11 + .github/SECURITY.md | 3 + .github/dependabot.yml | 12 + .github/workflows/dependabot-auto-merge.yml | 32 + .github/workflows/fix-php-code-styling.yml | 30 + .github/workflows/tests.yml | 74 + .gitignore | 23 + .php-cs-fixer.dist.php | 37 + CODE_OF_CONDUCT.md | 128 + README.md | 4 +- composer.json | 31 +- composer.lock | 13130 ++++++++++++++++ config/filament-types.php | 52 +- .../2022_09_11_223298_create_types_table.php | 43 +- ..._02_13_134607_create_types_metas_table.php | 26 +- ...023_02_13_143941_create_typables_table.php | 16 +- ...43941_drop_unique_key_from_types_table.php | 6 +- .../2024_09_11_143941_update_types_table.php | 4 +- ...8_143941_add_media_if_not_exists_table.php | 39 + phpunit.xml | 28 + pint.json | 14 + resources/lang/ar/messages.php | 32 +- resources/lang/en/messages.php | 38 +- routes/web.php | 2 - src/Components/Type.php | 22 +- src/Components/TypeColumn.php | 22 +- src/Console/FilamentTypesInstall.php | 5 +- src/Facades/FilamentTypes.php | 7 +- src/Filament/Resources/TypeResource.php | 64 + .../TypeResource/Actions/Components}/.gitkeep | 0 .../Actions/Components/Action.php | 8 + .../Actions/Components/CreateAction.php | 43 + .../TypeResource/Actions/Contracts}/.gitkeep | 0 .../Actions/Contracts/CanRegister.php | 56 + .../Actions/ManagePageActions.php | 18 + .../TypeResource/Form/Components/.gitkeep | 0 .../TypeResource/Form/Components/Color.php | 16 + .../Form/Components/Component.php | 10 + .../Form/Components/Description.php | 16 + .../TypeResource/Form/Components/Icon.php | 16 + .../TypeResource/Form/Components/Image.php | 19 + .../TypeResource/Form/Components/IsActive.php | 15 + .../TypeResource/Form/Components/Key.php | 17 + .../TypeResource/Form/Components/Name.php | 17 + .../TypeResource/Form/Components/TypeFor.php | 24 + .../TypeResource/Form/Components/TypeOf.php | 21 + .../Form/Components/TypeParent.php | 23 + .../Resources/TypeResource/Form/TypeForm.php | 50 + .../TypeResource/InfoList/Entries/.gitkeep | 0 .../TypeResource/InfoList/Entries/Entry.php | 8 + .../TypeResource/InfoList/TypeInfoList.php | 42 + .../TypeResource/Pages/ListTypes.php | 30 + .../TypeResource/Table/Actions/.gitkeep | 0 .../TypeResource/Table/Actions/Action.php | 8 + .../Table/Actions/DeleteAction.php | 15 + .../TypeResource/Table/Actions/EditAction.php | 15 + .../TypeResource/Table/Actions/ViewAction.php | 15 + .../TypeResource/Table/BulkActions/.gitkeep | 0 .../TypeResource/Table/BulkActions/Action.php | 10 + .../Table/BulkActions/DeleteAction.php | 13 + .../TypeResource/Table/Columns/.gitkeep | 0 .../TypeResource/Table/Columns/Column.php | 8 + .../TypeResource/Table/Columns/CreatedAt.php | 17 + .../TypeResource/Table/Columns/Id.php | 14 + .../TypeResource/Table/Columns/IsActive.php | 14 + .../TypeResource/Table/Columns/Key.php | 18 + .../TypeResource/Table/Columns/TypeFor.php | 15 + .../TypeResource/Table/Columns/TypeOf.php | 15 + .../TypeResource/Table/Columns/UpdatedAt.php | 17 + .../TypeResource/Table/Filters/.gitkeep | 0 .../TypeResource/Table/Filters/Filter.php | 8 + .../TypeResource/Table/Filters/TypeFor.php | 58 + .../TypeResource/Table/HeaderActions/.gitkeep | 0 .../Table/HeaderActions/Action.php | 8 + .../TypeResource/Table/TypeActions.php | 43 + .../TypeResource/Table/TypeBulkActions.php | 43 + .../TypeResource/Table/TypeFilters.php | 41 + .../TypeResource/Table/TypeHeaderActions.php | 41 + .../TypeResource/Table/TypeTable.php | 61 + src/FilamentTypesPlugin.php | 67 +- src/FilamentTypesServiceProvider.php | 26 +- src/Models/Type.php | 21 +- src/Models/TypesMeta.php | 10 +- src/Pages/BaseTypePage.php | 51 +- src/Resources/TypeResource.php | 251 - .../TypeResource/Pages/ListTypes.php | 67 - src/Services/Contracts/Type.php | 23 +- src/Services/Contracts/TypeFor.php | 47 + src/Services/Contracts/TypeOf.php | 47 + src/Services/FilamentTypesRegister.php | 33 - src/Services/FilamentTypesServices.php | 50 + src/helpers.php | 4 +- tests/Pest.php | 5 + tests/database/database.sqlite | Bin 0 -> 520192 bytes tests/database/factories/TypeFactory.php | 25 + tests/database/factories/UserFactory.php | 23 + tests/src/AdminPanelProvider.php | 55 + tests/src/DebugTest.php | 5 + tests/src/FilamentTypeServiceTest.php | 25 + tests/src/Models/Type.php | 79 + tests/src/Models/User.php | 34 + tests/src/PluginTest.php | 29 + tests/src/TestCase.php | 106 + tests/src/TypeResourceTest.php | 171 + 106 files changed, 15659 insertions(+), 597 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/SECURITY.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dependabot-auto-merge.yml create mode 100644 .github/workflows/fix-php-code-styling.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .php-cs-fixer.dist.php create mode 100644 CODE_OF_CONDUCT.md create mode 100644 composer.lock create mode 100644 database/migrations/2024_10_28_143941_add_media_if_not_exists_table.php create mode 100644 phpunit.xml create mode 100644 pint.json create mode 100644 src/Filament/Resources/TypeResource.php rename {tests/Feature => src/Filament/Resources/TypeResource/Actions/Components}/.gitkeep (100%) create mode 100644 src/Filament/Resources/TypeResource/Actions/Components/Action.php create mode 100644 src/Filament/Resources/TypeResource/Actions/Components/CreateAction.php rename {tests/Unit => src/Filament/Resources/TypeResource/Actions/Contracts}/.gitkeep (100%) create mode 100644 src/Filament/Resources/TypeResource/Actions/Contracts/CanRegister.php create mode 100644 src/Filament/Resources/TypeResource/Actions/ManagePageActions.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Color.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Component.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Description.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Icon.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Image.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/IsActive.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Key.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/Name.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/TypeFor.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/TypeOf.php create mode 100644 src/Filament/Resources/TypeResource/Form/Components/TypeParent.php create mode 100644 src/Filament/Resources/TypeResource/Form/TypeForm.php create mode 100644 src/Filament/Resources/TypeResource/InfoList/Entries/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/InfoList/Entries/Entry.php create mode 100644 src/Filament/Resources/TypeResource/InfoList/TypeInfoList.php create mode 100644 src/Filament/Resources/TypeResource/Pages/ListTypes.php create mode 100644 src/Filament/Resources/TypeResource/Table/Actions/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Table/Actions/Action.php create mode 100644 src/Filament/Resources/TypeResource/Table/Actions/DeleteAction.php create mode 100644 src/Filament/Resources/TypeResource/Table/Actions/EditAction.php create mode 100644 src/Filament/Resources/TypeResource/Table/Actions/ViewAction.php create mode 100644 src/Filament/Resources/TypeResource/Table/BulkActions/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Table/BulkActions/Action.php create mode 100644 src/Filament/Resources/TypeResource/Table/BulkActions/DeleteAction.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/Column.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/CreatedAt.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/Id.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/IsActive.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/Key.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/TypeFor.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/TypeOf.php create mode 100644 src/Filament/Resources/TypeResource/Table/Columns/UpdatedAt.php create mode 100644 src/Filament/Resources/TypeResource/Table/Filters/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Table/Filters/Filter.php create mode 100644 src/Filament/Resources/TypeResource/Table/Filters/TypeFor.php create mode 100644 src/Filament/Resources/TypeResource/Table/HeaderActions/.gitkeep create mode 100644 src/Filament/Resources/TypeResource/Table/HeaderActions/Action.php create mode 100644 src/Filament/Resources/TypeResource/Table/TypeActions.php create mode 100644 src/Filament/Resources/TypeResource/Table/TypeBulkActions.php create mode 100644 src/Filament/Resources/TypeResource/Table/TypeFilters.php create mode 100644 src/Filament/Resources/TypeResource/Table/TypeHeaderActions.php create mode 100644 src/Filament/Resources/TypeResource/Table/TypeTable.php delete mode 100644 src/Resources/TypeResource.php delete mode 100644 src/Resources/TypeResource/Pages/ListTypes.php create mode 100644 src/Services/Contracts/TypeFor.php create mode 100644 src/Services/Contracts/TypeOf.php delete mode 100644 src/Services/FilamentTypesRegister.php create mode 100644 src/Services/FilamentTypesServices.php create mode 100644 tests/Pest.php create mode 100644 tests/database/database.sqlite create mode 100644 tests/database/factories/TypeFactory.php create mode 100644 tests/database/factories/UserFactory.php create mode 100644 tests/src/AdminPanelProvider.php create mode 100644 tests/src/DebugTest.php create mode 100644 tests/src/FilamentTypeServiceTest.php create mode 100644 tests/src/Models/Type.php create mode 100644 tests/src/Models/User.php create mode 100644 tests/src/PluginTest.php create mode 100644 tests/src/TestCase.php create mode 100644 tests/src/TypeResourceTest.php diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..b0ee5d8 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +Please read and understand the contribution guide before creating an issue or pull request. + +## Etiquette + +This project is open source, and as such, the maintainers give their free time to build and maintain the source code +held within. They make the code freely available in the hope that it will be of use to other developers. It would be +extremely unfair for them to suffer abuse or anger for their hard work. + +Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the +world that developers are civilized and selfless people. + +It's the duty of the maintainer to ensure that all submissions to the project are of sufficient +quality to benefit the project. Many developers have different skills, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. + +## Viability + +When requesting or submitting new features, first consider whether it might be useful to others. Open +source projects are used by many developers, who may have entirely different needs to your own. Think about +whether or not your feature is likely to be used by other users of the project. + +## Procedure + +Before filing an issue: + +- Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. +- Check to make sure your feature suggestion isn't already present within the project. +- Check the pull requests tab to ensure that the bug doesn't have a fix in progress. +- Check the pull requests tab to ensure that the feature isn't already in progress. + +Before submitting a pull request: + +- Check the codebase to ensure that your feature doesn't already exist. +- Check the pull requests to ensure that another person hasn't already submitted the feature or fix. + +## Requirements + +If the project maintainer has any additional requirements, you will find them listed here. + +- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](https://pear.php.net/package/PHP_CodeSniffer). + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Consider our release cycle** - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. + +**Happy coding**! diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000..8fa85ce --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,66 @@ +name: Bug Report +description: Report an Issue or Bug with the Package +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + We're sorry to hear you have a problem. Can you help us solve it by providing the following details. + - type: textarea + id: what-happened + attributes: + label: What happened? + description: What did you expect to happen? + placeholder: I cannot currently do X thing because when I do, it breaks X thing. + validations: + required: true + - type: textarea + id: how-to-reproduce + attributes: + label: How to reproduce the bug + description: How did this occur, please add any config values used and provide a set of reliable steps if possible. + placeholder: When I do X I see Y. + validations: + required: true + - type: input + id: package-version + attributes: + label: Package Version + description: What version of our Package are you running? Please be as specific as possible + placeholder: 2.0.0 + validations: + required: true + - type: input + id: php-version + attributes: + label: PHP Version + description: What version of PHP are you running? Please be as specific as possible + placeholder: 8.2.0 + validations: + required: true + - type: input + id: laravel-version + attributes: + label: Laravel Version + description: What version of Laravel are you running? Please be as specific as possible + placeholder: 9.0.0 + validations: + required: true + - type: dropdown + id: operating-systems + attributes: + label: Which operating systems does with happen with? + description: You may select more than one. + multiple: true + options: + - macOS + - Windows + - Linux + - type: textarea + id: notes + attributes: + label: Notes + description: Use this field to provide any other notes that you feel might be relevant to the issue. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..07a6932 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a question + url: https://github.com/tomatophp/filament-types/discussions/new?category=q-a + about: Ask the community for help + - name: Request a feature + url: https://github.com/tomatophp/filament-types/discussions/new?category=ideas + about: Share ideas for new features + - name: Report a security issue + url: https://github.com/tomatophp/filament-types/security/policy + about: Learn how to notify us for sensitive bugs diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..b2490a9 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,3 @@ +# Security Policy + +If you discover any security related issues, please email info@3x1.io instead of using the issue tracker. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..0bc378d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + labels: + - "dependencies" diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml new file mode 100644 index 0000000..27c23a4 --- /dev/null +++ b/.github/workflows/dependabot-auto-merge.yml @@ -0,0 +1,32 @@ +name: dependabot-auto-merge +on: pull_request_target + +permissions: + pull-requests: write + contents: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v2.2.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + - name: Auto-merge Dependabot PRs for semver-minor updates + if: ${{steps.metadata.outputs.update-type == 'version-update:semver-minor'}} + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + + - name: Auto-merge Dependabot PRs for semver-patch updates + if: ${{steps.metadata.outputs.update-type == 'version-update:semver-patch'}} + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/fix-php-code-styling.yml b/.github/workflows/fix-php-code-styling.yml new file mode 100644 index 0000000..e71024d --- /dev/null +++ b/.github/workflows/fix-php-code-styling.yml @@ -0,0 +1,30 @@ +name: 'PHP Code Styling' + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - '**.php' + +permissions: + contents: write + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Fix PHP code style issues + uses: aglipanci/laravel-pint-action@v2 + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "Format Code" + commit_user_name: 'GitHub Actions' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..7c5dbfb --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,74 @@ +name: "Tests" + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - '**.php' + pull_request: + types: + - opened + - synchronize + branches: + - master + paths: + - '**.php' + - '.github/workflows/tests.yml' + - 'phpunit.xml.dist' + - 'composer.json' + - 'composer.lock' + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: true + matrix: + os: [ubuntu-latest] + php: [8.3, 8.2, 8.1] + laravel: [11.*, 10.*] + stability: [prefer-stable] + include: + - laravel: 11.* + testbench: 9.* + carbon: 3.* + collision: 8.* + - laravel: 10.* + testbench: 8.* + carbon: 2.* + collision: 7.* + exclude: + - laravel: 11.* + php: 8.1 + name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }} + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Cache Dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache/files + key: dependencies-laravel-${{ matrix.laravel }}-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo + coverage: none + + - name: Install Dependencies + 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 }}" "nesbot/carbon:${{ matrix.carbon }}" "nunomaduro/collision:${{ matrix.collision }}" --no-interaction --no-update + composer update --${{ matrix.stability }} --prefer-dist --no-interaction + + - name: Execute tests + run: vendor/bin/pest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f23795 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +.DS_Store +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode +/.zed diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..4123157 --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,37 @@ +notPath('bootstrap/*') + ->notPath('storage/*') + ->notPath('resources/view/mail/*') + ->in([ + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ->name('*.php') + ->notName('*.blade.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return (new PhpCsFixer\Config()) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline' => true, + 'phpdoc_scalar' => true, + 'unary_operator_spaces' => true, + 'binary_operator_spaces' => true, + 'blank_line_before_statement' => [ + 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], + ], + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_var_without_name' => true, + 'method_argument_space' => [ + 'on_multiline' => 'ensure_fully_multiline', + 'keep_multiple_spaces_after_comma' => true, + ] + ]) + ->setFinder($finder); diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..18c9147 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/README.md b/README.md index 84741b2..063afcd 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ Manage any type on your app in Database with easy to use Resource for FilamentPH ```bash composer require tomatophp/filament-types ``` + after install your package please run this command ```bash php artisan filament-types:install ``` - -finally reigster the plugin on `/app/Providers/Filament/AdminPanelProvider.php` +finally register the plugin on `/app/Providers/Filament/AdminPanelProvider.php` ```php ->plugin(\TomatoPHP\FilamentTypes\FilamentTypesPlugin::make()) diff --git a/composer.json b/composer.json index a546dbd..03c779a 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ }, "autoload-dev": { "psr-4": { - "Tests\\": "tests/" + "TomatoPHP\\FilamentTypes\\Tests\\": "tests/src", + "TomatoPHP\\FilamentTypes\\Tests\\Database\\Factories\\": "tests/database/factories" } }, "extra": { @@ -28,6 +29,20 @@ ] } }, + "scripts": { + "testbench": "vendor/bin/testbench package:discover --ansi", + "analyse": "vendor/bin/phpstan analyse src tests", + "test": "vendor/bin/pest", + "test-coverage": "vendor/bin/pest --coverage", + "format": "vendor/bin/pint" + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "phpstan/extension-installer": true + } + }, "authors": [ { "name": "Fady Mondy", @@ -37,11 +52,23 @@ "require": { "php": "^8.1|^8.2", "tomatophp/console-helpers": "^1.1", - "filament/filament": "^3.0.0", + "filament/filament": "^3.2", "tomatophp/filament-icons": "^1.1", "filament/spatie-laravel-media-library-plugin": "^3.2", "filament/spatie-laravel-translatable-plugin": "^3.2", "genealabs/laravel-model-caching": "^11.0", "tomatophp/filament-translation-component": "^v1.0" + }, + "require-dev": { + "laravel/pint": "^1.18", + "livewire/livewire": "^2.10|^3.0", + "nunomaduro/larastan": "^2.9", + "orchestra/testbench": "^9.5", + "pestphp/pest": "^2.36", + "pestphp/pest-plugin-laravel": "^2.4", + "pestphp/pest-plugin-livewire": "^2.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpstan/phpstan-phpunit": "^1.4" } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..2075dc3 --- /dev/null +++ b/composer.lock @@ -0,0 +1,13130 @@ +{ + "_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": "edc279f4009631ff07fbeef1d0d0daca", + "packages": [ + { + "name": "anourvalar/eloquent-serialize", + "version": "1.2.25", + "source": { + "type": "git", + "url": "https://github.com/AnourValar/eloquent-serialize.git", + "reference": "6d7a868ae4218b9d7796334ff9a17e1539bad48a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/6d7a868ae4218b9d7796334ff9a17e1539bad48a", + "reference": "6d7a868ae4218b9d7796334ff9a17e1539bad48a", + "shasum": "" + }, + "require": { + "laravel/framework": "^8.0|^9.0|^10.0|^11.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.26", + "laravel/legacy-factories": "^1.1", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5|^10.5", + "psalm/plugin-laravel": "^2.8", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "EloquentSerialize": "AnourValar\\EloquentSerialize\\Facades\\EloquentSerializeFacade" + } + } + }, + "autoload": { + "psr-4": { + "AnourValar\\EloquentSerialize\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Laravel Query Builder (Eloquent) serialization", + "homepage": "https://github.com/AnourValar/eloquent-serialize", + "keywords": [ + "anourvalar", + "builder", + "copy", + "eloquent", + "job", + "laravel", + "query", + "querybuilder", + "queue", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/AnourValar/eloquent-serialize/issues", + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.25" + }, + "time": "2024-09-16T12:59:37+00:00" + }, + { + "name": "blade-ui-kit/blade-heroicons", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/a7c377a4ef88cd54712e3e15cbed30446820da0b", + "reference": "a7c377a4ef88cd54712e3e15cbed30446820da0b", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.6", + "illuminate/support": "^9.0|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/2.4.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/driesvints", + "type": "github" + }, + { + "url": "https://www.paypal.com/paypalme/driesvints", + "type": "paypal" + } + ], + "time": "2024-07-16T07:00:01+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "75a54a3f5a2810fcf6574ab23e91b6cc229a1b53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/75a54a3f5a2810fcf6574ab23e91b6cc229a1b53", + "reference": "75a54a3f5a2810fcf6574ab23e91b6cc229a1b53", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "illuminate/view": "^8.0|^9.0|^10.0|^11.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3|^6.0|^7.0", + "symfony/finder": "^5.3|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.5.1", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "BladeUI\\Icons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/sponsors/driesvints", + "type": "github" + }, + { + "url": "https://www.paypal.com/paypalme/driesvints", + "type": "paypal" + } + ], + "time": "2024-10-17T17:38:00+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "calebporzio/sushi", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/calebporzio/sushi.git", + "reference": "01dd34fe3374f5fb7ce63756c0419385e31cd532" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/calebporzio/sushi/zipball/01dd34fe3374f5fb7ce63756c0419385e31cd532", + "reference": "01dd34fe3374f5fb7ce63756c0419385e31cd532", + "shasum": "" + }, + "require": { + "ext-pdo_sqlite": "*", + "ext-sqlite3": "*", + "illuminate/database": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "php": "^7.1.3|^8.0" + }, + "require-dev": { + "doctrine/dbal": "^2.9 || ^3.1.4", + "orchestra/testbench": "3.8.* || 3.9.* || ^4.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "phpunit/phpunit": "^7.5 || ^8.4 || ^9.0 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sushi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "Eloquent's missing \"array\" driver.", + "support": { + "source": "https://github.com/calebporzio/sushi/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2024-04-24T15:23:03+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "danharrin/date-format-converter", + "version": "v0.3.1", + "source": { + "type": "git", + "url": "https://github.com/danharrin/date-format-converter.git", + "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/7c31171bc981e48726729a5f3a05a2d2b63f0b1e", + "reference": "7c31171bc981e48726729a5f3a05a2d2b63f0b1e", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php", + "src/standards.php" + ], + "psr-4": { + "DanHarrin\\DateFormatConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Convert token-based date formats between standards.", + "homepage": "https://github.com/danharrin/date-format-converter", + "support": { + "issues": "https://github.com/danharrin/date-format-converter/issues", + "source": "https://github.com/danharrin/date-format-converter" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2024-06-13T09:38:44+00:00" + }, + { + "name": "danharrin/livewire-rate-limiting", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb", + "reference": "1a1b299e20de61f88ed6e94ea0bbcfc33aab1ddb", + "shasum": "" + }, + "require": { + "illuminate/support": "^9.0|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "livewire/livewire": "^3.0", + "livewire/volt": "^1.3", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpunit/phpunit": "^9.0|^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2024-05-06T09:10:03+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/dbal", + "version": "4.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/dadd35300837a3a2184bd47d403333b15d0a9bd0", + "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3|^1", + "php": "^8.1", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "1.12.6", + "phpstan/phpstan-phpunit": "1.4.0", + "phpstan/phpstan-strict-rules": "^1.6", + "phpunit/phpunit": "10.5.30", + "psalm/plugin-phpunit": "0.19.0", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^6.3.8|^7.0", + "symfony/console": "^5.4|^6.3|^7.0", + "vimeo/psalm": "5.25.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "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": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-10-10T18:01:27+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "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", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "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.4.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "filament/actions", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/actions.git", + "reference": "1c79f2ffefdee6a21995717a52f006a541b971bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/1c79f2ffefdee6a21995717a52f006a541b971bc", + "reference": "1c79f2ffefdee6a21995717a52f006a541b971bc", + "shasum": "" + }, + "require": { + "anourvalar/eloquent-serialize": "^1.2", + "filament/forms": "self.version", + "filament/infolists": "self.version", + "filament/notifications": "self.version", + "filament/support": "self.version", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/database": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "league/csv": "^9.14", + "openspout/openspout": "^4.23", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Actions\\ActionsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Actions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful action modals to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:46:52+00:00" + }, + { + "name": "filament/filament", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/panels.git", + "reference": "5e9a946d0b64c1ef9a7ef1cb256a427f2838dbc2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/5e9a946d0b64c1ef9a7ef1cb256a427f2838dbc2", + "reference": "5e9a946d0b64c1ef9a7ef1cb256a427f2838dbc2", + "shasum": "" + }, + "require": { + "danharrin/livewire-rate-limiting": "^0.3|^1.0", + "filament/actions": "self.version", + "filament/forms": "self.version", + "filament/infolists": "self.version", + "filament/notifications": "self.version", + "filament/support": "self.version", + "filament/tables": "self.version", + "filament/widgets": "self.version", + "illuminate/auth": "^10.45|^11.0", + "illuminate/console": "^10.45|^11.0", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/cookie": "^10.45|^11.0", + "illuminate/database": "^10.45|^11.0", + "illuminate/http": "^10.45|^11.0", + "illuminate/routing": "^10.45|^11.0", + "illuminate/session": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "illuminate/view": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\FilamentServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/global_helpers.php", + "src/helpers.php" + ], + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A collection of full-stack components for accelerated Laravel app development.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:47:13+00:00" + }, + { + "name": "filament/forms", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/forms.git", + "reference": "68c9f7f4bd9677f6f99d21396dfbe69cfa142584" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/68c9f7f4bd9677f6f99d21396dfbe69cfa142584", + "reference": "68c9f7f4bd9677f6f99d21396dfbe69cfa142584", + "shasum": "" + }, + "require": { + "danharrin/date-format-converter": "^0.3", + "filament/actions": "self.version", + "filament/support": "self.version", + "illuminate/console": "^10.45|^11.0", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/database": "^10.45|^11.0", + "illuminate/filesystem": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "illuminate/validation": "^10.45|^11.0", + "illuminate/view": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Forms\\FormsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\Forms\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful forms to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:47:01+00:00" + }, + { + "name": "filament/infolists", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/infolists.git", + "reference": "2d934d4d7f420fc1165ced33df0959a656163a0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/2d934d4d7f420fc1165ced33df0959a656163a0c", + "reference": "2d934d4d7f420fc1165ced33df0959a656163a0c", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/support": "self.version", + "illuminate/console": "^10.45|^11.0", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/database": "^10.45|^11.0", + "illuminate/filesystem": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "illuminate/view": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Infolists\\InfolistsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Infolists\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful read-only infolists to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:47:00+00:00" + }, + { + "name": "filament/notifications", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/notifications.git", + "reference": "c19df07c801c5550de0d30957c5a316f53019533" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/c19df07c801c5550de0d30957c5a316f53019533", + "reference": "c19df07c801c5550de0d30957c5a316f53019533", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/support": "self.version", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/filesystem": "^10.45|^11.0", + "illuminate/notifications": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Notifications\\NotificationsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Testing/Autoload.php" + ], + "psr-4": { + "Filament\\Notifications\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful notifications to any Livewire app.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-23T07:36:14+00:00" + }, + { + "name": "filament/spatie-laravel-media-library-plugin", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git", + "reference": "35004964449944b98c15a698a1be842f23f6f7e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/spatie-laravel-media-library-plugin/zipball/35004964449944b98c15a698a1be842f23f6f7e6", + "reference": "35004964449944b98c15a698a1be842f23f6f7e6", + "shasum": "" + }, + "require": { + "illuminate/support": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-medialibrary": "^10.0|^11.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Filament support for `spatie/laravel-medialibrary`.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-23T07:36:33+00:00" + }, + { + "name": "filament/spatie-laravel-translatable-plugin", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/spatie-laravel-translatable-plugin.git", + "reference": "b74a67ba94b0b15ffe64de2d387bb363f4596806" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/spatie-laravel-translatable-plugin/zipball/b74a67ba94b0b15ffe64de2d387bb363f4596806", + "reference": "b74a67ba94b0b15ffe64de2d387bb363f4596806", + "shasum": "" + }, + "require": { + "filament/support": "self.version", + "illuminate/support": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-translatable": "^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\SpatieLaravelTranslatablePluginServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Filament support for `spatie/laravel-translatable`.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-16T12:07:42+00:00" + }, + { + "name": "filament/support", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/support.git", + "reference": "fa8ada5101be964daa8f112616945a8f2ca5929e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/support/zipball/fa8ada5101be964daa8f112616945a8f2ca5929e", + "reference": "fa8ada5101be964daa8f112616945a8f2ca5929e", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-heroicons": "^2.2.1", + "doctrine/dbal": "^3.2|^4.0", + "ext-intl": "*", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "illuminate/view": "^10.45|^11.0", + "kirschbaum-development/eloquent-power-joins": "^3.0|^4.0", + "livewire/livewire": "^3.4.10", + "php": "^8.1", + "ryangjchandler/blade-capture-directive": "^0.2|^0.3|^1.0", + "spatie/color": "^1.5", + "spatie/invade": "^1.0|^2.0", + "spatie/laravel-package-tools": "^1.9", + "symfony/console": "^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Support\\SupportServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\Support\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Core helper methods and foundation code for all Filament packages.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:47:33+00:00" + }, + { + "name": "filament/tables", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/tables.git", + "reference": "7800832d8507a418787c5f05bd562b65d4601827" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/7800832d8507a418787c5f05bd562b65d4601827", + "reference": "7800832d8507a418787c5f05bd562b65d4601827", + "shasum": "" + }, + "require": { + "filament/actions": "self.version", + "filament/forms": "self.version", + "filament/support": "self.version", + "illuminate/console": "^10.45|^11.0", + "illuminate/contracts": "^10.45|^11.0", + "illuminate/database": "^10.45|^11.0", + "illuminate/filesystem": "^10.45|^11.0", + "illuminate/support": "^10.45|^11.0", + "illuminate/view": "^10.45|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Tables\\TablesServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Tables\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful tables to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-24T13:47:33+00:00" + }, + { + "name": "filament/widgets", + "version": "v3.2.121", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/widgets.git", + "reference": "14ae503aae8265ddc48274debbf7b7aefc7afb0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/14ae503aae8265ddc48274debbf7b7aefc7afb0b", + "reference": "14ae503aae8265ddc48274debbf7b7aefc7afb0b", + "shasum": "" + }, + "require": { + "filament/support": "self.version", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Widgets\\WidgetsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Widgets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Easily add beautiful dashboard widgets to any Livewire component.", + "homepage": "https://github.com/filamentphp/filament", + "support": { + "issues": "https://github.com/filamentphp/filament/issues", + "source": "https://github.com/filamentphp/filament" + }, + "time": "2024-10-08T14:24:26+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "genealabs/laravel-model-caching", + "version": "11.0.1", + "source": { + "type": "git", + "url": "https://github.com/mikebronner/laravel-model-caching.git", + "reference": "2a38f0f1ed3554cf2da272d66c4d08a7885f196b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikebronner/laravel-model-caching/zipball/2a38f0f1ed3554cf2da272d66c4d08a7885f196b", + "reference": "2a38f0f1ed3554cf2da272d66c4d08a7885f196b", + "shasum": "" + }, + "require": { + "genealabs/laravel-pivot-events": "^10.0|^11.0", + "illuminate/cache": "^10.0|^11.0", + "illuminate/config": "^10.0|^11.0", + "illuminate/console": "^10.0|^11.0", + "illuminate/container": "^10.0|^11.0", + "illuminate/database": "^10.0|^11.0", + "illuminate/http": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "php": ">=8.1" + }, + "require-dev": { + "doctrine/dbal": "^3.3", + "fakerphp/faker": "^1.11", + "laravel/legacy-factories": "^1.3", + "laravel/nova": "^4.0", + "orchestra/testbench": "^8.0|^9.0", + "orchestra/testbench-browser-kit": "^8.0", + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.0", + "slevomat/coding-standard": "^7.0|^8.14", + "squizlabs/php_codesniffer": "^3.6", + "symfony/thanks": "^1.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "GeneaLabs\\LaravelModelCaching\\Providers\\Service" + ] + } + }, + "autoload": { + "psr-4": { + "GeneaLabs\\LaravelModelCaching\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike Bronner", + "email": "hello@genealabs.com" + } + ], + "description": "Automatic caching for Eloquent models.", + "support": { + "issues": "https://github.com/mikebronner/laravel-model-caching/issues", + "source": "https://github.com/mikebronner/laravel-model-caching/tree/11.0.1" + }, + "time": "2024-03-14T23:34:57+00:00" + }, + { + "name": "genealabs/laravel-pivot-events", + "version": "11.0.0", + "source": { + "type": "git", + "url": "https://github.com/mikebronner/laravel-pivot-events.git", + "reference": "16e974d80160774641f4323f5ffb757b79f300d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikebronner/laravel-pivot-events/zipball/16e974d80160774641f4323f5ffb757b79f300d3", + "reference": "16e974d80160774641f4323f5ffb757b79f300d3", + "shasum": "" + }, + "require": { + "illuminate/database": "^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0" + }, + "require-dev": { + "orchestra/testbench": "^9.0", + "phpunit/phpunit": "^10.5", + "symfony/thanks": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "GeneaLabs\\LaravelPivotEvents\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike Bronner", + "email": "hello@genealabs.com", + "homepage": "https://genealabs.com", + "role": "Developer" + } + ], + "description": "This package introduces new eloquent events for sync(), attach(), detach() or updateExistingPivot() methods on BelongsToMany relation.", + "homepage": "https://github.com/mikebronner/laravel-pivot-events", + "keywords": [ + "eloquent events", + "eloquent extra events", + "laravel BelongsToMany events", + "laravel pivot events", + "laravel sync events" + ], + "support": { + "issues": "https://github.com/mikebronner/laravel-pivot-events/issues", + "source": "https://github.com/mikebronner/laravel-pivot-events" + }, + "time": "2024-03-14T23:24:54+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "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.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "kirschbaum-development/eloquent-power-joins", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", + "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/c6c42a52c5a097cc11761e72782b2d0215692caf", + "reference": "c6c42a52c5a097cc11761e72782b2d0215692caf", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "php": "^8.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "dev-master", + "laravel/legacy-factories": "^1.0@dev", + "orchestra/testbench": "^8.0|^9.0", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Kirschbaum\\PowerJoins\\PowerJoinsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Kirschbaum\\PowerJoins\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luis Dalmolin", + "email": "luis.nh@gmail.com", + "role": "Developer" + } + ], + "description": "The Laravel magic applied to joins.", + "homepage": "https://github.com/kirschbaum-development/eloquent-power-joins", + "keywords": [ + "eloquent", + "join", + "laravel", + "mysql" + ], + "support": { + "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.0.0" + }, + "time": "2024-10-06T12:28:14+00:00" + }, + { + "name": "laravel/framework", + "version": "v11.29.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "425054512c362835ba9c0307561973c8eeac7385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/425054512c362835ba9c0307561973c8eeac7385", + "reference": "425054512c362835ba9c0307561973c8eeac7385", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.2|^3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "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": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/finder": "^7.0", + "symfony/http-foundation": "^7.0", + "symfony/http-kernel": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^7.0", + "symfony/routing": "^7.0", + "symfony/uid": "^7.0", + "symfony/var-dumper": "^7.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "mockery/mockery": "1.6.8", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.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/concurrency": "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", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "ext-gmp": "*", + "fakerphp/faker": "^1.23", + "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.6", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^9.5", + "pda/pheanstalk": "^5.0", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "^10.5|^11.0", + "predis/predis": "^2.0.2", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0", + "symfony/http-client": "^7.0", + "symfony/psr-http-message-bridge": "^7.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "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|^6.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).", + "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.6).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", + "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).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-10-22T14:13:31+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "0f3848a445562dac376b27968f753c65e7e1036e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/0f3848a445562dac376b27968f753c65e7e1036e", + "reference": "0f3848a445562dac376b27968f753c65e7e1036e", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.1" + }, + "time": "2024-10-09T19:42:26+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + }, + "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": "2024-09-23T13:33:08+00:00" + }, + { + "name": "league/commonmark", + "version": "2.5.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0", + "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.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-08-16T11:46:16+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/csv", + "version": "9.18.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/b02d010e4055ae992247f6ffd1e7b103ef2a0790", + "reference": "b02d010e4055ae992247f6ffd1e7b103ef2a0790", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1.2" + }, + "require-dev": { + "ext-dom": "*", + "ext-xdebug": "*", + "friendsofphp/php-cs-fixer": "^3.64.0", + "phpbench/phpbench": "^1.3.1", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^10.5.16 || ^11.4.1", + "symfony/var-dumper": "^6.4.8 || ^7.1.5" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Csv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "https://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "support": { + "docs": "https://csv.thephpleague.com", + "issues": "https://github.com/thephpleague/csv/issues", + "rss": "https://github.com/thephpleague/csv/releases.atom", + "source": "https://github.com/thephpleague/csv" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-10-18T08:14:48+00:00" + }, + { + "name": "league/flysystem", + "version": "3.29.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + }, + "time": "2024-10-08T08:58:34+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.29.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + }, + "time": "2024-08-09T21:24:39+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.3", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-03-23T07:42:40+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-03-23T07:42:40+00:00" + }, + { + "name": "livewire/livewire", + "version": "v3.5.12", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", + "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0", + "illuminate/routing": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "illuminate/validation": "^10.0|^11.0", + "laravel/prompts": "^0.1.24|^0.2|^0.3", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/console": "^6.0|^7.0", + "symfony/http-kernel": "^6.2|^7.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.15.0|^11.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.21.0|^9.0", + "orchestra/testbench-dusk": "^8.24|^9.1", + "phpunit/phpunit": "^10.4", + "psy/psysh": "^0.11.22|^0.12" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v3.5.12" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2024-10-15T19:35:06+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "6187e9cc4493da94b9b63eb2315821552015fca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9", + "reference": "6187e9cc4493da94b9b63eb2315821552015fca9", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.1" + }, + "require-dev": { + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": "^5.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2024-10-10T12:33:01+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-06-28T09:40:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-08-19T06:22:39+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.5" + }, + "time": "2024-08-07T15:39:19+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/42c84e4e8090766bbd6445d06cd6e57650626ea3", + "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.1.5" + }, + "require-dev": { + "illuminate/console": "^11.28.0", + "laravel/pint": "^1.18.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^7.1.5", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "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/v2.2.0" + }, + "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": "2024-10-15T16:15:16+00:00" + }, + { + "name": "openspout/openspout", + "version": "v4.26.0", + "source": { + "type": "git", + "url": "https://github.com/openspout/openspout.git", + "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openspout/openspout/zipball/a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", + "reference": "a49b947c0c109f4fd112f9b5c6d6cb3e6baf8b50", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "ext-zlib": "*", + "friendsofphp/php-cs-fixer": "^3.64.0", + "infection/infection": "^0.29.6", + "phpbench/phpbench": "^1.3.1", + "phpstan/phpstan": "^1.12.4", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^11.3.6" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", + "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenSpout\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://github.com/openspout/openspout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/openspout/openspout/issues", + "source": "https://github.com/openspout/openspout/tree/v4.26.0" + }, + "funding": [ + { + "url": "https://paypal.me/filippotessarotto", + "type": "custom" + }, + { + "url": "https://github.com/Slamdunk", + "type": "github" + } + ], + "time": "2024-09-24T14:04:43+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "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.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "ryangjchandler/blade-capture-directive", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/ryangjchandler/blade-capture-directive.git", + "reference": "cb6f58663d97f17bece176295240b740835e14f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/cb6f58663d97f17bece176295240b740835e14f1", + "reference": "cb6f58663d97f17bece176295240b740835e14f1", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.9.2" + }, + "require-dev": { + "nunomaduro/collision": "^7.0|^8.0", + "nunomaduro/larastan": "^2.0", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.0", + "pestphp/pest-plugin-laravel": "^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^10.0", + "spatie/laravel-ray": "^1.26" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "RyanChandler\\BladeCaptureDirective\\BladeCaptureDirectiveServiceProvider" + ], + "aliases": { + "BladeCaptureDirective": "RyanChandler\\BladeCaptureDirective\\Facades\\BladeCaptureDirective" + } + } + }, + "autoload": { + "psr-4": { + "RyanChandler\\BladeCaptureDirective\\": "src", + "RyanChandler\\BladeCaptureDirective\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ryan Chandler", + "email": "support@ryangjchandler.co.uk", + "role": "Developer" + } + ], + "description": "Create inline partials in your Blade templates with ease.", + "homepage": "https://github.com/ryangjchandler/blade-capture-directive", + "keywords": [ + "blade-capture-directive", + "laravel", + "ryangjchandler" + ], + "support": { + "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", + "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.0.0" + }, + "funding": [ + { + "url": "https://github.com/ryangjchandler", + "type": "github" + } + ], + "time": "2024-02-26T18:08:49+00:00" + }, + { + "name": "spatie/color", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/color.git", + "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/color/zipball/02ce48c480f86d65702188f738f4e8ccad1b999a", + "reference": "02ce48c480f86d65702188f738f4e8ccad1b999a", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^6.5||^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Color\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A little library to handle color conversions", + "homepage": "https://github.com/spatie/color", + "keywords": [ + "color", + "conversion", + "rgb", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/color/issues", + "source": "https://github.com/spatie/color/tree/1.6.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-09-20T14:00:15+00:00" + }, + { + "name": "spatie/image", + "version": "3.7.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/image.git", + "reference": "d72d1ae07f91a3c1230e064acd4fd8c334ab237b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image/zipball/d72d1ae07f91a3c1230e064acd4fd8c334ab237b", + "reference": "d72d1ae07f91a3c1230e064acd4fd8c334ab237b", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.2", + "spatie/image-optimizer": "^1.7.5", + "spatie/temporary-directory": "^2.2", + "symfony/process": "^6.4|^7.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-imagick": "*", + "laravel/sail": "^1.34", + "pestphp/pest": "^2.28", + "phpstan/phpstan": "^1.10.50", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/pixelmatch-php": "^1.0", + "spatie/ray": "^1.40.1", + "symfony/var-dumper": "^6.4|7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Image\\": "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": "Manipulate images with an expressive API", + "homepage": "https://github.com/spatie/image", + "keywords": [ + "image", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/image/tree/3.7.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-10-07T09:03:34+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.7.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "43aff6725cd87bb78ccd8532633cfa8bdc962505" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/43aff6725cd87bb78ccd8532633cfa8bdc962505", + "reference": "43aff6725cd87bb78ccd8532633cfa8bdc962505", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.3|^8.0", + "psr/log": "^1.0 | ^2.0 | ^3.0", + "symfony/process": "^4.2|^5.0|^6.0|^7.0" + }, + "require-dev": { + "pestphp/pest": "^1.21", + "phpunit/phpunit": "^8.5.21|^9.4.4", + "symfony/var-dumper": "^4.2|^5.0|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "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 optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.7.5" + }, + "time": "2024-05-16T08:48:33+00:00" + }, + { + "name": "spatie/invade", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/invade.git", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/invade/zipball/b920f6411d21df4e8610a138e2e87ae4957d7f63", + "reference": "b920f6411d21df4e8610a138e2e87ae4957d7f63", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.20", + "phpstan/phpstan": "^1.4", + "spatie/ray": "^1.28" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Spatie\\Invade\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "A PHP function to work with private properties and methods", + "homepage": "https://github.com/spatie/invade", + "keywords": [ + "invade", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/invade/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-05-17T09:06:10+00:00" + }, + { + "name": "spatie/laravel-medialibrary", + "version": "11.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-medialibrary.git", + "reference": "6a39eca52236bc1e1261f366d4022996521ae843" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/6a39eca52236bc1e1261f366d4022996521ae843", + "reference": "6a39eca52236bc1e1261f366d4022996521ae843", + "shasum": "" + }, + "require": { + "composer/semver": "^3.4", + "ext-exif": "*", + "ext-fileinfo": "*", + "ext-json": "*", + "illuminate/bus": "^10.0|^11.0", + "illuminate/conditionable": "^10.0|^11.0", + "illuminate/console": "^10.0|^11.0", + "illuminate/database": "^10.0|^11.0", + "illuminate/pipeline": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "maennchen/zipstream-php": "^3.1", + "php": "^8.2", + "spatie/image": "^3.3.2", + "spatie/laravel-package-tools": "^1.16.1", + "spatie/temporary-directory": "^2.2", + "symfony/console": "^6.4.1|^7.0" + }, + "conflict": { + "php-ffmpeg/php-ffmpeg": "<0.6.1" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.293.10", + "ext-imagick": "*", + "ext-pdo_sqlite": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^7.8.1", + "larastan/larastan": "^2.7", + "league/flysystem-aws-s3-v3": "^3.22", + "mockery/mockery": "^1.6.7", + "orchestra/testbench": "^7.0|^8.17|^9.0", + "pestphp/pest": "^2.28", + "phpstan/extension-installer": "^1.3.1", + "spatie/laravel-ray": "^1.33", + "spatie/pdf-to-image": "^2.2|^3.0", + "spatie/pest-plugin-snapshots": "^2.1" + }, + "suggest": { + "league/flysystem-aws-s3-v3": "Required to use AWS S3 file storage", + "php-ffmpeg/php-ffmpeg": "Required for generating video thumbnails", + "spatie/pdf-to-image": "Required for generating thumbnails of PDFs and SVGs" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\MediaLibrary\\MediaLibraryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\MediaLibrary\\": "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": "Associate files with Eloquent models", + "homepage": "https://github.com/spatie/laravel-medialibrary", + "keywords": [ + "cms", + "conversion", + "downloads", + "images", + "laravel", + "laravel-medialibrary", + "media", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-medialibrary/issues", + "source": "https://github.com/spatie/laravel-medialibrary/tree/11.9.2" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-10-18T14:24:58+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.16.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c7413972cf22ffdff97b68499c22baa04eddb6a2", + "reference": "c7413972cf22ffdff97b68499c22baa04eddb6a2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.5" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-08-27T18:56:10+00:00" + }, + { + "name": "spatie/laravel-translatable", + "version": "6.8.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-translatable.git", + "reference": "0ef7e8e9d65bb834b7c68f22ec362a6179f50381" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/0ef7e8e9d65bb834b7c68f22ec362a6179f50381", + "reference": "0ef7e8e9d65bb834b7c68f22ec362a6179f50381", + "shasum": "" + }, + "require": { + "illuminate/database": "^9.0|^10.0|^11.0", + "illuminate/support": "^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.11" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "pestphp/pest": "^1.20|^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Translatable\\TranslatableServiceProvider" + ] + }, + "aliases": { + "Translatable": "Spatie\\Translatable\\Facades\\Translatable" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Translatable\\": "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" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to make an Eloquent model hold translations", + "homepage": "https://github.com/spatie/laravel-translatable", + "keywords": [ + "eloquent", + "i8n", + "laravel-translatable", + "model", + "multilingual", + "spatie", + "translate" + ], + "support": { + "issues": "https://github.com/spatie/laravel-translatable/issues", + "source": "https://github.com/spatie/laravel-translatable/tree/6.8.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-07-24T14:26:27+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "reference": "76949fa18f8e1a7f663fd2eaa1d00e0bcea0752a", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.2.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2023-12-25T11:46:58+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "97bebc53548684c17ed696bc8af016880f0f098d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", + "reference": "97bebc53548684c17ed696bc8af016880f0f098d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bb5192af6edc797cbab5c8e8ecfea2fe5f421e57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bb5192af6edc797cbab5c8e8ecfea2fe5f421e57", + "reference": "bb5192af6edc797cbab5c8e8ecfea2fe5f421e57", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-09T08:46:59+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d60117093c2a9fe667baa8fedf84e8a09b9c592f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d60117093c2a9fe667baa8fedf84e8a09b9c592f", + "reference": "d60117093c2a9fe667baa8fedf84e8a09b9c592f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "87254c78dd50721cfd015b62277a8281c5589702" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.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": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-01T08:31:23+00:00" + }, + { + "name": "symfony/html-sanitizer", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/a25620fc6407e14331f3c0c5668eb4f35c392d4a", + "reference": "a25620fc6407e14331f3c0c5668eb4f35c392d4a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "league/uri": "^6.5|^7.0", + "masterminds/html5": "^2.7.2", + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HtmlSanitizer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to sanitize untrusted HTML input for safe insertion into a document's DOM.", + "homepage": "https://symfony.com", + "keywords": [ + "Purifier", + "html", + "sanitizer" + ], + "support": { + "source": "https://github.com/symfony/html-sanitizer/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "3d7bbf071b25f802f7d55524d408bed414ea71e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3d7bbf071b25f802f7d55524d408bed414ea71e2", + "reference": "3d7bbf071b25f802f7d55524d408bed414ea71e2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-11T19:23:14+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "5d8315899cd76b2e7e29179bf5fea103e41bdf03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5d8315899cd76b2e7e29179bf5fea103e41bdf03", + "reference": "5d8315899cd76b2e7e29179bf5fea103e41bdf03", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-27T13:54:21+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd", + "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "caa1e521edb2650b8470918dfe51708c237f0598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598", + "reference": "caa1e521edb2650b8470918dfe51708c237f0598", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "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": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "6aaa189ddb4ff6b5de8fa3210f2fb42c87b4d12e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/6aaa189ddb4ff6b5de8fa3210f2fb42c87b4d12e", + "reference": "6aaa189ddb4ff6b5de8fa3210f2fb42c87b4d12e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a", + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-01T08:31:23+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-28T12:35:13+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "65befb3bb2d503bbffbd08c815aa38b472999917" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917", + "reference": "65befb3bb2d503bbffbd08c815aa38b472999917", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "tomatophp/console-helpers", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/console-helpers.git", + "reference": "69dd818a2bfa7d038467fb526be6c9b573d36a34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/console-helpers/zipball/69dd818a2bfa7d038467fb526be6c9b573d36a34", + "reference": "69dd818a2bfa7d038467fb526be6c9b573d36a34", + "shasum": "" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\ConsoleHelpers\\ConsoleHelpersServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\ConsoleHelpers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "EngFadyMondy@gmail.com" + } + ], + "description": "tons of helper you need for you artisan command line application", + "keywords": [ + "application", + "artisan", + "command", + "console", + "helpers", + "line" + ], + "support": { + "issues": "https://github.com/tomatophp/console-helpers/issues", + "source": "https://github.com/tomatophp/console-helpers/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/3x1io", + "type": "github" + } + ], + "time": "2023-02-12T12:00:38+00:00" + }, + { + "name": "tomatophp/filament-icons", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/filament-icons.git", + "reference": "30a1259a51498ee1b13de95409e1807e7ee69a80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/filament-icons/zipball/30a1259a51498ee1b13de95409e1807e7ee69a80", + "reference": "30a1259a51498ee1b13de95409e1807e7ee69a80", + "shasum": "" + }, + "require": { + "calebporzio/sushi": "*", + "filament/filament": "^3.0.0", + "php": "^8.1|^8.2", + "tomatophp/console-helpers": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\FilamentIcons\\FilamentIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\FilamentIcons\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "info@3x1.io" + } + ], + "description": "Picker & Table Column & Icons Provider for FilamentPHP", + "keywords": [ + "Heroicons", + "component", + "filament", + "filamentphp", + "icons picker", + "laravel", + "php" + ], + "support": { + "issues": "https://github.com/tomatophp/filament-icons/issues", + "source": "https://github.com/tomatophp/filament-icons/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/3x1io", + "type": "github" + } + ], + "time": "2024-07-21T15:41:17+00:00" + }, + { + "name": "tomatophp/filament-translation-component", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/filament-translation-component.git", + "reference": "6b7ea29bb772ebbe4d2acde6883c67f2b7a8071f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/filament-translation-component/zipball/6b7ea29bb772ebbe4d2acde6883c67f2b7a8071f", + "reference": "6b7ea29bb772ebbe4d2acde6883c67f2b7a8071f", + "shasum": "" + }, + "require": { + "filament/filament": "^3.0", + "filament/spatie-laravel-translatable-plugin": "^3.0", + "php": "^8.1|^8.2", + "tomatophp/console-helpers": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\FilamentTranslationComponent\\FilamentTranslationComponentServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\FilamentTranslationComponent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "info@3x1.io" + } + ], + "description": "Translation Component as a key/value to use it with Spatie Translatable FilamentPHP Plugin", + "keywords": [ + "laravel", + "php", + "template" + ], + "support": { + "issues": "https://github.com/tomatophp/filament-translation-component/issues", + "source": "https://github.com/tomatophp/filament-translation-component/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/3x1io", + "type": "github" + } + ], + "time": "2024-09-16T13:51:53+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.0.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-timer": "^6.0.0", + "phpunit/phpunit": "^10.5.36", + "sebastian/environment": "^6.1.0", + "symfony/console": "^6.4.7 || ^7.1.5", + "symfony/process": "^6.4.7 || ^7.1.5" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "squizlabs/php_codesniffer": "^3.10.3", + "symfony/filesystem": "^6.4.3 || ^7.1.5" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2024-10-15T12:45:19+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "filp/whoops", + "version": "2.16.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.16.0" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2024-09-25T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + }, + "time": "2024-03-08T09:58:59+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "085a2306b520c3896afa361c25704e5fa3c27bf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/085a2306b520c3896afa361c25704e5fa3c27bf0", + "reference": "085a2306b520c3896afa361c25704e5fa3c27bf0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0", + "illuminate/contracts": "^10.24|^11.0", + "illuminate/log": "^10.24|^11.0", + "illuminate/process": "^10.24|^11.0", + "illuminate/support": "^10.24|^11.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/pint": "^1.13", + "orchestra/testbench": "^8.12|^9.0", + "pestphp/pest": "^2.20", + "pestphp/pest-plugin-type-coverage": "^2.3", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2024-10-21T13:59:30+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.64.0", + "illuminate/view": "^10.48.20", + "larastan/larastan": "^2.9.8", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.35.1" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-09-24T17:22:50+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.0" + }, + "time": "2024-09-23T13:32:56+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.5.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.16.0", + "nunomaduro/termwind": "^2.1.0", + "php": "^8.2.0", + "symfony/console": "^7.1.5" + }, + "conflict": { + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" + }, + "require-dev": { + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.28.0", + "laravel/pint": "^1.18.1", + "laravel/sail": "^1.36.0", + "laravel/sanctum": "^4.0.3", + "laravel/tinker": "^2.10.0", + "orchestra/testbench-core": "^9.5.3", + "pestphp/pest": "^2.36.0 || ^3.4.0", + "sebastian/environment": "^6.1.0 || ^7.2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-10-15T16:06:32+00:00" + }, + { + "name": "nunomaduro/larastan", + "version": "v2.9.9", + "source": { + "type": "git", + "url": "https://github.com/larastan/larastan.git", + "reference": "148faa138f0d8acb7d85f4a55693d3e13b6048d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/larastan/larastan/zipball/148faa138f0d8acb7d85f4a55693d3e13b6048d2", + "reference": "148faa138f0d8acb7d85f4a55693d3e13b6048d2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.16", + "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.16", + "php": "^8.0.2", + "phpmyadmin/sql-parser": "^5.9.0", + "phpstan/phpstan": "^1.12.5" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0", + "nikic/php-parser": "^4.19.1", + "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", + "orchestra/testbench": "^7.33.0 || ^8.13.0 || ^9.0.3", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpunit/phpunit": "^9.6.13 || ^10.5.16" + }, + "suggest": { + "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Larastan\\Larastan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Can Vural", + "email": "can9119@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/larastan/larastan/issues", + "source": "https://github.com/larastan/larastan/tree/v2.9.9" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/canvural", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "abandoned": "larastan/larastan", + "time": "2024-10-15T19:41:22+00:00" + }, + { + "name": "orchestra/canvas", + "version": "v9.1.3", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas.git", + "reference": "dbe51d918c4614f9c5ac9b7b7d3baac2360daf5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas/zipball/dbe51d918c4614f9c5ac9b7b7d3baac2360daf5d", + "reference": "dbe51d918c4614f9c5ac9b7b7d3baac2360daf5d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.26", + "illuminate/database": "^11.26", + "illuminate/filesystem": "^11.26", + "illuminate/support": "^11.26", + "orchestra/canvas-core": "^9.0", + "orchestra/testbench-core": "^9.2", + "php": "^8.2", + "symfony/polyfill-php83": "^1.28", + "symfony/yaml": "^7.0" + }, + "require-dev": { + "laravel/framework": "^11.26", + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11.0", + "spatie/laravel-ray": "^1.35" + }, + "bin": [ + "canvas" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.0-dev" + }, + "laravel": { + "providers": [ + "Orchestra\\Canvas\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas/tree/v9.1.3" + }, + "time": "2024-10-02T01:00:54+00:00" + }, + { + "name": "orchestra/canvas-core", + "version": "v9.0.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas-core.git", + "reference": "3a29eecf324fe02e3e5628e422314b5cd1a80e48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/3a29eecf324fe02e3e5628e422314b5cd1a80e48", + "reference": "3a29eecf324fe02e3e5628e422314b5cd1a80e48", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^11.0", + "illuminate/filesystem": "^11.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.28" + }, + "require-dev": { + "laravel/framework": "^11.0", + "laravel/pint": "^1.6", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^9.0", + "phpstan/phpstan": "^1.10.6", + "phpunit/phpunit": "^10.1", + "symfony/yaml": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.0-dev" + }, + "laravel": { + "providers": [ + "Orchestra\\Canvas\\Core\\LaravelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Canvas\\Core\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Code Generators Builder for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas-core/tree/v9.0.0" + }, + "time": "2024-03-06T10:00:21+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v9.5.2", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "bc404d840ffbb722bf0bbb042251ef83223482f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/bc404d840ffbb722bf0bbb042251ef83223482f9", + "reference": "bc404d840ffbb722bf0bbb042251ef83223482f9", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.11", + "mockery/mockery": "^1.6", + "orchestra/testbench-core": "^9.5.3", + "orchestra/workbench": "^9.6", + "php": "^8.2", + "phpunit/phpunit": "^10.5 || ^11.0.1", + "symfony/process": "^7.0", + "symfony/yaml": "^7.0", + "vlucas/phpdotenv": "^5.4.1" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v9.5.2" + }, + "time": "2024-10-06T13:07:57+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v9.5.5", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "681a071a31e3b85ae080fa98614af0aec511cf6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/681a071a31e3b85ae080fa98614af0aec511cf6f", + "reference": "681a071a31e3b85ae080fa98614af0aec511cf6f", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.2", + "symfony/polyfill-php83": "^1.28" + }, + "conflict": { + "brianium/paratest": "<7.3.0 || >=8.0.0", + "laravel/framework": "<11.11.0 || >=12.0.0", + "laravel/serializable-closure": "<1.3.0 || >=2.0.0", + "nunomaduro/collision": "<8.0.0 || >=9.0.0", + "phpunit/phpunit": "<10.5.0 || 11.0.0 || >=11.5.0" + }, + "require-dev": { + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.11", + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^10.5 || ^11.0.1", + "spatie/laravel-ray": "^1.35", + "symfony/process": "^7.0", + "symfony/yaml": "^7.0", + "vlucas/phpdotenv": "^5.4.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel tresting (^7.3).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.23).", + "laravel/framework": "Required for testing (^11.11).", + "mockery/mockery": "Allow using Mockery for testing (^1.6).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5 || ^11.0).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.0).", + "symfony/yaml": "Required for Testbench CLI (^7.0).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "time": "2024-10-25T14:43:57+00:00" + }, + { + "name": "orchestra/workbench", + "version": "v9.7.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "1744d07bfeee488270039b3b21605f528c3b696d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/1744d07bfeee488270039b3b21605f528c3b696d", + "reference": "1744d07bfeee488270039b3b21605f528c3b696d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.11", + "laravel/pail": "^1.2", + "laravel/tinker": "^2.9", + "nunomaduro/collision": "^8.0", + "orchestra/canvas": "^9.1", + "orchestra/testbench-core": "^9.5.3", + "php": "^8.2", + "spatie/laravel-ray": "^1.35", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/yaml": "^7.0.3" + }, + "require-dev": { + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^10.5.35 || ^11.3.6", + "symfony/process": "^7.0.3" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "type": "library", + "autoload": { + "psr-4": { + "Orchestra\\Workbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Workbench Companion for Laravel Packages Development", + "keywords": [ + "dev", + "laravel", + "laravel-packages", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/workbench/issues", + "source": "https://github.com/orchestral/workbench/tree/v9.7.0" + }, + "time": "2024-10-24T06:22:45+00:00" + }, + { + "name": "pestphp/pest", + "version": "v2.36.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.3.1", + "nunomaduro/collision": "^7.11.0|^8.4.0", + "nunomaduro/termwind": "^1.16.0|^2.1.0", + "pestphp/pest-plugin": "^2.1.1", + "pestphp/pest-plugin-arch": "^2.7.0", + "php": "^8.1.0", + "phpunit/phpunit": "^10.5.36" + }, + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">10.5.36", + "sebastian/exporter": "<5.1.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^2.17.0", + "pestphp/pest-plugin-type-coverage": "^2.8.7", + "symfony/process": "^6.4.0|^7.1.5" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v2.36.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-10-15T15:30:56+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e05d2859e08c2567ee38ce8b005d044e72648c0b", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.1" + }, + "conflict": { + "pestphp/pest": "<2.2.3" + }, + "require-dev": { + "composer/composer": "^2.5.8", + "pestphp/pest": "^2.16.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-08-22T08:40:06+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/d23b2d7498475354522c3818c42ef355dca3fcda", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda", + "shasum": "" + }, + "require": { + "nunomaduro/collision": "^7.10.0|^8.1.0", + "pestphp/pest-plugin": "^2.1.1", + "php": "^8.1", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" + }, + "require-dev": { + "pestphp/pest": "^2.33.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-01-26T09:46:42+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/53df51169a7f9595e06839cce638c73e59ace5e8", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8", + "shasum": "" + }, + "require": { + "laravel/framework": "^10.48.9|^11.5.0", + "pestphp/pest": "^2.34.7", + "php": "^8.1.0" + }, + "require-dev": { + "laravel/dusk": "^7.13.0", + "orchestra/testbench": "^8.22.3|^9.0.4", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + }, + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-04-27T10:41:54+00:00" + }, + { + "name": "pestphp/pest-plugin-livewire", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-livewire.git", + "reference": "e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97", + "reference": "e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97", + "shasum": "" + }, + "require": { + "livewire/livewire": "^2.12.3|^3.0", + "pestphp/pest": "^2.9.1", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.5.10", + "pestphp/pest-dev-tools": "^2.12.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Livewire Plugin", + "keywords": [ + "framework", + "livewire", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-07-20T16:28:21+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-di/invoker", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2023-09-08T09:24:21+00:00" + }, + { + "name": "php-di/php-di", + "version": "7.0.7", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "shasum": "" + }, + "require": { + "laravel/serializable-closure": "^1.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.6" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2024-07-21T15:55:45+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpmyadmin/sql-parser", + "version": "5.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpmyadmin/sql-parser.git", + "reference": "91d980ab76c3f152481e367f62b921adc38af451" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/91d980ab76c3f152481e367f62b921adc38af451", + "reference": "91d980ab76c3f152481e367f62b921adc38af451", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpmyadmin/motranslator": "<3.0" + }, + "require-dev": { + "phpbench/phpbench": "^1.1", + "phpmyadmin/coding-standard": "^3.0", + "phpmyadmin/motranslator": "^4.0 || ^5.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.9.12", + "phpstan/phpstan-phpunit": "^1.3.3", + "phpunit/phpunit": "^8.5 || ^9.6", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.11", + "zumba/json-serializer": "~3.0.2" + }, + "suggest": { + "ext-mbstring": "For best performance", + "phpmyadmin/motranslator": "Translate messages to your favorite locale" + }, + "bin": [ + "bin/highlight-query", + "bin/lint-query", + "bin/sql-parser", + "bin/tokenize-query" + ], + "type": "library", + "autoload": { + "psr-4": { + "PhpMyAdmin\\SqlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" + } + ], + "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", + "homepage": "https://github.com/phpmyadmin/sql-parser", + "keywords": [ + "analysis", + "lexer", + "parser", + "query linter", + "sql", + "sql lexer", + "sql linter", + "sql parser", + "sql syntax highlighter", + "sql tokenizer" + ], + "support": { + "issues": "https://github.com/phpmyadmin/sql-parser/issues", + "source": "https://github.com/phpmyadmin/sql-parser" + }, + "funding": [ + { + "url": "https://www.phpmyadmin.net/donate/", + "type": "other" + } + ], + "time": "2024-08-29T20:56:34+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" + }, + "time": "2024-09-04T20:21:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" + }, + "time": "2024-10-13T11:25:22+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.12.7", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-10-18T11:12:07+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.12" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "support": { + "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" + }, + "time": "2024-09-11T15:52:35+00:00" + }, + { + "name": "phpstan/phpstan-phpunit", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-phpunit.git", + "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/f3ea021866f4263f07ca3636bf22c64be9610c11", + "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.11" + }, + "conflict": { + "phpunit/phpunit": "<7.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPUnit extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-phpunit/issues", + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.0" + }, + "time": "2024-04-20T06:39:00+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.36", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-10-08T15:36:51+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.4", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + }, + "time": "2024-06-10T01:18:23+00:00" + }, + { + "name": "rector/rector", + "version": "1.2.8", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/05755bf43617449c08ee8e50fb840c85ad3b1240", + "reference": "05755bf43617449c08ee8e50fb840c85ad3b1240", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.12.5" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.2.8" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-10-18T11:54:27+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-18T14:56:07+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9", + "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.6.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-07-22T08:21:24+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.37.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/c2bedfd1172648df2c80aaceb2541d70f1d9a5b9", + "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/database": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/queue": "^7.20|^8.19|^9.0|^10.0|^11.0", + "illuminate/support": "^7.20|^8.19|^9.0|^10.0|^11.0", + "php": "^7.4|^8.0", + "rector/rector": "^0.19.2|^1.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.41.1", + "symfony/stopwatch": "4.2|^5.1|^6.0|^7.0", + "zbateson/mail-mime-parser": "^1.3.1|^2.0|^3.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19|^9.0|^10.0|^11.0", + "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.22|^2.0", + "phpstan/phpstan": "^1.10.57", + "phpunit/phpunit": "^9.3|^10.1", + "spatie/pest-plugin-snapshots": "^1.1|^2.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + }, + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.37.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-07-12T12:35:17+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.41.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1|^6.0|^7.0", + "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18|^9.0", + "nesbot/carbon": "^2.63", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.19.2", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "bin": [ + "bin/remove-ray.sh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.41.2" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-04-24T14:21:46+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T12:04:04+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.4", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" + }, + "time": "2024-01-05T14:10:56+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/e0d4423fe27850c9dd301190767dbc421acc2f19", + "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "php-di/php-di": "^6.0|^7.0", + "psr/log": "^1|^2|^3", + "zbateson/mb-wrapper": "^2.0", + "zbateson/stream-decorators": "^2.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "monolog/monolog": "^2|^3", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-08-10T18:44:09+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/9e4373a153585d12b6c621ac4a6bb143264d4619", + "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "<10.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-03-20T01:38:07+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5", + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "zbateson/mb-wrapper": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^9.6|^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/2.1.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-04-29T21:42:39+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^8.1|^8.2" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/filament-types.php b/config/filament-types.php index 7acb3fa..8249877 100644 --- a/config/filament-types.php +++ b/config/filament-types.php @@ -1,75 +1,47 @@ [ - "posts" => "posts", - "accounts" => "accounts", - ], - - /** - * Types - * - * Category of types like if you use posts it can be Category/Tags - */ - "types" => [ - "posts" => [ - "category" => "category", - "tag" => "tag", - ], - "accounts" => [ - "user" => "user", - "admin" => "admin", - ] - ], - /** * Type API Middelware * * Set the middleware for the API of Types it can be empty if you need it public */ - "middleware" => ['auth:sanctum'], - + 'middleware' => ['auth:sanctum'], /** * Types API Resource * * If you need to use a resource for the API of Types you can set it here */ - "types_resource" => null, + 'types_resource' => null, /** * Show Navigation Menu * * If you need to show the navigation menu for the types */ - "show_navigation" => true, + 'show_navigation' => true, /** * Empty State * * If type Column is Empty Put This Message */ - "empty_state" => null, - + 'empty_state' => null, /** * Locals * * If you need to use locals for the types you can set it here */ - "locals" => [ - "ar" => [ - "ar" => "العربية", - "en" => "Arabic", + 'locals' => [ + 'ar' => [ + 'ar' => 'العربية', + 'en' => 'Arabic', ], - "en" => [ - "ar" => "الإنجليزية", - "en" => "English", + 'en' => [ + 'ar' => 'الإنجليزية', + 'en' => 'English', ], - ] + ], ]; diff --git a/database/migrations/2022_09_11_223298_create_types_table.php b/database/migrations/2022_09_11_223298_create_types_table.php index 6c30b95..b055320 100644 --- a/database/migrations/2022_09_11_223298_create_types_table.php +++ b/database/migrations/2022_09_11_223298_create_types_table.php @@ -1,8 +1,8 @@ id(); - - $table->foreignId('parent_id')->nullable()->references('id')->on('types')->onDelete('cascade'); + if (! Schema::hasTable('types')) { + Schema::create('types', function (Blueprint $table) { + $table->id(); + $table->foreignId('parent_id')->nullable()->references('id')->on('types')->onDelete('cascade'); - //Morph - $table->string('model_type')->nullable(); - $table->unsignedBigInteger('model_id')->nullable(); + //Morph + $table->string('model_type')->nullable(); + $table->unsignedBigInteger('model_id')->nullable(); - //Types - $table->string('for')->default('posts')->nullable(); - $table->string('type')->default('category')->nullable(); + //Types + $table->string('for')->default('posts')->nullable(); + $table->string('type')->default('category')->nullable(); - $table->string('name'); - $table->string('key')->unique()->index(); - $table->text('description')->nullable(); + $table->string('name'); + $table->string('key')->unique()->index(); + $table->text('description')->nullable(); - //Icon & Color - $table->string('color')->nullable(); - $table->string('icon')->nullable(); + //Icon & Color + $table->string('color')->nullable(); + $table->string('icon')->nullable(); - $table->boolean('is_activated')->default(true)->nullable(); - $table->timestamps(); - }); + $table->boolean('is_activated')->default(true)->nullable(); + $table->timestamps(); + }); + } } /** diff --git a/database/migrations/2023_02_13_134607_create_types_metas_table.php b/database/migrations/2023_02_13_134607_create_types_metas_table.php index 7c371c2..5afd060 100644 --- a/database/migrations/2023_02_13_134607_create_types_metas_table.php +++ b/database/migrations/2023_02_13_134607_create_types_metas_table.php @@ -1,8 +1,8 @@ id(); + if (! Schema::hasTable('types_metas')) { + Schema::create('types_metas', function (Blueprint $table) { + $table->id(); - //Link To Table - $table->unsignedBigInteger('model_id')->nullable(); - $table->string('model_type')->nullable(); + //Link To Table + $table->unsignedBigInteger('model_id')->nullable(); + $table->string('model_type')->nullable(); - $table->foreignId('type_id')->references('id')->on('types')->onDelete('cascade'); - $table->string('key')->index(); - $table->json('value')->nullable(); + $table->foreignId('type_id')->references('id')->on('types')->onDelete('cascade'); + $table->string('key')->index(); + $table->json('value')->nullable(); - $table->timestamps(); - }); + $table->timestamps(); + }); + } } /** diff --git a/database/migrations/2023_02_13_143941_create_typables_table.php b/database/migrations/2023_02_13_143941_create_typables_table.php index 461258e..88ee8bd 100644 --- a/database/migrations/2023_02_13_143941_create_typables_table.php +++ b/database/migrations/2023_02_13_143941_create_typables_table.php @@ -1,8 +1,8 @@ foreignId("type_id")->references('id')->on('types')->onDelete('cascade'); + if (! Schema::hasTable('typables')) { + Schema::create('typables', function (Blueprint $table) { + $table->foreignId('type_id')->references('id')->on('types')->onDelete('cascade'); - $table->unsignedBigInteger("typables_id"); - $table->string("typables_type"); - }); + $table->unsignedBigInteger('typables_id'); + $table->string('typables_type'); + }); + } } /** diff --git a/database/migrations/2023_06_13_143941_drop_unique_key_from_types_table.php b/database/migrations/2023_06_13_143941_drop_unique_key_from_types_table.php index 346c359..487d778 100644 --- a/database/migrations/2023_06_13_143941_drop_unique_key_from_types_table.php +++ b/database/migrations/2023_06_13_143941_drop_unique_key_from_types_table.php @@ -1,8 +1,8 @@ dropUnique('types_key_unique'); }); diff --git a/database/migrations/2024_09_11_143941_update_types_table.php b/database/migrations/2024_09_11_143941_update_types_table.php index e771c67..c8244f2 100644 --- a/database/migrations/2024_09_11_143941_update_types_table.php +++ b/database/migrations/2024_09_11_143941_update_types_table.php @@ -1,8 +1,8 @@ id(); + + $table->morphs('model'); + $table->uuid()->nullable()->unique(); + $table->string('collection_name'); + $table->string('name'); + $table->string('file_name'); + $table->string('mime_type')->nullable(); + $table->string('disk'); + $table->string('conversions_disk')->nullable(); + $table->unsignedBigInteger('size'); + $table->json('manipulations'); + $table->json('custom_properties'); + $table->json('generated_conversions'); + $table->json('responsive_images'); + $table->unsignedInteger('order_column')->nullable()->index(); + + $table->nullableTimestamps(); + }); + } + } +}; diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..efde7c9 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,28 @@ + + + + + ./tests/ + + + + + ./src + + + + + + + + + diff --git a/pint.json b/pint.json new file mode 100644 index 0000000..c6ddb49 --- /dev/null +++ b/pint.json @@ -0,0 +1,14 @@ +{ + "preset": "laravel", + "rules": { + "blank_line_before_statement": true, + "concat_space": { + "spacing": "one" + }, + "method_argument_space": true, + "single_trait_insert_per_statement": true, + "types_spaces": { + "space": "single" + } + } +} diff --git a/resources/lang/ar/messages.php b/resources/lang/ar/messages.php index 59eb5e5..cc034c6 100644 --- a/resources/lang/ar/messages.php +++ b/resources/lang/ar/messages.php @@ -3,29 +3,29 @@ return [ 'title' => 'الانواع', 'single' => 'نوع', - "exists" => "عذرا هذا النوع موجود بالفعل", - "success" => "تم إنشاء النوع بنجاح", + 'exists' => 'عذرا هذا النوع موجود بالفعل', + 'success' => 'تم إنشاء النوع بنجاح', 'group' => 'الإعدادات', 'create' => 'إنشاء نوع', 'edit' => 'تعديل نوع', 'delete' => 'حذف نوع', 'notification' => [ - "edit" => [ - "title" => "تم تحديث النوع", - "body" => "تم تحديث النوع بنجاح" + 'edit' => [ + 'title' => 'تم تحديث النوع', + 'body' => 'تم تحديث النوع بنجاح', ], - "error" => [ - "title" => "خطأ", - "body" => "لا يمكنك حذف هذا النوع" + 'error' => [ + 'title' => 'خطأ', + 'body' => 'لا يمكنك حذف هذا النوع', ], - "delete" => [ - "title" => "تم حذف النوع", - "body" => "تم حذف النوع بنجاح" + 'delete' => [ + 'title' => 'تم حذف النوع', + 'body' => 'تم حذف النوع بنجاح', + ], + 'create' => [ + 'title' => 'تم إنشاء النوع', + 'body' => 'تم إنشاء النوع بنجاح', ], - "create" => [ - "title" => "تم إنشاء النوع", - "body" => "تم إنشاء النوع بنجاح" - ] ], 'back' => 'رجوع', 'language' => 'اللغة', @@ -45,5 +45,5 @@ ], 'base' => [ 'title' => 'الانواع', - ] + ], ]; diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index c45393c..1920cdf 100644 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -3,29 +3,29 @@ return [ 'title' => 'Types', 'single' => 'Type', - "exists" => "Sorry This Type is already exists", - "success" => "Type Created Successfully", + 'exists' => 'Sorry This Type is already exists', + 'success' => 'Type Created Successfully', 'group' => 'Settings', 'create' => 'Create Type', 'edit' => 'Edit Type', 'delete' => 'Delete Type', 'notification' => [ - "edit" => [ - "title" => "Type Updated", - "body" => "Type Updated Successfully" - ], - "error" => [ - "title" => "Error", - "body" => "You can't delete this type" - ], - "delete" => [ - "title" => "Type Deleted", - "body" => "Type Deleted Successfully" - ], - "create" => [ - "title" => "Type Created", - "body" => "Type Created Successfully" - ] + 'edit' => [ + 'title' => 'Type Updated', + 'body' => 'Type Updated Successfully', + ], + 'error' => [ + 'title' => 'Error', + 'body' => "You can't delete this type", + ], + 'delete' => [ + 'title' => 'Type Deleted', + 'body' => 'Type Deleted Successfully', + ], + 'create' => [ + 'title' => 'Type Created', + 'body' => 'Type Created Successfully', + ], ], 'back' => 'Back', 'language' => 'Language', @@ -45,5 +45,5 @@ ], 'base' => [ 'title' => 'Types', - ] + ], ]; diff --git a/routes/web.php b/routes/web.php index 50cce95..b3d9bbc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,3 +1 @@ r, $this->g, $this->b) = sscanf($this->type->color, "#%02x%02x%02x"); - + public ?string $label = null, + ) { + [$this->r, $this->g, $this->b] = sscanf($this->type->color, '#%02x%02x%02x'); - if($this->type->icon){ + if ($this->type->icon) { try { app(\BladeUI\Icons\Factory::class)->svg($this->type->icon); $this->iconExists = true; - }catch (\Exception $e){} + } catch (\Exception $e) { + } } } diff --git a/src/Components/TypeColumn.php b/src/Components/TypeColumn.php index 8b0cbb8..627c3a0 100644 --- a/src/Components/TypeColumn.php +++ b/src/Components/TypeColumn.php @@ -2,18 +2,15 @@ namespace TomatoPHP\FilamentTypes\Components; -use Filament\Support\Concerns\HasLineClamp; -use Filament\Tables\Columns\Column; use Filament\Tables\Columns\TextColumn; -use Filament\Tables\Columns\TextColumn\TextColumnSize; -use Filament\Tables\Contracts\HasTable; -use Filament\Tables\Columns\Concerns; class TypeColumn extends TextColumn { - public string|\Closure|null $for = null; - public string|\Closure|null $type = null; - public bool|\Closure|null $allowDescription = false; + public string | \Closure | null $for = null; + + public string | \Closure | null $type = null; + + public bool | \Closure | null $allowDescription = false; protected string $view = 'filament-types::columns.type-column'; @@ -27,21 +24,24 @@ public function getType(): ?string return (string) $this->evaluate($this->type); } - public function for(string|\Closure $for): static + public function for(string | \Closure $for): static { $this->for = $for; + return $this; } - public function type(string|\Closure $type): static + public function type(string | \Closure $type): static { $this->type = $type; + return $this; } - public function allowDescription(bool|\Closure $allowDescription=true): static + public function allowDescription(bool | \Closure $allowDescription = true): static { $this->allowDescription = $allowDescription; + return $this; } diff --git a/src/Console/FilamentTypesInstall.php b/src/Console/FilamentTypesInstall.php index 9aaae17..275976c 100644 --- a/src/Console/FilamentTypesInstall.php +++ b/src/Console/FilamentTypesInstall.php @@ -28,7 +28,6 @@ public function __construct() parent::__construct(); } - /** * Execute the console command. * @@ -37,8 +36,8 @@ public function __construct() public function handle() { $this->info('Publish Vendor Assets'); - $this->artisanCommand(["migrate"]); - $this->artisanCommand(["optimize:clear"]); + $this->artisanCommand(['migrate']); + $this->artisanCommand(['optimize:clear']); $this->info('Filament Types installed successfully.'); } } diff --git a/src/Facades/FilamentTypes.php b/src/Facades/FilamentTypes.php index c8f8ade..c2f59d0 100644 --- a/src/Facades/FilamentTypes.php +++ b/src/Facades/FilamentTypes.php @@ -3,12 +3,11 @@ namespace TomatoPHP\FilamentTypes\Facades; use Illuminate\Support\Facades\Facade; - +use TomatoPHP\FilamentTypes\Services\Contracts\TypeFor; /** - * @method static void register(array|string $type, string $for) - * @method static \Illuminate\Support\Collection getFor() - * @method static \Illuminate\Support\Collection getTypes(string $for) + * @method static void register(array|TypeFor $types) + * @method static \Illuminate\Support\Collection get() */ class FilamentTypes extends Facade { diff --git a/src/Filament/Resources/TypeResource.php b/src/Filament/Resources/TypeResource.php new file mode 100644 index 0000000..66c831f --- /dev/null +++ b/src/Filament/Resources/TypeResource.php @@ -0,0 +1,64 @@ + \TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Pages\ListTypes::route('/'), + ]; + } +} diff --git a/tests/Feature/.gitkeep b/src/Filament/Resources/TypeResource/Actions/Components/.gitkeep similarity index 100% rename from tests/Feature/.gitkeep rename to src/Filament/Resources/TypeResource/Actions/Components/.gitkeep diff --git a/src/Filament/Resources/TypeResource/Actions/Components/Action.php b/src/Filament/Resources/TypeResource/Actions/Components/Action.php new file mode 100644 index 0000000..524ece8 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Actions/Components/Action.php @@ -0,0 +1,8 @@ +label(trans('filament-types::messages.create')) + ->using(function (array $data) { + $checkExistsType = Type::query() + ->where('key', $data['key']) + ->where('for', $data['for']) + ->where('type', $data['type']) + ->first(); + + if ($checkExistsType) { + Notification::make() + ->title(trans('filament-types::messages.exists')) + ->danger() + ->send(); + + return $checkExistsType; + + } else { + $type = Type::create($data); + + Notification::make() + ->title(trans('filament-types::messages.success')) + ->success() + ->send(); + + return $type; + } + }) + ->successNotification(null); + } +} diff --git a/tests/Unit/.gitkeep b/src/Filament/Resources/TypeResource/Actions/Contracts/.gitkeep similarity index 100% rename from tests/Unit/.gitkeep rename to src/Filament/Resources/TypeResource/Actions/Contracts/.gitkeep diff --git a/src/Filament/Resources/TypeResource/Actions/Contracts/CanRegister.php b/src/Filament/Resources/TypeResource/Actions/Contracts/CanRegister.php new file mode 100644 index 0000000..59f3990 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Actions/Contracts/CanRegister.php @@ -0,0 +1,56 @@ +getActions(); + } + + public function getActions(): array + { + return collect($this->getDefaultActions())->merge(self::$actions)->map(function (StaticAction $action) { + if (method_exists($action, 'record') && str($action->getName())->contains(['create', 'edit', 'view'])) { + $action->record(method_exists(self::$page, 'getRecord') ? self::$page->getRecord() : null) + ->model(method_exists(self::$page, 'getModel') ? self::$page->getModel() : null) + ->modelLabel(method_exists(self::$page, 'getModelLabel') ? get_model_label(self::$page->getModel()) : null) + ->form(fn (Form $form) => app(self::$page->getResource())::form($form)) + ->url(fn () => isset(app(self::$page->getResource())::getPages()[$action->getName()]) ? app(app(self::$page->getResource())::getPages()[$action->getName()]->getPage())->getUrl() : null); + } + + return $action; + })->toArray(); + } + + public static function register(StaticAction | array | \Closure $component): void + { + if (is_array($component)) { + foreach ($component as $item) { + if ($item instanceof StaticAction) { + self::$actions[] = $item; + } + } + } elseif ($component instanceof \Closure) { + self::$actions[] = (new self)->evaluate($component); + } else { + self::$actions[] = $component; + } + } +} diff --git a/src/Filament/Resources/TypeResource/Actions/ManagePageActions.php b/src/Filament/Resources/TypeResource/Actions/ManagePageActions.php new file mode 100644 index 0000000..9a8dfe3 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Actions/ManagePageActions.php @@ -0,0 +1,18 @@ +required() + ->label(trans('filament-types::messages.form.color')); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/Component.php b/src/Filament/Resources/TypeResource/Form/Components/Component.php new file mode 100644 index 0000000..92f8065 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/Component.php @@ -0,0 +1,10 @@ +label(trans('filament-types::messages.form.description')) + ->columnSpanFull(); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/Icon.php b/src/Filament/Resources/TypeResource/Form/Components/Icon.php new file mode 100644 index 0000000..c67be2a --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/Icon.php @@ -0,0 +1,16 @@ +required() + ->label(trans('filament-types::messages.form.icon')); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/Image.php b/src/Filament/Resources/TypeResource/Form/Components/Image.php new file mode 100644 index 0000000..c6c2c0d --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/Image.php @@ -0,0 +1,19 @@ +label(trans('filament-types::messages.form.image')) + ->columnSpan(2) + ->collection('image') + ->image() + ->maxFiles(1); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/IsActive.php b/src/Filament/Resources/TypeResource/Form/Components/IsActive.php new file mode 100644 index 0000000..65b7b75 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/IsActive.php @@ -0,0 +1,15 @@ +label(trans('filament-types::messages.form.is_activated')); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/Key.php b/src/Filament/Resources/TypeResource/Form/Components/Key.php new file mode 100644 index 0000000..c518894 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/Key.php @@ -0,0 +1,17 @@ +label(trans('filament-types::messages.form.key')) + ->required() + ->maxLength(255); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/Name.php b/src/Filament/Resources/TypeResource/Form/Components/Name.php new file mode 100644 index 0000000..2da406a --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/Name.php @@ -0,0 +1,17 @@ +label(trans('filament-types::messages.form.name')) + ->required() + ->maxLength(255); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/TypeFor.php b/src/Filament/Resources/TypeResource/Form/Components/TypeFor.php new file mode 100644 index 0000000..bda7f8a --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/TypeFor.php @@ -0,0 +1,24 @@ +label(trans('filament-types::messages.form.for')) + ->options(FilamentTypes::get()->pluck('label', 'for')->toArray()) + ->searchable() + ->afterStateUpdated(function (Forms\Set $set) { + $set('type', null); + $set('parent_id', null); + }) + ->live() + ->required(); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/TypeOf.php b/src/Filament/Resources/TypeResource/Form/Components/TypeOf.php new file mode 100644 index 0000000..ba21255 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/TypeOf.php @@ -0,0 +1,21 @@ +label(trans('filament-types::messages.form.type')) + ->options(function (Forms\Get $get) { + return $get('for') ? collect(FilamentTypes::get()->where('for', $get('for'))->first()?->types)->pluck('label', 'type')->toArray() : []; + }) + ->searchable() + ->required(); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/Components/TypeParent.php b/src/Filament/Resources/TypeResource/Form/Components/TypeParent.php new file mode 100644 index 0000000..b12ef04 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/Components/TypeParent.php @@ -0,0 +1,23 @@ +label(trans('filament-types::messages.form.parent_id')) + ->columnSpan(2) + ->options(Type::whereNull('parent_id') + ->get() + ->pluck('name', 'id') + ->toArray()) + ->searchable() + ->live(); + } +} diff --git a/src/Filament/Resources/TypeResource/Form/TypeForm.php b/src/Filament/Resources/TypeResource/Form/TypeForm.php new file mode 100644 index 0000000..98525f6 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Form/TypeForm.php @@ -0,0 +1,50 @@ +schema(self::getSchema())->columns(2); + } + + public static function getDefaultComponents(): array + { + return [ + Components\Image::make(), + Components\TypeFor::make(), + Components\TypeOf::make(), + Components\Name::make(), + Components\Key::make(), + Components\Description::make(), + Components\Icon::make(), + Components\Color::make(), + Components\IsActive::make(), + ]; + } + + private static function getSchema(): array + { + return array_merge(self::getDefaultComponents(), self::$schema); + } + + public static function register(Field | array $component): void + { + if (is_array($component)) { + foreach ($component as $item) { + if ($item instanceof Field) { + self::$schema[] = $item; + } + } + + } else { + self::$schema[] = $component; + } + } +} diff --git a/src/Filament/Resources/TypeResource/InfoList/Entries/.gitkeep b/src/Filament/Resources/TypeResource/InfoList/Entries/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TypeResource/InfoList/Entries/Entry.php b/src/Filament/Resources/TypeResource/InfoList/Entries/Entry.php new file mode 100644 index 0000000..c4870c4 --- /dev/null +++ b/src/Filament/Resources/TypeResource/InfoList/Entries/Entry.php @@ -0,0 +1,8 @@ +schema(self::getSchema()); + } + + public static function getDefaultComponents(): array + { + return [ + // + ]; + } + + private static function getSchema(): array + { + return array_merge(self::getDefaultComponents(), self::$schema); + } + + public static function register(Entry | array $component): void + { + if (is_array($component)) { + foreach ($component as $item) { + if ($item instanceof Entry) { + self::$schema[] = $item; + } + } + + } else { + self::$schema[] = $component; + } + } +} diff --git a/src/Filament/Resources/TypeResource/Pages/ListTypes.php b/src/Filament/Resources/TypeResource/Pages/ListTypes.php new file mode 100644 index 0000000..0409aeb --- /dev/null +++ b/src/Filament/Resources/TypeResource/Pages/ListTypes.php @@ -0,0 +1,30 @@ +iconButton() + ->tooltip(__('filament-actions::delete.single.label')); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Actions/EditAction.php b/src/Filament/Resources/TypeResource/Table/Actions/EditAction.php new file mode 100644 index 0000000..1a54ea2 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Actions/EditAction.php @@ -0,0 +1,15 @@ +iconButton() + ->tooltip(__('filament-actions::edit.single.label')); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Actions/ViewAction.php b/src/Filament/Resources/TypeResource/Table/Actions/ViewAction.php new file mode 100644 index 0000000..2864afc --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Actions/ViewAction.php @@ -0,0 +1,15 @@ +iconButton() + ->tooltip(__('filament-actions::view.single.label')); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/BulkActions/.gitkeep b/src/Filament/Resources/TypeResource/Table/BulkActions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TypeResource/Table/BulkActions/Action.php b/src/Filament/Resources/TypeResource/Table/BulkActions/Action.php new file mode 100644 index 0000000..75fb999 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/BulkActions/Action.php @@ -0,0 +1,10 @@ +dateTime() + ->description(fn ($record) => $record->created_at->diffForHumans()) + ->toggleable(isToggledHiddenByDefault: true) + ->sortable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/Id.php b/src/Filament/Resources/TypeResource/Table/Columns/Id.php new file mode 100644 index 0000000..2e281c0 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/Id.php @@ -0,0 +1,14 @@ +sortable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/IsActive.php b/src/Filament/Resources/TypeResource/Table/Columns/IsActive.php new file mode 100644 index 0000000..d2830e6 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/IsActive.php @@ -0,0 +1,14 @@ +label(trans('filament-types::messages.form.is_activated')); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/Key.php b/src/Filament/Resources/TypeResource/Table/Columns/Key.php new file mode 100644 index 0000000..f115773 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/Key.php @@ -0,0 +1,18 @@ +for(fn ($record) => $record->for) + ->type(fn ($record) => $record->type) + ->label(trans('filament-types::messages.form.key')) + ->sortable() + ->searchable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/TypeFor.php b/src/Filament/Resources/TypeResource/Table/Columns/TypeFor.php new file mode 100644 index 0000000..cf7d3cb --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/TypeFor.php @@ -0,0 +1,15 @@ +label(trans('filament-types::messages.form.for')) + ->sortable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/TypeOf.php b/src/Filament/Resources/TypeResource/Table/Columns/TypeOf.php new file mode 100644 index 0000000..243ab6e --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/TypeOf.php @@ -0,0 +1,15 @@ +label(trans('filament-types::messages.form.type')) + ->sortable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Columns/UpdatedAt.php b/src/Filament/Resources/TypeResource/Table/Columns/UpdatedAt.php new file mode 100644 index 0000000..becf344 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Columns/UpdatedAt.php @@ -0,0 +1,17 @@ +dateTime() + ->description(fn ($record) => $record->updated_at->diffForHumans()) + ->toggleable(isToggledHiddenByDefault: true) + ->sortable(); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/Filters/.gitkeep b/src/Filament/Resources/TypeResource/Table/Filters/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TypeResource/Table/Filters/Filter.php b/src/Filament/Resources/TypeResource/Table/Filters/Filter.php new file mode 100644 index 0000000..17023ae --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/Filters/Filter.php @@ -0,0 +1,8 @@ +form([ + Forms\Components\Select::make('for') + ->label(trans('filament-types::messages.form.for')) + ->options(FilamentTypes::get()->pluck('label', 'for')->toArray()) + ->searchable() + ->preload() + ->afterStateUpdated(function (Forms\Set $set) { + $set('type', null); + $set('parent_id', null); + }) + ->live(), + Forms\Components\Select::make('type') + ->label(trans('filament-types::messages.form.type')) + ->options(fn (Forms\Get $get) => $get('for') ? collect(FilamentTypes::get()->where('for', $get('for'))->first()?->types)->pluck('label', 'type')->toArray() : []) + ->searchable(), + Forms\Components\Select::make('parent_id') + ->label(trans('filament-types::messages.form.parent_id')) + ->options( + fn (Forms\Get $get) => Type::whereNull('parent_id') + ->where('for', $get('for')) + ->where('type', $get('type')) + ->get() + ->pluck('name', 'id') + ->toArray() + ) + ->searchable() + ->live(), + ]) + ->query(function (Builder $query, array $data): Builder { + if (isset($data['for']) && ! empty($data['for'])) { + $query->where('for', $data['for']); + } + if (isset($data['type']) && ! empty($data['type'])) { + $query->where('type', $data['type']); + } + if (isset($data['parent_id']) && ! empty($data['parent_id'])) { + $query->where('parent_id', $data['parent_id']); + } + + return $query; + }); + } +} diff --git a/src/Filament/Resources/TypeResource/Table/HeaderActions/.gitkeep b/src/Filament/Resources/TypeResource/Table/HeaderActions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TypeResource/Table/HeaderActions/Action.php b/src/Filament/Resources/TypeResource/Table/HeaderActions/Action.php new file mode 100644 index 0000000..aeecc99 --- /dev/null +++ b/src/Filament/Resources/TypeResource/Table/HeaderActions/Action.php @@ -0,0 +1,8 @@ +deferLoading() + ->bulkActions(TypeBulkActions::make()) + ->actions(TypeActions::make()) + ->filters(TypeFilters::make()) + ->headerActions(TypeHeaderActions::make()) + ->groups([ + Tables\Grouping\Group::make('for'), + Tables\Grouping\Group::make('type'), + ]) + ->deferLoading() + ->defaultGroup('for') + ->defaultSort('order') + ->reorderable('order') + ->columns(self::getColumns()); + } + + public static function getDefaultColumns(): array + { + return [ + Columns\TypeFor::make(), + Columns\TypeOf::make(), + Columns\Key::make(), + Columns\IsActive::make(), + Columns\CreatedAt::make(), + Columns\UpdatedAt::make(), + ]; + } + + private static function getColumns(): array + { + return array_merge(self::getDefaultColumns(), self::$columns); + } + + public static function register(Column | array $column): void + { + if (is_array($column)) { + foreach ($column as $item) { + if ($item instanceof Column) { + self::$columns[] = $item; + } + } + } else { + self::$columns[] = $column; + } + } +} diff --git a/src/FilamentTypesPlugin.php b/src/FilamentTypesPlugin.php index 22373f5..635a2ba 100644 --- a/src/FilamentTypesPlugin.php +++ b/src/FilamentTypesPlugin.php @@ -4,14 +4,44 @@ use Filament\Contracts\Plugin; use Filament\Panel; -use Nwidart\Modules\Module; -use TomatoPHP\FilamentTypes\Resources\TypeResource; use Filament\SpatieLaravelTranslatablePlugin; - +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource; class FilamentTypesPlugin implements Plugin { - private bool $isActive = false; + protected static array $locals = ['ar', 'en']; + + protected static array $types = []; + + /** + * @return $this + */ + public function locals(array $locals): self + { + self::$locals = $locals; + + return $this; + } + + public function getLocals(): array + { + return self::$locals; + } + + /** + * @return $this + */ + public function types(array $types): self + { + self::$types = $types; + + return $this; + } + + public function getTypes(): array + { + return self::$types; + } public function getId(): string { @@ -20,24 +50,13 @@ public function getId(): string public function register(Panel $panel): void { - if(class_exists(Module::class) && \Nwidart\Modules\Facades\Module::find('FilamentTypes')?->isEnabled()){ - $this->isActive = true; - } - else { - $this->isActive = true; - } - - if($this->isActive) { - $panel - ->plugin( - SpatieLaravelTranslatablePlugin::make() - ->defaultLocales(['en', 'ar']), - ) - ->resources([ - TypeResource::class - ]); - } - + $panel->plugin( + SpatieLaravelTranslatablePlugin::make() + ->defaultLocales($this->getLocals()), + ) + ->resources([ + TypeResource::class, + ]); } public function boot(Panel $panel): void @@ -45,8 +64,8 @@ public function boot(Panel $panel): void // } - public static function make(): static + public static function make(): FilamentTypesPlugin { - return new static(); + return new FilamentTypesPlugin; } } diff --git a/src/FilamentTypesServiceProvider.php b/src/FilamentTypesServiceProvider.php index 4fdee7b..25d07e4 100644 --- a/src/FilamentTypesServiceProvider.php +++ b/src/FilamentTypesServiceProvider.php @@ -4,7 +4,7 @@ use Illuminate\Support\ServiceProvider; -require_once __DIR__.'/helpers.php'; +require_once __DIR__ . '/helpers.php'; class FilamentTypesServiceProvider extends ServiceProvider { @@ -12,45 +12,45 @@ public function register(): void { //Register generate command $this->commands([ - \TomatoPHP\FilamentTypes\Console\FilamentTypesInstall::class, + \TomatoPHP\FilamentTypes\Console\FilamentTypesInstall::class, ]); //Register Config file - $this->mergeConfigFrom(__DIR__.'/../config/filament-types.php', 'filament-types'); + $this->mergeConfigFrom(__DIR__ . '/../config/filament-types.php', 'filament-types'); //Publish Config $this->publishes([ - __DIR__.'/../config/filament-types.php' => config_path('filament-types.php'), + __DIR__ . '/../config/filament-types.php' => config_path('filament-types.php'), ], 'filament-types-config'); //Register Migrations - $this->loadMigrationsFrom(__DIR__.'/../database/migrations'); + $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); //Publish Migrations $this->publishes([ - __DIR__.'/../database/migrations' => database_path('migrations'), + __DIR__ . '/../database/migrations' => database_path('migrations'), ], 'filament-types-migrations'); //Register views - $this->loadViewsFrom(__DIR__.'/../resources/views', 'filament-types'); + $this->loadViewsFrom(__DIR__ . '/../resources/views', 'filament-types'); //Publish Views $this->publishes([ - __DIR__.'/../resources/views' => resource_path('views/vendor/filament-types'), + __DIR__ . '/../resources/views' => resource_path('views/vendor/filament-types'), ], 'filament-types-views'); //Register Langs - $this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'filament-types'); + $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'filament-types'); //Publish Lang $this->publishes([ - __DIR__.'/../resources/lang' => base_path('lang/vendor/filament-types'), + __DIR__ . '/../resources/lang' => base_path('lang/vendor/filament-types'), ], 'filament-types-lang'); //Register Routes - $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); + $this->loadRoutesFrom(__DIR__ . '/../routes/web.php'); - $this->app->bind('filament-types', function(){ - return new Services\FilamentTypesRegister(); + $this->app->bind('filament-types', function () { + return new Services\FilamentTypesServices; }); $this->loadViewComponentsAs('tomato', [ diff --git a/src/Models/Type.php b/src/Models/Type.php index e25c807..31dfd79 100644 --- a/src/Models/Type.php +++ b/src/Models/Type.php @@ -4,43 +4,42 @@ use GeneaLabs\LaravelModelCaching\CachedModel; use GeneaLabs\LaravelModelCaching\Traits\Cachable; -use Illuminate\Database\Eloquent\Model; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\Translatable\HasTranslations; /** - * @property integer $id - * @property integer $parent_id + * @property int $id + * @property int $parent_id * @property string $name * @property string $key * @property string $description * @property string $color * @property string $icon * @property string $model_type - * @property integer $model_id - * @property boolean $is_activated + * @property int $model_id + * @property bool $is_activated * @property string $created_at * @property string $updated_at * @property Type[] $typables */ class Type extends CachedModel implements HasMedia { - use InteractsWithMedia; - use HasTranslations; use Cachable; + use HasTranslations; + use InteractsWithMedia; - protected $cachePrefix = "tomato_types_"; + protected $cachePrefix = 'tomato_types_'; public $translatable = [ 'name', - 'description' + 'description', ]; /** * @var array */ - protected $fillable = ['order', 'for','name', 'key','type', 'description', 'color', 'icon', 'parent_id','model_type','model_id','is_activated','created_at', 'updated_at']; + protected $fillable = ['order', 'for', 'name', 'key', 'type', 'description', 'color', 'icon', 'parent_id', 'model_type', 'model_id', 'is_activated', 'created_at', 'updated_at']; /** * @return \Illuminate\Database\Eloquent\Relations\HasMany @@ -52,6 +51,6 @@ public function typables() public function parent() { - return $this->belongsTo('TomatoPHP\FilamentTypes\Models\Type','parent_id'); + return $this->belongsTo('TomatoPHP\FilamentTypes\Models\Type', 'parent_id'); } } diff --git a/src/Models/TypesMeta.php b/src/Models/TypesMeta.php index c65d818..8670470 100644 --- a/src/Models/TypesMeta.php +++ b/src/Models/TypesMeta.php @@ -4,12 +4,11 @@ use GeneaLabs\LaravelModelCaching\CachedModel; use GeneaLabs\LaravelModelCaching\Traits\Cachable; -use Illuminate\Database\Eloquent\Model; /** - * @property integer $id - * @property integer $type_id - * @property integer $model_id + * @property int $id + * @property int $type_id + * @property int $model_id * @property string $model_type * @property string $key * @property mixed $value @@ -21,7 +20,8 @@ class TypesMeta extends CachedModel { use Cachable; - protected $cachePrefix = "tomato_types_meta_"; + protected $cachePrefix = 'tomato_types_meta_'; + /** * @var array */ diff --git a/src/Pages/BaseTypePage.php b/src/Pages/BaseTypePage.php index a4334be..7e688cc 100644 --- a/src/Pages/BaseTypePage.php +++ b/src/Pages/BaseTypePage.php @@ -4,13 +4,11 @@ use Filament\Forms\Components\ColorPicker; use Filament\Forms\Components\Grid; -use Filament\Forms\Components\KeyValue; use Filament\Forms\Components\TextInput; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; -use Filament\Forms\Form; use Filament\Notifications\Notification; -use Filament\Pages\Actions\Action; +use Filament\Actions\Action; use Filament\Pages\Page; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; @@ -20,14 +18,14 @@ use TomatoPHP\FilamentTypes\Components\TypeColumn; use TomatoPHP\FilamentTypes\Models\Type; -class BaseTypePage extends Page implements HasTable, HasForms +class BaseTypePage extends Page implements HasForms, HasTable { - use InteractsWithTable; use InteractsWithForms; + use InteractsWithTable; public array $data = []; - protected static string $view = "filament-types::pages.base"; + protected static string $view = 'filament-types::pages.base'; public static function shouldRegisterNavigation(): bool { @@ -47,7 +45,7 @@ protected function getHeaderActions(): array ->form([ Grid::make([ 'md' => 2, - 'sm' => 1 + 'sm' => 1, ])->schema([ Translation::make('name') ->columnSpanFull() @@ -60,9 +58,9 @@ protected function getHeaderActions(): array ->label(trans('filament-types::messages.form.icon')), ColorPicker::make('color') ->label(trans('filament-types::messages.form.color')), - ]) + ]), ]) - ->action(function (array $data){ + ->action(function (array $data) { $data['for'] = $this->getFor(); $data['type'] = $this->getType(); Type::create($data); @@ -75,20 +73,20 @@ protected function getHeaderActions(): array }), Action::make('back') ->label(trans('filament-types::messages.back')) - ->url(fn() => $this->getBackUrl()) + ->url(fn () => $this->getBackUrl()) ->color('warning') - ->icon('heroicon-s-arrow-left') + ->icon('heroicon-s-arrow-left'), ]; } public function getType(): string { - return "status"; + return 'status'; } public function getFor(): string { - return "types"; + return 'types'; } protected static ?string $navigationIcon = 'heroicon-o-cog'; @@ -97,20 +95,20 @@ public function getFor(): string public function getTypes(): array { - return []; + return []; } public function mount(): void { - foreach ($this->getTypes() as $type){ + foreach ($this->getTypes() as $type) { $exists = Type::query() ->where('for', $this->getFor()) ->where('type', $this->getType()) ->where('key', $type->key) ->first(); - if(!$exists){ + if (! $exists) { $type->for = $this->getFor(); - $type->type = $this->getType(); + $type->type = $this->getType(); $exists = Type::create($type->toArray()); } } @@ -121,7 +119,6 @@ public function getTitle(): string return trans('filament-types::messages.base.title'); } - public function getCreateAction(): bool { return true; @@ -140,7 +137,7 @@ public function table(Table $table): Table TypeColumn::make('key') ->for($this->getFor()) ->type($this->getType()) - ->label(trans('filament-types::messages.form.key')) + ->label(trans('filament-types::messages.form.key')), ]) ->actions([ \Filament\Tables\Actions\Action::make('edit') @@ -149,7 +146,7 @@ public function table(Table $table): Table ->form([ Grid::make([ 'md' => 2, - 'sm' => 1 + 'sm' => 1, ])->schema([ Translation::make('name') ->columnSpanFull() @@ -158,7 +155,7 @@ public function table(Table $table): Table ->label(trans('filament-types::messages.form.icon')), ColorPicker::make('color') ->label(trans('filament-types::messages.form.color')), - ]) + ]), ]) ->extraModalFooterActions([ \Filament\Tables\Actions\Action::make('deleteType') @@ -167,8 +164,8 @@ public function table(Table $table): Table ->label(trans('filament-types::messages.delete')) ->cancelParentActions() ->action(function (array $data, $record) { - foreach ($this->getTypes() as $getType){ - if($getType->key == $record->key){ + foreach ($this->getTypes() as $getType) { + if ($getType->key == $record->key) { Notification::make() ->title(trans('filament-types::messages.notification.error.title')) ->body(trans('filament-types::messages.notification.error.body')) @@ -185,19 +182,19 @@ public function table(Table $table): Table ->body(trans('filament-types::messages.notification.delete.body')) ->success() ->send(); - }) + }), ]) - ->fillForm(fn($record) => $record->toArray()) + ->fillForm(fn ($record) => $record->toArray()) ->icon('heroicon-s-pencil-square') ->iconButton() - ->action(function (array $data, Type $type){ + ->action(function (array $data, Type $type) { $type->update($data); Notification::make() ->title(trans('filament-types::messages.notification.edit.title')) ->body(trans('filament-types::messages.notification.edit.body')) ->success() ->send(); - }) + }), ]); } } diff --git a/src/Resources/TypeResource.php b/src/Resources/TypeResource.php deleted file mode 100644 index 26fbafe..0000000 --- a/src/Resources/TypeResource.php +++ /dev/null @@ -1,251 +0,0 @@ - $type){ - $mergeFor[$key] = $key; - $mergeTypes[$key] = []; - } - - foreach (FilamentTypes::getFor() as $for){ - $mergeFor[$for] = $for; - - $providerTypes = FilamentTypes::getTypes($for); - foreach ($providerTypes as $key=>$type){ - $mergeTypes[$key] = []; - } - } - foreach (config('filament-types.types') as $key => $type){ - foreach ($type as $item){ - if(!in_array($item, $mergeTypes[$key])) { - $mergeTypes[$key][$item] = $item; - } - } - - } - foreach (FilamentTypes::getFor() as $for){ - $providerTypes = FilamentTypes::getTypes($for); - foreach ($providerTypes as $key => $type){ - foreach ($type as $item){ - if(!in_array($item, $mergeTypes[$key])){ - $mergeTypes[$key][$item] = $item; - } - } - } - } - - return !empty($getFor) ? collect($mergeTypes)->filter(fn($types, $key) => $key === $getFor)->toArray() : $mergeFor; - } - - - public static function form(Form $form): Form - { - return $form - ->schema([ - Forms\Components\SpatieMediaLibraryFileUpload::make('image') - ->label(trans('filament-types::messages.form.image')) - ->columnSpan(2) - ->collection('image') - ->image() - ->maxFiles(1), - Forms\Components\Select::make('for') - ->label(trans('filament-types::messages.form.for')) - ->options(static::getTypes()) - ->searchable() - ->afterStateUpdated(function (Forms\Set $set){ - $set('type', null); - $set('parent_id', null); - }) - ->live() - ->required(), - Forms\Components\Select::make('type') - ->label(trans('filament-types::messages.form.type')) - ->options(function(Forms\Get $get){ - return $get('for') ? static::getTypes($get('for')) : []; - }) - ->searchable() - ->required(), - Forms\Components\Select::make('parent_id') - ->label(trans('filament-types::messages.form.parent_id')) - ->columnSpan(2) - ->options(Type::whereNull('parent_id') - ->get() - ->pluck('name', 'id') - ->toArray()) - ->searchable() - ->live(), - Forms\Components\TextInput::make('name') - ->label(trans('filament-types::messages.form.name')) - ->required() - ->maxLength(255), - Forms\Components\TextInput::make('key') - ->label(trans('filament-types::messages.form.key')) - ->required() - ->maxLength(255), - Forms\Components\Textarea::make('description') - ->label(trans('filament-types::messages.form.description')) - ->columnSpanFull(), - Forms\Components\ColorPicker::make('color') - ->required() - ->label(trans('filament-types::messages.form.color')), - IconPicker::make('icon') - ->required() - ->label(trans('filament-types::messages.form.icon')), - Forms\Components\Toggle::make('is_activated') - ->label(trans('filament-types::messages.form.is_activated')), - ]); - } - - public static function table(Table $table): Table - { - return $table - ->columns([ - Tables\Columns\TextColumn::make('for') - ->label(trans('filament-types::messages.form.for')) - ->searchable(), - Tables\Columns\TextColumn::make('type') - ->label(trans('filament-types::messages.form.type')) - ->searchable(), - TypeColumn::make('key') - ->for(fn($record) => $record->for) - ->type(fn($record) => $record->type) - ->label(trans('filament-types::messages.form.key')) - ->searchable(), - Tables\Columns\ToggleColumn::make('is_activated') - ->label(trans('filament-types::messages.form.is_activated')), - Tables\Columns\TextColumn::make('created_at') - ->label(trans('filament-types::messages.form.created_at')) - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - Tables\Columns\TextColumn::make('updated_at') - ->label(trans('filament-types::messages.form.updated_at')) - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - ]) - ->groups([ - Tables\Grouping\Group::make('for'), - Tables\Grouping\Group::make('type'), - ]) - ->defaultGroup('for') - ->defaultSort('order') - ->reorderable('order') - ->filters([ - Tables\Filters\Filter::make('created_at') - ->form([ - Forms\Components\Select::make('for') - ->label(trans('filament-types::messages.form.for')) - ->options(static::getTypes()) - ->searchable() - ->preload() - ->afterStateUpdated(function (Forms\Set $set){ - $set('type', null); - $set('parent_id', null); - }) - ->live(), - Forms\Components\Select::make('type') - ->label(trans('filament-types::messages.form.type')) - ->options(fn(Forms\Get $get) => $get('for') ? static::getTypes($get('for')) : []) - ->searchable(), - Forms\Components\Select::make('parent_id') - ->label(trans('filament-types::messages.form.parent_id')) - ->options(fn(Forms\Get $get) => Type::whereNull('parent_id') - ->where('for', $get('for')) - ->where('type', $get('type')) - ->get() - ->pluck('name', 'id') - ->toArray() - ) - ->searchable() - ->live() - ]) - ->query(function (Builder $query, array $data): Builder { - if(isset($data['for']) && !empty($data['for'])) - $query->where('for', $data['for']); - if(isset($data['type']) && !empty($data['type'])) - $query->where('type', $data['type']); - if(isset($data['parent_id']) && !empty($data['parent_id'])) - $query->where('parent_id', $data['parent_id']); - - return $query; - }) - ]) - ->actions([ - Tables\Actions\EditAction::make() - ->tooltip(__('filament-actions::edit.single.label')) - ->iconButton(), - Tables\Actions\ReplicateAction::make() - ->tooltip(__('filament-actions::replicate.single.label')) - ->iconButton(), - Tables\Actions\DeleteAction::make() - ->tooltip(__('filament-actions::delete.single.label')) - ->iconButton(), - ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), - ]), - ]); - } - - public static function getRelations(): array - { - return [ - // - ]; - } - - public static function getPages(): array - { - return [ - 'index' => Pages\ListTypes::route('/') - ]; - } -} diff --git a/src/Resources/TypeResource/Pages/ListTypes.php b/src/Resources/TypeResource/Pages/ListTypes.php deleted file mode 100644 index d024f50..0000000 --- a/src/Resources/TypeResource/Pages/ListTypes.php +++ /dev/null @@ -1,67 +0,0 @@ -label(trans('filament-types::messages.create')) - ->using(function (array $data) { - $checkExistsType = Type::query() - ->where('key', $data['key']) - ->where('for', $data['for']) - ->where('type', $data['type']) - ->first(); - - if($checkExistsType){ - Notification::make() - ->title(trans('filament-types::messages.exists')) - ->danger() - ->send(); - return $checkExistsType; - - } - else { - $type = Type::create($data); - - Notification::make() - ->title(trans('filament-types::messages.success')) - ->success() - ->send(); - - return $type; - } - }) - ->successNotification(null), - Actions\LocaleSwitcher::make() - ]; - } -} diff --git a/src/Services/Contracts/Type.php b/src/Services/Contracts/Type.php index 1e21faf..5d73d87 100644 --- a/src/Services/Contracts/Type.php +++ b/src/Services/Contracts/Type.php @@ -5,50 +5,53 @@ class Type { public string $key; - public array $name=[]; - public ?string $icon=null; - public ?string $color=null; - public ?string $for=null; - public ?string $type=null; + + public array | string $name = []; + + public ?string $icon = null; + + public ?string $color = null; public static function make(string $key): static { - return (new self())->key($key); + return (new self)->key($key); } public function key(string $key): static { $this->key = $key; + return $this; } - public function name(array $name): static + public function name(array | string $name): static { $this->name = $name; + return $this; } public function icon(string $icon): static { $this->icon = $icon; + return $this; } public function color(string $color): static { $this->color = $color; + return $this; } - public function toArray():array + public function toArray(): array { return [ 'key' => $this->key, 'name' => $this->name, 'icon' => $this->icon, 'color' => $this->color, - 'for' => $this->for, - 'type' => $this->type, ]; } } diff --git a/src/Services/Contracts/TypeFor.php b/src/Services/Contracts/TypeFor.php new file mode 100644 index 0000000..fa82125 --- /dev/null +++ b/src/Services/Contracts/TypeFor.php @@ -0,0 +1,47 @@ +for($for); + } + + public function label(string $label): static + { + $this->label = $label; + + return $this; + } + + public function for(string $for): static + { + $this->for = $for; + + return $this; + } + + public function types(array $types): static + { + $this->types = $types; + + return $this; + } + + public function toArray(): array + { + return [ + 'label' => $this->label ?: str($this->for)->title()->toString(), + 'for' => $this->for, + 'types' => $this->types, + ]; + } +} diff --git a/src/Services/Contracts/TypeOf.php b/src/Services/Contracts/TypeOf.php new file mode 100644 index 0000000..7092f09 --- /dev/null +++ b/src/Services/Contracts/TypeOf.php @@ -0,0 +1,47 @@ +type($type); + } + + public function label(string $label): static + { + $this->label = $label; + + return $this; + } + + public function type(string $type): static + { + $this->type = $type; + + return $this; + } + + public function register(array $types): static + { + $this->types = $types; + + return $this; + } + + public function toArray(): array + { + return [ + 'label' => $this->label ?: str($this->type)->title()->toString(), + 'type' => $this->type, + 'types' => $this->types, + ]; + } +} diff --git a/src/Services/FilamentTypesRegister.php b/src/Services/FilamentTypesRegister.php deleted file mode 100644 index 37b3825..0000000 --- a/src/Services/FilamentTypesRegister.php +++ /dev/null @@ -1,33 +0,0 @@ -types[$for] = []; - if(is_array($type)){ - foreach ($type as $item){ - $this->types[$for][] = $item; - } - } - else{ - $this->types[$for][] = $type; - } - } - - public function getFor(): Collection - { - return collect($this->types)->keys(); - } - - public function getTypes(string $for): Collection - { - return collect($this->types)->filter(fn($type, $key) => $key === $for); - } -} diff --git a/src/Services/FilamentTypesServices.php b/src/Services/FilamentTypesServices.php new file mode 100644 index 0000000..48e2650 --- /dev/null +++ b/src/Services/FilamentTypesServices.php @@ -0,0 +1,50 @@ +register($type); + } + } else { + $this->types[] = $types; + } + } + + public function get(): Collection + { + return collect($this->types) + ->merge(filament('filament-types')->getTypes()) + ->groupBy(fn ($typeFor) => $typeFor->for) // Group by `for` attribute + ->map(function ($group) { + return $group + ->groupBy(fn ($typeFor) => $typeFor->for) // Group by `label` within each `for` group + ->map(function ($labelGroup) { + $mergedTypes = $labelGroup->flatMap(fn ($typeFor) => $typeFor->types) + ->map(function ($getType) { + $getType->label = ! $getType->label ? str($getType->type)->title()->toString() : $getType->label; + + return $getType; + }) + ->unique('type') // Ensure unique by `type` + ->values(); // Reindex after unique filter + + $firstItem = $labelGroup->first(); + $firstItem->types = $mergedTypes->toArray(); + + return $firstItem; + }) + ->values(); + }) + ->flatten(); + } +} diff --git a/src/helpers.php b/src/helpers.php index 3bd4c90..7510492 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -1,7 +1,7 @@ where('key', $key) diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..73e6794 --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,5 @@ +in(__DIR__); diff --git a/tests/database/database.sqlite b/tests/database/database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..6141d00d3eeafdc06f1f353538ceb6a88a152831 GIT binary patch literal 520192 zcmeFa31A!7d8mtx1OXBl+p+}Pvg|QsM`9#FSh&lw%}w0*O=N5%2fzU^#9#)R8IS^F z#U;IDX`4l|<2AiWZ`!79(kAU~dfTSWdri}HNz?VVea&r?wl7Q5hK%VtK-}(RlY%_!T*$F|zd`4CZNaN#<8yrrj;{l#`IPU+1!{K-o z{uw`kkHRmW%3tv5H2uEIuTVx<`t=5gb#ebn(nPrLa{t=08937{w~RKs{ZIIQ&%fIA zW#2o!U+})O;oII-&!;>K?nhjob=~TG$~o#B-KF4HUhwE`jiHCSoDM-s#bos|g7ea3WhmN?QN5 zBncNvn8w{YFgMhTWiI)wrvfB zyrEFYxs5fH6!nT|k+&GNE%fzI44DcM(yhE8X*i1&zNiQVq?GwQF7rBsl!6Ob(s)UR zeme&{Qw%Bg6$yR)W^d>W zFh5M0XOJL5x2(xYHBl-F>4dJirr?9NpiK$P`EZs+uF8$`~cbEJ-+}ft|PV8op@Jd@$S+-Wgm(Wl=_8M)m3O#S|{u7iGwAwuP!G z@oAhvB~jxC7U$-MrWO(lqmx7P3w@I_ZQHNEk)nFSOHo1RB$7x=<*;h{^(HGSQ%nVw zjq&bk)tam!k*Yz>Pnf(x5ld-7%I==P(o+>jV=AB)pAgdOPKYukXheX&NFgbOMWUJn zo>3qPH@O$PY6MA8bM?8*4v$)8TU*CXjiJ$_yA22?n2D(Aj|1~JG=@$cbgI;LAVN)0 zZAn!BzR~Cv!_C(x(d~nTl1|b!t!>-Mc|!*eIv>-WIf*6zZrIVmG}E4)ilNUo+OVri zBTd7Fq6YQZFjlaNmGyeYt!N!w2^oycJyzBB@6mN_TXzR^Z_81YPa)9ugea%-s_ECD zm53>Z(1hWv)y~%C4GAl@G5BIpP>^oAI~!`%8d5r_P4H@JV-hG4HT}VDam{qN-nvw4 z9gT0XY0=f%vW`SM-?aCJw6!#b&W3i=e_eLH34uraFyA@i+&W5?T*b!pNJOfZK;T2y z1+Aw!;K**>U1>=oTKUblbzg%w)YawOK1@**k*aRU zFuNtjuO&1&k0sSMu+a+1HVq+$3*auQ2u#wq(!y)ep|5; zQQKfIEN7a?k_LIap(srJy;K!Rm#GO_oiS;mAq__Rt<(LTiFGxk;WZp>+Xvj#Q9Ry2 zvD0XJ@mR4|^X+*w*mVZ5dxz+4T*r!#5e&CqqYrwjtA=flk#$8O38rf8)Vk5YRGRHN zVaC-MI&s3eqFbfDdQ&lsYcNMJ7IT$9-4;%Dk;h5nPeM`{Zk*oGU3WRR5706TLRKFK z)Y@+@OG&M@h>E>eMhvt5?Yf+*X1B#eXLr@X7F6xXJ#e}GU;wVZV8+4yCHDdDF>a1K z7W`kq-wr+#%mljv|0nRLf#)Fs`(Xqa0Y-okU<4QeMt~7u1Q-EEfDyQk1lnJ4c^r9X zED~!^L?eke(VaiDx`T+ zQ%-#Yg`_1LwUvra2R#mCNgZ$RjC3VxsUc|rHm8jYp0kY^&_;OL zy=F{NXhv5o7K>DqVpM=VJlH~{+ptCj?o*8($3r?LfNSK6_E>U}EfAfQyRD%L)s(y@ z4^&bq`LxGqEA2K?a%V?(q?)vLfTtI&x{kR$j(J}s5{V{^|KayYtRf2C;HOPJ4hpfj zBVn|XP~TG3QxYB6k+RB!?(OK+2e{8Wyxg-6?rYrpxWC~3fcqHtA^4O1FanGKBftnS z0*nA7zz8q`i~u9R2rvSS!1sZG-|G&!=w6L`#qWaO>6$(GUxPbD z|5TfsJnoQ>-l5I8-AA3ZeFpUokk{{{g>g>zU9Re#0%~BJ+?#)2@W)7tE^*)CzRCR$ z?n~T1aQ_|d2lx}%4fq}Ix48ex{Sw?8@YCFTxaYa2xVLd{=C-*NKK__QKmegY|ZLE>j}gQ8rH_B?32-}M4oP`MPAfvTgg3*eAe7N{lpKv*7`ixru9WV#5z{7UtLt*V-w`(??-SwH z84dA6nGAex@`Ho(aJROE!)hw0$T*Fas^}@XU{l7aJw2mUVCtj6#r(*0^=9QW5zS)VD6;ZYk&?aareEAG`?6|HN zgGv}gRzyL<{0u6kaDEK|*LZ9-kbnNbOE^--3=$ozIPGaia1&jA$2~(j(V_GPJO{|1Q($rd19eG+ z^S`i~E5l$?Qv*A?(fEGou1I)VKHoXES*O52BO2c!H1vM^w<$<@c@vkzs)j*nwCgCgFtsvUT3trNeKs=M1Z|zU9QQkV44oz(c_62NCd);B zo(yd6Y~t zW=Amo!J}-NEOmEO1>R|nvEKHM{isQ16qjd`ODlq9o(O793a%5F1c48U`W;=y2sos| z3K2=0i0><9V4hE&!Clhux*$bs9=dLR1Z78i%$3{W+IyuDuAP^QaJ~2PDqPzy54wWC?eGULhTtzP_-XF_+}{Pi!nFrq8^7$n;yda3O7kZ?M*_d-j6oFJ@D<| zk2Z`2XWe&sB+q*rKI8i$H}85!;C|OoqwEwszwV6$9_2a%D~)0Irt24clJCczFSZ_muBv{bvL3YHDkE&i9A@e+&N4#+hJNxwKi=Hyn{N4J@H74oHh#G2&pe$?>E;hKCz`(Qzr!=__PS2G0^IL& zKk0re(9nMlyL(((PQYS#4aTcm-5stJDx|R#jZ_UA#w*`1-Q^x~VG$z0 zrU29TefSo4+$CaBKrw6950OGM8%R@ylx3g5_lvFWVOOD~6mw-*(uz4Of>)`H?_it0 zUkJIQE|_d9`P%qN!asPs`;03omtn62r?aRg3K8}LL=+k3jvGR4wMk_B`8(YAyEX-Q zpe78ffAGY$g%XMWIg)P^runF==GI7UKTD(#ld@uJGYNnHZSF1?JiL>FHCK17)ugPS zp@L@+ycMB}iDdcdBkr@Vin9-ELX8NC{V5V#5Xf`Nq8LW$S}ZB^eRsP1T&jj7c$q~y zT!6`(70Q1m;=n5y@{l>!WvTWjNhe%{Ngs^xH6{esdwKVOYYjYQ0p{5-*8+)a2}rH) zAu=T~f?c05hP9iO^?xD-r;(z_Qq1C3eLq2H7QpMm2252JQscWxL{`LEMYhWSB57Yr zgw762LS7bOJzmX7=)6GMmsyi@5{#iWAxYHpBntEZ1lHo6mR!%#T($*1OC-s`^Q(nO zcQp?Y@fi}akpm`Tt@{X!cM%QRCZW0d$Z(mI1y+W_X?T*iS`CSM=OOoLmqxZ$EWz&}J*CM>0fZ|lSyM+7 zL~kdegK@(X#$hlz1zDBVLd-lvbQ1(pg&J%^;mt(# z^6*Ll0h`bfao$9lngOLGR)od%x{Obfj7TiQW>nPLNly?rS3nnqLP-s4B?Z=@rXD6m zKTe8Pu>>yx3F88oYHh+v1b&RDu!xf?O694AnyMz*w@C$RX_G8u!dgx)6wNzgq=YT1 zVHjR7B1z#4yj{WS1Ac_ao&>cNa96y_ir{$k9`~dxE6D4RQJ|Jgo*D!>tEq?pZ=^O> zmcZvD01k6HYy2gmjw0+vr#otBNXAEq{vzu_oXGnI>WN`zFAQ74=Gur%o20oiOwpk# z0aRSULY*p?iRK7kFyWm}{vtskz@{fS-f&*V#iFGt8w5p4fa$Z`W0iHC6e?>uv~y$0 zS0e35!ZvEe>LE3v|B9SNIl!)vjbYRJm;g{obuf-$5%#Vuf+&P33}E{HW;lhETAvXL z7YL#hJmZNZcxt(`Hc*hrBJ~SN*rKtjzDznoEvF@+tEXBU$siFc-@vdS&V#v#<(dy5 z-BBP--+;SW5p2%a$srOsp%<_!A{2|J$r5SD3USa{Ss`y>3ajLG779GOET*dsBBh)sgh1Vh*;FHlCM*-L zpUlg3TD?SiLr^!6Bp?eNl4p??23Sy6%|=MX!cq6A%j7}8)g+U3eKk*pON{7_XNPtA zHb=^Z2`kL&tV7c*iID0}Q%JLBNCeFH1hunP6oE2LsA@8uvVw|cVd7V9Hpw_eI#?}| znPPYi!N6nHn@J)hObKBtwj8mV^#n0%@~WsEvujfBILT<(UERcDjCQn!VfzN4Laip7 zBqEPe2Mrbg!i2%GSLG#SN2p7HqZxP?K^Uny^Sp{=9wzz)6EWD}?5On#k?0&5Zs<@c zz?`3)Ng4jnQvMK8gB@p^zCqpD?s|mi8z2d;a!}{%C!lvd4)gVqcI|%dbn65I0~ z-~FT~Os6TZP@Y%q#x3gX7a(?&NSak}R#wah%Fvh1{{+zs z#Hfv4qumDLTE=AP+5m!tlSKA4SnrV`AWYXxRjD9N%U^yC5@DiR;H_YDURjq-dv7Gg zH?F+t3tG#UR~~4-@W}hKzOO?12T3zvv#uZ_%ju>6?_6Zn-$k5Uitwuq^hEFm|F6Qa z79==GvZ`yu-GypSrKyV$je`{tvv zx;`K=*&7I*# z;g(U6hX8(hok=26SF}*O?F&XJ8qCrtz-JFX|oiE1b3b}Kuv7VKc$WUx~aHX7_r};Oh zg|TR=upvyxhB_w)i(Q%XlbzEGvT#1$UtT@GT1>{5Hb>XA-1OQ|Cyq~cPHxIV`uvy* zVIa?B2jrL2BXb)d%lbqN(hr~0R+l>>6X%yUSI>`aPDpcNDn7fuvOK4u<@WXT@KP>$ zeo~l@M=R|qK%PxBFxmy}EbHx@>>MrhsH=L|288uM`9#*z>iLvOR#L{|28650Sh|=L zd*Z84+-vmjn~$*mrOaMk{kuGtnT*Y?O~r;fCKsl})wQL<>foF(J(%BEU7pIV6c#t9 z2D9Fce#ft+Y>qy&z&oM28nroug8JE)}1OC*x!J^RZkm70YGPu_Zy* z>lM(c(fp*8&rdFl<`uNz%SC*q8)DRwpY zv^aQfd?mkBT8Z|xFT`?aW#OE z)A>2v9b0bCsju+PSXiFwUtL=)Pe#+5OXsHM=N8T(6i*M#N$1Y3Mzp!<;f>AI`Qk`& zxCf<&mM*4-ig~1uHQ)cSf_BDr94mgHeF^awcx(G!Pt!w=I}bm0$&*7y(9r5nu!u0Y-okU<4QeM&Nr9IO%@K`BHaz8%SbuocL0X z58Y7n$(OpBPYQmiJ9!>*|G%62nuGfmy#1fNw1E9E0*nA7zz8q`i~u9R2rvSS03*N% zFanIg4?2Mcx6|ou@VFgL5B=4xum3;q;Jyvt{P+1E^yV@7839Is5nu!u0Y-okU<4Qe zMt~7u1Q>xIVggNWkCQy=)1d!y|7SepXHaiD35Y^K>lw8- z*4rwi$uAI)B%kfQtr99=BPc~bBfYKJ5`4>a!W5&B7${bOufBp}FF^@VM6G&SRXo!B z2B9}%tyJiZn(FK6ZH4dt*+`Ib%$3G_TQ@M32#STu5J*VNBH1rpB3DaOgx;8`)F@=9 z#llzf?Y-z&ebI4q(I8Jsf$!hLdoMU%UvPU}!KGsQWfk0BUvNiV!SGE=_~l64QD1PU zxnSsjqu`gtxwF3TE>qzZ#VDzm>KegL6y$pfv=Cn%F8Hwhe1YnvBx7r(!g??vx0(wN0aO%7)7W$!T2n8ifv9L(O!-(jXP zi$r@8>=Ol9Vbv4zPa7b=UlpUDSOjL zzSZvXJao{5qFp_m(F}YGC+>-Lb)-9DJ(>3I9(d_j24YeX2#KU(nK-EhR`b6!;PeQ` zUUIHpO(?*Z_Vz}*Vm;BGc)X{b7NVd3KjGls%YB-A;+4MeVe&Boi~u9R2rvSS03*N% zFanGKBftnS0^|e%7y(9r5nu!u0Y>0@5Mby3*Mll6lM!G9 z7y(9r5nu!u0Y-okU<4QeMt~7`Wf5TK|F5k6VA3!Gi~u9R2rvSS03*N%FanGKBftnS z0@s58JO95PR9Tsf03*N%FanGKBftnS0*nA7zz8q`jKC|406YJGW%UP>h7n){7y(9r z5nu!u0Y-okU<4QeMt~8x9t7C=|Mj5C%47r>0Y-okU<4QeMt~7u1Q-EEfDvE>UReal z`TreF|JA|$F85|`g1aI37s023tHIj?p9{P%kPW=1<%=yp*CMrqo4?Zh)6HUY*#8ax zNBm`fx9{J4ANBo+?}4U&hs^AU5nu!u0Y-okU<4R}?*oCsI~pBb2jcOJtfX)vjYX{C z1d_@L4Wq&aPR1g!_EXWwsc07;jrDeP^>##Uf*v^1=r~c0P$M#m|dUDageWuQM3 zstB(au&3I459!oO#q^#f?>(sJO(}TKdGEcs(Qyn~y)NL5y=zDQq}fa&;vKxX#1W@xbKD?+PT%vc2W?SXl2ZuiL_UPkHZk)v?}F?rx`v^`3H)^Zz>n zf`j`+@C-M~JrQ_s@E5sv2YxO1$$${t2)rrybl{JIp9%a!@autpvjWgJLG92fpxolx8CA8MS^$i-rZsp zV%e1o(b}xLZHH)>br)R&idW4n{V{oX@nY*9=N9xlZFvhG>qWD4jM*8i-m>}*lea@g!#=hj4+>-h7sCSqhW-2>sw{4;2X`YGQt|n zbsJ$GbKORm+gi5~>be1X!bkhZ2qEYHPVRRc@IU)u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4R}S1^HIIQ=L0kg262+y#cx1wner_ezlSe<$}<2mH@|7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EE;MG9jCb(zBXWb=W@Be=_bS!HFBftnS0*nA7zz8q`i~u9R2rvSS03&d9 z0_^?&SLefG839Is5nu!u0Y-okU<4QeMt~7u1Q>x=1A#!`NykC=BMxqb^9KGU@V1uC zz?o*bWwhDtf5P{B{?(>0``+pOg7=+`;f8N}KIK_(KjQkV>sIGe&Qa&+tD*hZtPP{L zHHIGQaykSljW4PfM1j1IxTMMS??gd{S9m0HNKL>a8U;aB1zA!PQQP3dTdrHYp`nm- ztAl1HZ)#8z5-Q+CwuF?l{%c7RE|f5hyLDi0sBdA2Uz{49T^!;^rv``4^Q~9Q*2>G0 zk)oA9-b%`DJ;}G$if?V(8VGqqp^$SMYbYt|711JZF=|`r>z^1h6(Xctc|p=}7At&F z5ei5t^Lbq6bqMgDkOG!8UXtNoNfevdAG8H+N?^{X(=|mB z45ZxFw(a8wD9^`3l&2|;>DQaBJWVk#izltwR!e0`!YK{xyp`ARMT_Qx;g;~u;36uE zG6FNIPmeFAaM8XfLw>U@R85Ib;|wZ^8b7c&H#ao3kXRU<9GYL~o1AIuxT!HTdUQ8$ z1$~uBA}y5zzY{h6abWxPH&Vh+cqw61lC zN()kU_XL&>uJ|WY0k!yqkXCoHmnnE70^CdrNhvH6jV8>E0!cW1owy~m+7S?)5hOv) z)#oz%Nove(ZSyxYhE5%Hs?>IXotmK9lBoWDqk-3O^Yuw|`yio&wytSy+fL3KI(X3e znC{F;EctiCj-H~K_Uu#)eYWY=T~!)s8ZHzysL!TP;I&j(S+9rHiq^rEkip1|-VFI_ zebBabcR=^H9M#8880q1Nsv zrMI)B(;wUx*Gz}&txL7m(fAgd7G13^>qxZoO?z)hTT5f;Y-l$Zqsy*0 zA@GPF<~v86TSuvqtJs(xiAdEF2z=Vevut+kVvbAd~+*6ZJ;UQ6PgH5$<{t6KJYLr0D{A9K=fsz_D&Y_fJ%C71|JjMB!y zDkWFU2waU&glB-$U_)SBMh*z22~ig2V7iZkpk0mA3aC=F$HrjZ#8NaPqiKuO`7gixnWF>+;-cS@K{$8qzq|4LL?y>px9|Ny?CrxtNHdk8tgih@7^JL8`rTSWCX+Q z*XVZ)PeV`N=XNRn?qAsSOn0_ttwm-g#~8CPTI#0lq$Zk77#O~o*-!C-GJ<|==> zEu88ikCVoqgrqRsIK82}?s9G)pk)?>tUeB?wclKpl3HsK6??CY7-s$3bvaedUS(ib zc{-ijIoP%Z{P#F+aAq9A69L@vxu(xGJ?;IYM%DYahL3yhZrF6+>-t;gcb%Ew@A=>9 zzo#X5%~s3y1#K;zpx$x&QOZm!7s+U^Rz6Q#c~yc5E%+USv)BCFY2O>Mk_GgzStLhHb4t3HJzYis?5oqP(xNEp?Y3GForjdt}d{+9`Xq>W5kzL-COF(JFLUftp8kB9nTL(Mn@J zO~b6oYCP%mxFT)a7QTzR(#P7W09Bg(?w#OX-o(06mCX>m`}PTJ5vZ~RizXrq4EBOl z21jx{+Gh3#dvT82^LKhf9UaccM`=4rkJN8v*@d-QDcB|f)2;1j>}H@er@iV}Ow(GD z)j(@;yPN4r-cnqpT5CZh^lC+zeRX}~Kz*x)whi-*q1ScnHesUacI+40g&y5Hb%!^U zIN{uSi0XN5PmzjhY(0W+(Ia$ENj53#65eICgSyz=i_xv4E;(@#dXVmP^xvt2ZQH)( zb}t!hAInm8s>@mT=bct1s*5GnREXNyh^gAjRM>0;dh|=stV$jGQH4qwpaj)=tH0}H z+Rh$n49%X{O(*IaZ{9wpUCnO|9rlLuUCymiohF#HfA@~86>my@$8K6-O0#>B^}1oo zbTtjRhI{GT{kPIp#^Xopl+7fHZNqQdP4P?_NgHZ^?&iMq;&+=|)Re(Sfi3>XT9Z{3 zYjOMVO}d~v4YtkUaQ#LXZ0PFC64DYiQGl%^H33s1eSvHW3|m#k6jMuX45_t}2uivE zvON*jH*pjCpjt~}D(IB8b4)R$9J4{2-SO^IXL>qg%4W68itB(-QqykzOvJAwHG3J; zjtZ2phk>_lJgU@f?Rnbv-DjTAbzeGFodQvqq|fv{c$)X5!II1|8zYT$X8yS6B%Rs3 zNq5mS9le~e0spd)7ZFUIH8aXxnOD`aVjz$b45P-nvdw+0D65)!%;+XPo}HytP7G_j zOuOHE(8gExS=x5TJ>Jl%Q_jba=x&3oRRjq(4(aAAotB&bK3=ECb;)0rN|WifS)t87 zVE3&LGICeDW`F*{sK3rXKVFVZfMt~7u1Q-EEfDvE>7y(9r5nu#fEd*|MdweIH zeZ}H~ljIgA^}$8By_tj79oi8ZyxD1!)~kR2A6@@{l>6wbg$rv3BftnS0*nA7zz8q` zi~u9R2rvSS03-0~A#kX{=RD!$>X!d*Xkh4sGguewI!IFcymi6)`v0FD+&^<4<39H4 zVZ&O&2rvSS03*N%FanGKBftnS0*nA7zzDpG2psh6vIB5v=LW#dkaoxVpWOd{2RG^9 zzRP`!`x^I8+&^-E%l#Gir`#WMpMV{KU*mq6`ylr-+^THizvm!aeV&`)+T=L^SFh(LxZdHp5w1r(H^B9F z4+q!7o*-Or^90~}tEUC7w|JW28uIwzddTC0>p@QwTyOSx;d;Q+2-ikW16&(C9=O5< zu5OPDuJF(8^O5uaJGcm0|9_MFD)$BMv)o_93V)rGxg3YMRaoCoa6{aETo)ICU4cK~ zKF)oV`xWjNU{ByZ+;iMz?nk-Df0(+MwUrTI1Q-EEfDvE>7y(9r5nu!u0Y>15gFvIl z>2uz62mQG52>rO>cKX2`rXRuE=ttmI`q6R={b&x+5C0+h;X6n_nr@~a-UIaGj+^Mm zksIm9?KjYm!yNs%El59Z4bYEUTIffpnSLDd(~pC&&IieEZlWIty!4~7k$yBZ&<~G? zez@KA!{zdLd_JH4{=Y9exG!>l&b{M@qYqgt839Is5nu!u0Y-okU<4QeMt~7u1Q>z; zXacwRy$;Er?qc$ZDk z>BdS1uT88?&}nj$0Ih+uiM0tL=l^c*OAhYq+?Tlj^+Vr73;-j*2rvSS03*N%FanGK zBftnS0*nA7@B>Z2>v1}r%|WmJ>21_Mxh8V{@3`Ryx@k;!Mt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-ok_#Onv`9E9#e-B73nh{_G7y(9r5nu!u0Y-okU<4QeMt~9c0VhDt{|`BS z)4|OIe=_j(K!3~A&HvaO_dnwMUEfVjE8d@K{BGlH!!w>QdAi*{=K4$5-A)-2I~?8c zuNVHEgny@u&lB+31OL8%KU?7|5BnX_czmnju6TS<3G>T>n8RX$pTKDeE2*+lQe)8v z@I_Q8ia0DQ*~%jjv2H%v-W%`e?P$L{R=ztLxw|JedVX=Lm|vTYDAThY$?~KSUcv41 zxIBd7b8?R;4xA3l+0#gig-bcSJbYTn3PNsadMLMEgkp^sF`5dt3EGNYdC2cLalauk zQs5xOO1?OoZVcQwJF#p2rxhBcbx9f zg&x3ZMM&lOei2D_?9vRDyODp!^G+GFmM&aGv}%bT0k_g#Ju%&{x41BuTXn6at~ zn4jN3l7KeUypWQWJXXqKz@Ms0ostVSZQl=Pj5lYZaojmB*c5CNv~~Q-s^4*sq0S>% z(Lgoik|L`YK&eHnTt`_agq}3o(A3C=jbJuGTPLrqfFf6P0x7asmiP%IWo0$Dna4P3 zmiO9g#Ax5DI2Y?!Tkp3K&L(K<#Fg`Y$FVM5Bc_#g0f6!&aI1HSf-p)hhjH`!fENAflRZGyHUR~Gz^He=M7L1o(eB?WB? z`4m!%SP6qmOADw<_u9*xj}JztUACMmM$)3R=bk3^Mf{0+5`dYIq(#Q;1i`33?2Pgkp!%OlM@9gyhaSr zB=fb0U0h!p*_a$gbCWg#+5~OIuFU!!T^4sS0Xl4mo-qg0|vUX8evb#(38!!Zb}vD?l5mIf2ZK_`$*Xq@2d#q+Au-4t8u`bGW6! zg;eI;;`r>!4jE(ZHbF4-P5T|E46$LxnE~75&mlm}kB&+r&cW34I?5YM^`UWb>B4N( zMmU=wn7&QbX32dLQZsf2>K|81P_QJmQ$^-~&40z)h5$8Og z$|0P=N=A^R?%D$6+M_Ma73B>ywKzOr)AKe#pbXtv^4kXdD@SWn zp=&R3e5NoMU+BLuTCx$(CTQ!mSH@uQGt6yFPJ>f}2~iHId6Z7kv7~Bj*IpZDa`M=q zJSmSY*obBm1kPa;CKYG&VQ)!TN8lM01txAec>}ItO;(E6QQrB*^k{J)H8d^T2xk-2 z0IPK;_Z_lkeFVX2$r2V@aXlGy;T z5iqEoplCS^bJ;hvVyU&abskBYAZ>5o^yF=N5vTf2YzJr&ld!;F04K17ONHSQnZPRr z8Ab~QEY8SH_5cRTu=X$WlO>X%_0oX8Ho^R`D8rP)NH|(lO9lQyN#NIIu~gKM27fA8 zfh&Uflz<96*1~*WDpgX6L?pa`we9WflU)XjzMjXnw>O_$q<;>aIot8r30+Lmx?v2u z2s~hQ50i(igrI=YC4C}42J2Ber_fjY{E{KlkRo9f8V@vJ?YG%_iL|C4YdKg2f{mtf zFuaT!X=h6U;#ENdDfyD7OAbo}n4&1Wh>|jC2x%R@n8HP^qzDj+E|f4|ROEFbjU|mo zB@Gw&0up2etGtTSyiin8A*ESA!OUZ)^K zejeHo=9hG;YLzCG#7p2AA(mH3Dey!gKVV+YWQ3F;sC-(;N}wA;L00(`^pBx=Dv$*|hTc-47}{;f1Q0p}(iXsMKsQJ& zM0sGX0*aD?+Idt{QNpu5h0;CgI-U+2cs4=XLr>0Ap7Ay?I)U=+lVAf1HX_a`0#?CZ zVFX^t!8D$HuLxR833&q$wdnzffY}ACt2c1#rJ-U@K|+BaFRhbsBcY)g8t9y^6G=c* zAOjHwg$BjYtuPI>DMU{&QQI&-uj_hR*G*n707~enixrBRkSwYEI)*JCAPag4dMXMO zD6BSU6oiHOMNuRP45NpxgI>eXU0_WJ7cozkshEI_VALJ!tOIGIn3gG`uB+|a;V0)P z$Wy28k8gMBAj=~C))th?W1?yOiY({JrpYjT8w<=BD;%L!fDsGX9DvJ7t(V5hsvlPS zsR>ld=3oKBSDe5QHDa^vnc8L23mzP1Rii+UL34yOVGA}1E|IFS%4-;Ux&$t#kC)(6&nrn zqY_viOl{2Li|*wGRe-UD3`J52h7_ZCPHjJ`8yi_9K-*!u08J3*H6+nh+6YV;K&7hlg-N8q)*nBtz-Unb-;c6susz5) zf)Mt{v9EEK4V(Fab6mZo2~bB<8U0i+SOsABkr{{%QfEbqtH7WfsqxYYk1?sM z&RGbZZq%8^9WRfLXZy^Ple)g$(|2qeQ#|Kjz#-ECasVY3)By|@1N&XD=~>aC2|-G$ z2xca!K{9RCG%_=V6&IYKn3EAzQ)-F>tp!EVgXrK0`+UTOsk-_IRkJgBd(bE{hVe;Q zio%CJV(Pv+r4bJgR!qiRGD$IJ6F3Q0Pli(ohHKp?%0)7{s3|n4zdlG)evyu3tbUU5 z630f@_P~=9I=^_|J;p3!oGv~wKMjopmqsTOQ$k)Rs=-tzYv|4pF<6)(Pn2Mvb^|;j z@pJ`nBN9)%qLFHz3~p6aI)SQ*5Syb3hzo>80$8h@N+FyA|4!#+RjT0gaZ$lJnBkI9 zvZ`TVZe$Rk>ZSVwG9c(P2Y!^y6v@n-s3454vU!*^4MBusBo^&Vzf8Z^xV`-3IOTZi zMAu!9-J|=x5^SJ>=YyjSN^}g?To`swsI}xO#yYLRpf@bb=?y^wer4hUM@m>U*(V53 z9X`HTn=L>iVT1%0WT8N31c*!t>Eg(k3IKP|uT-fhkSP^_AdHCuS5_#q#Ovwf4qXjc zoti%0fYMc+A9NL+mQ|f0*q022fwhr!2h5#iI5s5{WID++24%uF-rducY=3z+zLj}$ zjH2!7I2+vxQM9n6faxT_6k(#Y0Sh!(mgNSirV`tRbsmE03OS82FrI@|6j>1)r@O6} zreOUE>c)>DI8mWPw~-Q{@I`VKOyI#NYs`lA=?b_z&_X%~Ov9L~q9U}MkOh@PX=;sK z@%FAgPds47zy9QGfUNv!Q^_yvhY?@|7y(9r5nu!u0Y-okU<4QeMt~7u1YV5<*!us~ z*sH8fi~u9R2rvSS03*N%FanGKBftnS0*ru_fS>%y&i}1Y*k6nQBftnS0*nA7zz8q` zi~u9R2rvSSz^jY^JO6)`btr2NBftnS0*nA7zz8q`i~u9R2rvSS03%>SAkb2B_#6Mw z!7TN?_)^DsNQt&3pf|RI*$Bjyi(sxU%*Fs}SE#|^n+a8X2L#LrScdgh& zsU)P0#?V|b+s5eCnbOwPLtvd-mc+)R=Hyuuc z(pLr8nGD`0Tm;F4b)0|>%G#A=(e{e4gfP6kjFgYGRz3~CX@CWSOGWaBHMniuzmh_y520C$>yNMt~7u1Q-EEfDvE>7y(9r5nu!u0Y+fI z1lan2zXVx+Mt~7u1Q-EEfDvE>7y(9r5nu!u0Y>1JPk^oeU-^B+BxD2_0Y-okU<4Qe zMt~7u1Q-EEfDvE>_Dg`g|L>6FtqyKB_@2N&2YOrH(EK~iH~Sy-{Y=xpH!XT!X#A(f zj)ouc{E6pwH+Fr%`7h2cNPJy>w%RTa`W+`u$F~~pipQrF0rL|`$qN!clN%J}aCq<<%UL@`{{Rglq|KhEYK%qw6R+8o4lZasFH>-ESkNP0&`?<$k{-Zb;rI zCgEv6#1CcQ;Vo^G9~_*A=M*IzR#Q1e#_)h^RrHixuqkdo(3Sc0(1ak4Oq6X3wh7wm zxZDS#->*ZTQRGaRACya35vlw*JlUusfR3c_hM>xu`RgcnT!}`OmR8Z=c^fHhg0|w9 zAMiU)_347op@J+Sew+Y@hcYF2Fe?{MgXRd5Doa(dWhHA<)P8u6PiuI1a&2})vMJam zXe)C0e!t^%k1qB(M4k}k=g|f#OZ?!{q?*IZhAgMsqg9!&y^eI{=N5A#iv{(9jes^m zTPH8y=XV@EtIOOkCzEA<48xP!X$;iU;T#fixhn6qXN=~GiHT88@#uaOV>8yhFei@SneI9XNx?Qj zpcwbo6k`sad*mldSkvGEVWJosJcbQAf_vgsnRhD2eq~;n>F%4ISXmKe8v$*Cw!)Xs zfX9yOiZQ5!L1aY~B+SpCQVQqS5O9shc9S^P8|&&H{;3|^e zbGgUwxGSo&o<#asE@eS6%H1`@b&4G8jdb;P#P)-@C$l=z*|jF{c4F$Ixlwkq2@L zXtG@7=gELaCZj66)C1ls5QbSbZOc`}kMEOuzcN4Fb8)0^y&f?sxK4Z$v~}uo%z z&41kdf#$b2OU(<-z0F6P8~k7N|B?Tfoyh;Z|3~}}`_K7LxHA5meBbr`z3*eb_xT?8 ziM~QSZav`@KgR z|Gn{Zjh}4%smATbr0YcE{f&1tIvc*w@acw+G`y?fk%k8w1{;pMo@}_${ac=Id;Z4r zanH|se$-R&OnW+DSL5H^pK-s>op;YWd)#sNA=B2z5%*aatQKHm2+K;Ty~}LMfxmVA zq{E+-%UB81bm=tA!%~VY3AGg*^lmU0az|Y-0ZMgrn)3&fce?vrD2)ngSdmqj#Yt&P z{OYal4v2^H)L5h%1NIoa_YU{{t|UgV%@9VVq=IWhJ`A0~UYe0E>rD$YlJT`9BNAb< zAWLDT1aDEQmP;gU(Q6D`_X}7D(_07fr*a_K?DFy4`(-NTq4z zFnOy`o96JqzmW=| zdoGgh!SNa+kTvixlo7mK0|q{DZ002&iT-CIkAX0a*X24CfiHs=XwbQ^)r8Yoq*N;g zVSOKAZk9gj5X>=`W$xJq+2hf-0nPpqgj{UTk7fvOt-3 zshkB(O2gb2SyZ>>k8g3up@1|FC*^7j34uSM0u@qOu`F4#1Ol``QBLK`_`c`A1HU4kVI`ibsLsmTgI}f=}yOMbr5X>2TOOy?4sepZ@ z&3Q-*Hfd?lWC3?s7OB2RX=yo#s+I;BT7HFUXtt!~IlOwYgG=Y$2Y>e2lRXp34*|~-qL5yAEr76 zJ^}hO9bOmK1#Dh|K;8aF^|mNkRa4|b7)x?(stJ6 zLqrTL2`Si_gmPe7SQV6@zKN7vi;Z4{fELo=Qfg`#rC9!LA&a(SP zN*&VcmDXUH1r`F^qN-roR&4oQy#Sz-SITtjrYaWU?$Pw6*F|jQ%yi>_>f)$ z^_p1>Sz!CJwpmPycwTP+_4XLHhH8oc`F;P1wmV%?z=W#>6Y96<4zN^6A~1e%QWofb zhaRnMhEqt9VeqL{N~pb+_6Zm;bU7$tIEBeZiMfInq?e#*;QzuKWoSV)8hSPGqW14hIRk@kT4 z=o4ko7W3!`34A|Jkkt~Ta?l`Lqe{g316sGL!J&q^?v}H(ZZ)Tooj#b>f})w@eV?Pv zfdvqF+jwmj0!22jQ;H-ij6@Af8?dKrafANn61FOy=rZP1_b7*cnbKH zv~`-(@*}z&Yb7aOTSO6zEqWHP6l`*Hq;u)G1g~_1wU^0ZLLT2=QGHR;f|d(sVa8+? z;zd0c3`GPJts8!QM=0kFL&1bGtsj5Q7w{S zenhs!VA~GPEUJZqoGk@9seuGZGOdWjtC5g9@Dx=siEQ>k3&Sukf!Zu)=YP9iwU9(& zyjC?N^S_hgl(I13)o?;Y;0;v!fS4!~?Sog?S*8*G-=uv=;=u)kH!!@?(KP52Z}C5A z@9#9yqMj3h=OY_a3iwCUs0wvAkLg08a0b;pK2eJwqqg;83EL zCigm}bPlG%->$42bc4jW!%+;>fh)Oj`Gcx{w(Kr%@QT z5x_5+i)?ttaPe)(et1C-n$fQmpf+=C{&bO$u39uY}iN^CDTBK|)4EG~u+;?*m_WlB_t;ZUk_k7lK%&ocpFW1e^wBtjjHS+iUS2%hq z!k)6R>(&Q;5@wz9T@QBF^bPn__dWER1=@QfJ^R^sTVEK60?66P`XhHz zuuWZXCMm=ItZ^KopIgtv(osPCGRU1t!U0rGIYHNL%Gi&*#oTx_(w~_f9KW`pa=p?hhRFFhXXU1I#t#F+VkydFUFSg7giK(BcM&t*6GV4=&-S;IjN{&ew4Um zzK`q&ZNM@K!L1`!6Spa5KbRNKD;LJ+E^H1YZ3?ytf}@-~sIYMd!!RtUVBNrj`N4J& zxGZCB1ZO!K+!RnneeF#T4-Y5%GYb)^(?&>}Ah_FQ4dfm+P9ouqp%12_aLA{C==@R^ zCbKXz3B$sYE_G^aoNF(7cE11o=KPwNtiRi3cdsG9*`#r*vnq>-?}xKVWgQm5FzSah z7__^J`r2#t1t~XpVX$K|vSP#4CI~Ds2OHmpyyGx{3u%5?pDz|^@ zW7edxo`tEwnSQ}WMw=iw6TvW`R2&|<$oCmrpeihdBoNlL*1YzVGkuF47bJB+T(^^ds(Og|csE{w01mu+OT2?E1Q)uu#~NP@)= zxC)q4@MB6CJT&+T*x~7{&CRd9Ml7$+b&eI!ZN@D3Gte6|6g1+{8u^Cxd-iY*T>z2Dkt|D~gGJ+d&jCs)lorZ%Z z8w+xB=aZ6?$yZZcN14Zx3&LcyV`FjEMiXp;;QaLUpv#8o^}!BE8S%rgB@O$6a2zSa zc#TX4zSkad$IQ&|z2C$t^)bwo|~|tX%hsKxraesLz5@VWO^}I!bIRCc#5nUu1Txy?LogB_tZUDH7KAgDxAb2-p z@id0u>wMsTV#{Mq1JUClu`IOqDbtKj-zFcv%z_*USr1HTb?F;EV?E-(-{?sf%kX!*C6 zzis(M%llj2(o$@hYB||*L-RMA|GN1%n_p~xy!rLbXPa+vy~F?i`9JUfl>fv2XZ&UV zL;kb=R=>mdCEp+VKInV9PxCGK+I^v>|K0TWu9Hn4YkGInV@;W+p{Bc=TD)KN{+ai` zc%Sz^;(f?{yY~Utm%Mj-U5#I8{Da1yZ+u&$*f`vHw9(h_)rLQFe#iM4X!TDxFFBLW z0rwfYok8|s$u@jCTtrz!?*gQUWJ(E>b5i*74zqu6>35Ag8q#EkN537w{!o~fKo5=c zWjN2PmH_kiz<(z@UN7Usm>vzm%vug3*kKoHXS?7PTRyE9y7SzeY*N8_x}bK}Hi998 zZ<=f^rodw%IApW&1Homo$pl|5BEiV4FSDzyfc(KF&o>+mDWjeCC+B1Xn;tlk{owGX zejlKvkdO|amM`Is+6FJFA)reLXHE)q4G57EYO`Db8Kg%8Pyu`iRIJuGg7}+c2P{?8 z?;A4L82BpT0bg2!6w{#wsjcvN!WV9_-GIYC*t9dzgFf~pTmfZ#j}CW+NpBG7yFlHur5kmI!z zB8X}kr>BEtY=Z-^u9c>gc!_DB=J(NgW~0K^MKjl$Df9>ZFwV9gugz{Wq8Mp-z5>8@=OlHQ?rp@8=1 zpts?9o~pzEtGSbENm(hWv6@bj4*EM{_^C3iVW5xT(9eA8K;kb^#j8IyA^iU*k&|q} zgI5vh3a(ls$@o=TupXVmAg*!hVz5b*TU*FOBlRbhZzdg=BDdg^@v&MY)aZYN?7G|E zH0O&@IbqsuIesKfzi`w&>PpofZ2~&5k8IVY*WK+Nx1^y4rF>(jKqDg8V8!L zS{C&FdvvMD9h=a9^>^k#?v~%zbL;odSPx+RIV!OXH$CO)4Z>#Lfd(qEtiV(d;^A(h znodEvfuiAGXf(M+teP2`>-!At5V&Ip&af?B#7~ba!Kxr8T!vlQ+9nW`>i;0^fBnG# zlanDBK5fVYGd!DT27JB52SK?gVzGI$%gLIhK+P?;7y?USIMou_ z$-@w#I;!z7PN5{s7;2gd`I}#>*GuoFiPTyQSpz9uC1CX25a7lODQm%apc<>laNC>d zjtoNUt-8#R7uI#KCu`0cxPkVq^^6uOZ1GZnaF+*yv&0l$%ag6IYEIIcH7YInZbnIs z*A$U7qw>$~t`L)UrKpuf5J^r653wo!?|Igf;$GNhWb>h99?oQH+$fBTd`+B*a zbM84OCu^tsTrQAwr@NC*dP%y|3#e3*%D#1$PA7oU;;^`|oK7yXIw}gHC_0Sjpo0r| zM`2u;aX?Y|;V7bj>x`&_IN#^3s#K+_()UQ^IKMyc`P@%c*PEx_dfw-K-e>uKTMAc+ z1;NHxUcn@Wf@EYU^!97b`yvNEKmt`LXpKSKSOji(agnx(;b$=oM|PwNH;EQO@Av744g_Bqp-WB`lGJ!da>U z?A@jrdl{P&@isKLcavW4JEfa&!K!?JHq<0+JRCIuAd7(5TklcQst<`jOLv7`MtR%x z-`S!^Z5VE&`waD%^1`Ms^%CKitA%pS8i$4KJq(%6Wj2k%8AGwl;5o||g`X{A1)+Qc z32xbd;Yri$gxO@b`%5ix*YaGp!nq=>zg^zEFs$ikn7`COeIv9s12$5nql=lcOfWyb zkxaJivbxhRet}hjHj)ZOrLXeug#ifmdD4GmDl0HT3*j;>1wk5s5|u-l2d61I!za}l z(}?`be$Lwp9EHx*jo&meI=^*(`vOfjPBGB!Wra1YCmB9RmEzn5vV)469w?~JFh)cU zmv$GA_8Qp}btZ3+$k#5=cJq*^AVHiOTPO-ac}S|s)lmU2o5$f#@8)*QZFlUQ)>=A~ zpmXW`&V?0u1Su(v^nZj}K+si>1PDhox-fth6apb~jNKh46WKyz(dvw7WTuaU#qEQw z)>41BAp)|4X8P*IEkuvSfNYp`L@uo1*hmg-RZ$W(d{OJZGu2 zg;*>U%L2Y&g+(I}Y}1QSsb+TRj>Ax|n{O%Xv>o|<#Y3HebuOJ>ySO3O-E8nUPAwd> zs`WB9Vr39TtHVZRU9s6?cFw!Fv7#fG&ZTqv#UpY8kD5345e3RD9B_qNrk%xc!J1%h zue>=9Uubu&nDH+~+vTQ?ggTcn!63Yq3Y&baf)BMI*oNDvDdZHDv0B|VI>DRu*m2F) z_AaWEjWn>HtT!&M$$1a9hlH?mAi2aLuvO6bn>s@nu?p$s!ePU?y}_#!x`V`ZUtGnO z=aC9+VAR4~8s)|d>r_pf!YP`sRygo~7kEY7ZTLEI*4{e|E}c2U>SX^Q!LMF?vuw^b zsZ~U5_69jNjGEG28uA=hYK}(ZBoy>TbOzSBbZ)(P7*3E_>$YCtlC2tM88tz5sXrRU zq4G{Qd?gN^ZiZw0em<+-ga%FS?ThCk`z%TvLeVuQS8U}jX6w`?QLv&5vNy@Y*9YI} z;o@mBv$(I$Hx3ec`QjmTrHhqr1POtF6=qoqj*#nCLrDlZ+EyG#6rDB0pYK?~TiYuh zI5yO!AcKUrT_8thmsTM;o*V4s2y802pJ>yn!FCiBZ5qRu`FJaFb`oBR)KWSstaIu7 z`o)7-fTHKNN;Us^)QzD&?+hp$fL!Q12k8u8#LO)fxWfKMkl%qf+XpB%Xo9U53nkMo};>~h-G2`9i?DuNlmM$KEVHTI5P<*_@R}(;;DlDvJ z3B+k3Aojv)8q9_)`}(RU%rfikyLEs1>I^m5#b&vcF){t&rLL_ z5%pNK`;vjmSt{+Wn`A4j?KkF=wy>qZ7OWw{#j<15WZNKbz+s(U9}c`tV$@ADK}x0dpa?E zX)|$$JycC>EJbxh)47D>|C+pOuONn7M%Y5A;AK7$b&X=8dm?Mp*zg2zwT}7yVDR8f zb#%I9g8kS;#Es9(s_7#E2aH&{ z?St&`+38{}q&f!FMo3*|VRAMKP2t1xrrW)5*{R8PpYGP+t}XzvU8_EWKxeeX5r$-~+V_^X+?%^QfOk=Ags!Z& zFMw+)outB8W;j}J^3*Dr&Qa_T$qhP<^pse0l5*JY*bHIh<_=Fbj<&t4LDiz+UK+CKxJ3m8?dUS?tt^;3t*LhA-q<3#;aOU{Lnv1<);} zMwV3utgx`bFh_Eb8qqCfafL=V49lB5sGKc2&z61az`&r$?DY#^TRtT2*FmlT7deb% z2r`QBj{%I>mzM6=3d6#lX4X#q)xD&@4<+rAi1+Oaz*$O)9OUv`3(Z)t#~eKSQ?%8J zI2nW2o?(%zsr+84p4)dF>CA=BrSn@C0JeNsJoW8S7J(B^s>L#P4fI4(+PNpN#=aRA zcrClJyx2JtK%BM20RogD{#i*c+dslAE>Elc>HIRBuq-O3k{O1R9<8lCmsjpkz5z7)-? zyvTt%;<^}#t%wPMKwg>GxDmr=QoxSir=qJFrk_Hzc!wdZ0K z*#l8q6j=0S*e)EEYYl)xQh{%#T&zIVduB|#wHX#Yv=$H7cXyBOby?akMr2#U5~V=4 z6>(z4>U(P{i^}r*D0FV6-g5eEOEER}|DgG{-Te-f*@)roFjgc1y8zl9@C0?L_KZ{Z ziSI`!9P)Z}=h_E;$5MGmy~7QX*>(5Z;kbu|$ixbt$QA^C1rfO~%TgdkIPuCp*x~E; z;d**Ky^`~D>UxDiay#$7949-`_X(q3K_qQq>FL1@97CRN=fTcO*;mX2^!65=-#Wi~ z_hp!FF`3{eFw%uBR9csS+|)`cihhSb!!cXJ1A-P?tfnKE&Lt2mycF6jx@en1;p@US zx}*711c6qgXxBk`{^je>P)wz?c!qkfV&1DpQ-DtBm~JN|Zp+?U6df8M!a6-(A>UOcm4~{2+-vcU!WBrmC9=`meYqVL+r&lZ{9+b+Keo2g@2xdy}no zG;!QD6b-WN?*zREJNcEWW=`xf_Ot}JWVf9=?w&zCBn$`wz46w-bW$(p3F{1`)0(5Q=*p2mW1N*nA9Wc!}0w6yIhy`Rs08*gFveWZ8j7e;F1h%sWt*~E}!x<>? zBX{eNSTuJ&u9PoNN@hXJ<&DC$^rf?-BrMWFYh)T!))>X~I@YP`GQ zwQcUDHVXG>FNE{|>qh1`=3WOp|7$Z<%P(6@<{i`9rvKOU3#MK_`G=DaU#U&}{KVAw z@z{@y{{86lMqX#=)PL#2I9-1uKDp@bYyiv}w zzj!7lS}JRU+Ya20sK!xy^YTsmkkZZ^GY?HDBV^^32UQyj=H zX847D0-jFkHB0JzBqRAFpfLs0&DE7HwJSDASnI{t$?RyX+IX*p{cMA&t48eMdq+I2pm&ZYC47hj7og{ajCh9{*YKh+)Q z37p|lv@WAF>~}Sb zQHn|2Rj}&x3P~409*FK*tCspf=Y5Tsiu``5xbHtc@~K+~2Q4}G#T*nuG;XU1xWbsx zDWB*G$iG0lrhbd>kOg1b@r1oj+hJTCz8WOB>tYrwPbzOi(_jl~ydpxR%ghcM>W3lA zoe1sk6j~>%ZFPP3Ah~Z{%)n(9PtH(d;D90`3!utUE!Pvfr`5wZakf}6*9vUcR`1o- za9miRA)>&vnV^M*@f`q9m;lZJ?F0up!7K2XhA;Kuif=WZFQvok1N5M2e)z%+Z%(us z*sk*kAQO;#ol83VKs;3XK=EiJ3osT)#dp$Mp@h05VNjrZ`ND+c)20xh7rCazHWuV; z!22av&m&ZbFl|pa^nxnJgx|}DWA%0Jz?o7L<7@hXOQe!iob~X;Q81MR-R@cQ8+AO4C1%)?vL_Lq(3a-&EHLvJ^Q{hcl6GuEae&2R zPh;tHD`!`Ce?Vw;9DpvJKX&&Jl%S%qK*J^oFTjri{#91sNMZSUtC~G&5J(RS1F9)B z1IW-{TJ?1rY^(0jwuP<_vD_Fa`V`l^#I_j~ zwUsEAz)YVj#_mznYjS@S+0)-PrGp#o!n&e)Za|nTgU2i$RL3qxw|I^4t*k5 z+=8zPyja9u3!F!Wg&DrItH+sEGj+P_Q0EQ?N&D#CC<^h!^8QT}K0$9IWsuQ;_o2<= zEpiSISW9sL)Aux4yVn_=Y_7c6w0R?kM`~DwLE_)K8^O6m3KOi@`M!QPB!|Nzs5i#>nkxQLX^aMimTkE= z!^5|5>$wBZ{z~7x;;>ai3;}zDMNpp(=bZYz%31cpe%sLHLgYaShnZuckZ>#%NXkg7sM>UA+Za^-P zq{wW50c|csKnc1KgJVR@CIC3iq2&Kk#V}UIveVi=b+uB3#kP)+I+pWpDz)rHrByWTZtvk=u8SmzQ5W6*dkmA$P1qLUz65szc#K_Y%I z;KMV@z6!ndXKb3!4(mIS*kj>O$S*FaRcr=qPpS>=l|}=d}!`%v!6r#|Myz{z;ex8H~o^yG##0G*W}+$u3Wi0 z@p}{BG=4JnD`OL*p^>h!BmO-+eeS$KZH-f0WrDv(5NYHlv!azk16hT1mI!%zbE#1U zCpBppS#178*J`dAuC!DqPd0G>Vq=%iT^A^_k4da0TN5Q7)hi6I3!jO5!ZpR zT0>c(3Tk!u3KBj5zSkPJ8&Fkb4HW#=MG=m&=-r1<1BEgS!l)a_6)@zPZWY{)^>mm& zzE|^c;{tS+(gIwe!gTbx0Q`@RBXKRV?vTYTpB|-((JgyM)haS@e(e{avXo9wE5sN8 zBqShNfaR@O;mY8_Mk%M7DR;<1xA#s@f`JonQx$R
3}@K`<|y7zGGq!N_PRkvq!?(`OXl66Bb7J$U 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 $this->faker->numberBetween(0, 10), + 'for' => $this->faker->name(), + 'name' => $this->faker->name(), + 'key' => $this->faker->name(), + 'type' => $this->faker->name(), + 'description' => $this->faker->text(), + 'color' => $this->faker->hexColor(), + 'icon' => 'heroicon-o-user', + ]; + } +} diff --git a/tests/database/factories/UserFactory.php b/tests/database/factories/UserFactory.php new file mode 100644 index 0000000..60b1586 --- /dev/null +++ b/tests/database/factories/UserFactory.php @@ -0,0 +1,23 @@ + $this->faker->name(), + 'email' => $this->faker->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } +} diff --git a/tests/src/AdminPanelProvider.php b/tests/src/AdminPanelProvider.php new file mode 100644 index 0000000..4984a13 --- /dev/null +++ b/tests/src/AdminPanelProvider.php @@ -0,0 +1,55 @@ +default() + ->id('admin') + ->path('admin') + ->login() + ->pages([ + Pages\Dashboard::class, + ]) + ->plugin( + SpatieLaravelTranslatablePlugin::make() + ->defaultLocales(['ar', 'en']), + ) + ->plugin( + FilamentTypesPlugin::make() + ) + ->middleware([ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DisableBladeIconComponents::class, + DispatchServingFilamentEvent::class, + ]) + ->authMiddleware([ + Authenticate::class, + ]); + } +} diff --git a/tests/src/DebugTest.php b/tests/src/DebugTest.php new file mode 100644 index 0000000..91bf6cd --- /dev/null +++ b/tests/src/DebugTest.php @@ -0,0 +1,5 @@ +each->not->toBeUsed(); +}); diff --git a/tests/src/FilamentTypeServiceTest.php b/tests/src/FilamentTypeServiceTest.php new file mode 100644 index 0000000..df8b09f --- /dev/null +++ b/tests/src/FilamentTypeServiceTest.php @@ -0,0 +1,25 @@ +label('Testing For') + ->types([ + TypeOf::make('testingType') + ->label('Testing Type') + ->register([ + Type::make('testing-key') + ->name('Testing Key') + ->icon('heroicon-o-adjustments-horizontal') + ->color('warning'), + ]), + ]), + ]); + + expect((bool) FilamentTypes::get()->where('for', 'testingFor')->first())->toBeTrue(); +}); diff --git a/tests/src/Models/Type.php b/tests/src/Models/Type.php new file mode 100644 index 0000000..72d075c --- /dev/null +++ b/tests/src/Models/Type.php @@ -0,0 +1,79 @@ +hasMany('TomatoPHP\FilamentTypes\Tests\Models\Type'); + } + + public function parent() + { + return $this->belongsTo('TomatoPHP\FilamentTypes\Tests\Models\Type', 'parent_id'); + } + + protected static function newFactory(): TypeFactory + { + return TypeFactory::new(); + } +} diff --git a/tests/src/Models/User.php b/tests/src/Models/User.php new file mode 100644 index 0000000..6f5ac69 --- /dev/null +++ b/tests/src/Models/User.php @@ -0,0 +1,34 @@ +plugins([ + SpatieLaravelTranslatablePlugin::make(), + ]); + + expect($panel->getPlugin('spatie-laravel-translatable')) + ->not() + ->toThrow(Exception::class); +}); + +it('registers plugin', function () { + $panel = Filament::getCurrentPanel(); + + $panel->plugins([ + FilamentTypesPlugin::make(), + ]); + + expect($panel->getPlugin('filament-types')) + ->not() + ->toThrow(Exception::class); +}); diff --git a/tests/src/TestCase.php b/tests/src/TestCase.php new file mode 100644 index 0000000..87c362c --- /dev/null +++ b/tests/src/TestCase.php @@ -0,0 +1,106 @@ +label('Product') + ->types([ + TypeOf::make('sizes') + ->label('Sizes') + ->register([ + Type::make('xl') + ->name('XL') + ->icon('heroicon-o-adjustments-horizontal') + ->color('warning'), + Type::make('sm') + ->name('SM') + ->icon('heroicon-o-adjustments-horizontal') + ->color('warning'), + ]), + ]), + ]); + + FilamentTypes::register([ + TypeFor::make('products') + ->label('Product') + ->types([ + TypeOf::make('colors') + ->label('Colors'), + ]), + ]); + } + + protected function getPackageProviders($app): array + { + return [ + ActionsServiceProvider::class, + BladeCaptureDirectiveServiceProvider::class, + BladeHeroiconsServiceProvider::class, + BladeIconsServiceProvider::class, + FilamentServiceProvider::class, + FormsServiceProvider::class, + InfolistsServiceProvider::class, + LivewireServiceProvider::class, + NotificationsServiceProvider::class, + SupportServiceProvider::class, + TablesServiceProvider::class, + WidgetsServiceProvider::class, + Service::class, + MediaLibraryServiceProvider::class, + FilamentIconsServiceProvider::class, + FilamentTypesServiceProvider::class, + AdminPanelProvider::class, + ]; + } + + protected function defineDatabaseMigrations(): void + { + $this->loadMigrationsFrom(__DIR__ . '/../../database/migrations'); + } + + public function getEnvironmentSetUp($app): void + { + $app['config']->set('filament-users.model', User::class); + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite.database', __DIR__ . '/../database/database.sqlite'); + $app['config']->set('filament-icons.cache', false); + + $app['config']->set('view.paths', [ + ...$app['config']->get('view.paths'), + __DIR__ . '/../resources/views', + ]); + } +} diff --git a/tests/src/TypeResourceTest.php b/tests/src/TypeResourceTest.php new file mode 100644 index 0000000..018fd28 --- /dev/null +++ b/tests/src/TypeResourceTest.php @@ -0,0 +1,171 @@ +create()); +}); + +it('can render type resource', function () { + get(TypeResource::getUrl())->assertSuccessful(); +}); + +it('can list types', function () { + Type::query()->delete(); + $types = Type::factory()->count(10)->create(); + + livewire(Pages\ListTypes::class) + ->loadTable() + ->assertCanSeeTableRecords($types) + ->assertCountTableRecords(10); +}); +// +it('can render type type/for/key column in table', function () { + User::factory()->count(10)->create(); + + livewire(Pages\ListTypes::class) + ->loadTable() + ->assertCanRenderTableColumn('type') + ->assertCanRenderTableColumn('for') + ->assertCanRenderTableColumn('key'); +}); + +it('can render type list page', function () { + livewire(Pages\ListTypes::class)->assertSuccessful(); +}); + +it('can render view type page', function () { + livewire(Pages\ListTypes::class, [ + 'record' => User::factory()->create(), + ]) + ->mountAction('view') + ->assertSuccessful(); +}); + +it('can render type create page', function () { + livewire(Pages\ListTypes::class) + ->mountAction('create') + ->assertSuccessful(); +}); + +it('can create new type', function () { + $newData = Type::factory()->make(); + + livewire(Pages\ListTypes::class) + ->callAction('create', data: [ + 'order' => $newData->order, + 'for' => $newData->for, + 'name' => $newData->name, + 'key' => $newData->key, + 'type' => $newData->type, + 'description' => $newData->description, + 'color' => $newData->color, + 'icon' => 'heroicon-o-user', + ]) + ->assertHasNoActionErrors(); + + assertDatabaseHas(Type::class, [ + 'for' => $newData->for, + 'key' => $newData->key, + 'type' => $newData->type, + ]); +}); + +it('can validate type input', function () { + livewire(Pages\ListTypes::class) + ->callAction('create', data: [ + 'for' => null, + 'name' => null, + 'key' => null, + 'type' => null, + 'description' => null, + 'color' => null, + 'icon' => null, + ]) + ->assertHasActionErrors([ + 'for' => 'required', + 'name' => 'required', + 'key' => 'required', + 'type' => 'required', + ]); +}); + +it('can render type edit page', function () { + livewire(Pages\ListTypes::class, [ + 'record' => Type::factory()->create(), + ]) + ->mountAction('edit') + ->assertSuccessful(); +}); + +it('can retrieve type data', function () { + $type = Type::factory()->create(); + + livewire(Pages\ListTypes::class) + ->mountTableAction(EditAction::class, $type) + ->assertTableActionDataSet([ + 'key' => $type->key, + 'type' => $type->type, + 'for' => $type->for, + ]) + ->assertHasNoTableActionErrors(); +}); + +it('can validate edit type input', function () { + $type = Type::factory()->create(); + + livewire(Pages\ListTypes::class, [ + 'record' => $type->getRouteKey(), + ]) + ->callTableAction('edit', $type, [ + 'name' => null, + 'type' => null, + 'for' => null, + 'key' => null, + ]) + ->assertHasTableActionErrors([ + 'name' => 'required', + 'type' => 'required', + 'for' => 'required', + 'key' => 'required', + ]); +}); + +it('can save type data', function () { + $type = Type::factory()->create(); + $newData = Type::factory()->make(); + + livewire(Pages\ListTypes::class) + ->callTableAction('edit', $type, data: [ + 'key' => $newData->key, + 'for' => FilamentTypes::get()->first()?->for, + 'type' => collect(FilamentTypes::get()->first()?->types)->first()?->type, + 'name' => $newData->name, + ]) + ->assertHasNoTableActionErrors(); + + expect($type->refresh())->key->toBe($newData->key); +}); + +it('can delete type', function () { + $type = Type::factory()->create(); + + livewire(Pages\ListTypes::class) + ->callTableAction('delete', $type) + ->assertHasNoTableActionErrors(); + + assertModelMissing($type); +}); From 89089da8c048e9198e6f9c5be7d17e05521f7b61 Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Tue, 29 Oct 2024 09:35:41 +0300 Subject: [PATCH 2/5] v2 --- README.md | 182 +++++++++++++++--- resources/views/components/type.blade.php | 2 +- .../views/pages/type-view-component.blade.php | 17 ++ src/Pages/BaseTypePage.php | 10 +- src/Services/FilamentTypesServices.php | 24 ++- tests/database/database.sqlite | Bin 520192 -> 716800 bytes tests/src/AdminPanelProvider.php | 4 + tests/src/Pages/TypePage.php | 48 +++++ tests/src/Pages/TypeViewComponentPage.php | 10 + tests/src/TestCase.php | 2 + tests/src/TypeBasePageTest.php | 136 +++++++++++++ tests/src/TypeColumnTest.php | 22 +++ tests/src/TypeHelperTest.php | 13 ++ tests/src/TypeResourceTest.php | 6 +- tests/src/TypeViewComponentTest.php | 19 ++ 15 files changed, 466 insertions(+), 29 deletions(-) create mode 100644 resources/views/pages/type-view-component.blade.php create mode 100644 tests/src/Pages/TypePage.php create mode 100644 tests/src/Pages/TypeViewComponentPage.php create mode 100644 tests/src/TypeBasePageTest.php create mode 100644 tests/src/TypeColumnTest.php create mode 100644 tests/src/TypeHelperTest.php create mode 100644 tests/src/TypeViewComponentTest.php diff --git a/README.md b/README.md index 063afcd..d2b4ef2 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,55 @@ php artisan filament-types:install finally register the plugin on `/app/Providers/Filament/AdminPanelProvider.php` ```php +use TomatoPHP\FilamentTypes\Services\Contracts\Type; +use TomatoPHP\FilamentTypes\Services\Contracts\TypeFor; +use TomatoPHP\FilamentTypes\Services\Contracts\TypeOf; + ->plugin(\TomatoPHP\FilamentTypes\FilamentTypesPlugin::make()) + ->types([ + TypeFor::make('posts') + ->label('Posts') + ->types([ + TypeOf::make('categories') + ->label('Categories') + ->register([ + Type::make('news') + ->name('News') + ->icon('heroicon-o-newspaper') + ->color('#fefefe') + ]) + ]) + ]) ``` -## Register New Type +## Register Type using provider -you can add new type using config file `config/filament-types.php` or you can register a type from your provider using our Facade +you can register a type from your provider using our Facade ```php use TomatoPHP\FilamentTypes\Facades\FilamentTypes; +use TomatoPHP\FilamentTypes\Services\Contracts\Type; +use TomatoPHP\FilamentTypes\Services\Contracts\TypeFor; +use TomatoPHP\FilamentTypes\Services\Contracts\TypeOf; FilamentTypes::register([ - 'types', - 'groups' -], 'accounts'); + TypeFor::make('products') + ->label('Product') + ->types([ + TypeOf::make('sizes') + ->label('Sizes') + ->register([ + Type::make('xl') + ->name('XL') + ->icon('heroicon-o-adjustments-horizontal') + ->color('warning'), + Type::make('sm') + ->name('SM') + ->icon('heroicon-o-adjustments-horizontal') + ->color('warning') + ]) + ]), +]); ``` ## Use Type Helper @@ -51,7 +86,11 @@ FilamentTypes::register([ you can find any type with the helper method to use it anywhere ```php -type_of(key: 'pending',for: 'notes',type: 'groups'); +type_of( + key: 'pending', + for: 'notes', + type: 'groups' +); ``` it will return type model for you. @@ -64,10 +103,10 @@ you can use type column in your table like this use TomatoPHP\FilamentTypes\Components\TypeColumn; TypeColumn::make('type') -->for('users') -->type('status') -->allowDescription() -->searchable(), + ->for('users') + ->type('status') + ->allowDescription() + ->searchable(), ``` ## Auto Caching @@ -123,24 +162,15 @@ class NotesGroups extends BaseTypePage { return [ Type::make('todo') - ->name([ - "ar" => "مهام", - "en" => "TODO" - ]) + ->name("TODO") ->color('#1461e3') ->icon('heroicon-o-list-bullet'), Type::make('ideas') - ->name([ - "ar" => "أفكار", - "en" => "Ideas" - ]) + ->name("Ideas") ->color('#13e0da') ->icon('heroicon-o-sparkles'), Type::make('saved') - ->name([ - "ar" => "محفوظ", - "en" => "Saved" - ]) + ->name("Saved") ->color('#29a82e') ->icon('heroicon-o-arrow-down-on-square'), ]; @@ -165,6 +195,89 @@ if you like to use a type as a package we create a blade component for you to ma ``` +## User Types Resource Hooks + +we have add a lot of hooks to make it easy to attach actions, columns, filters, etc + +### Table Columns + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Table\TypeTable; + +public function boot() +{ + TypeTable::register([ + \Filament\Tables\Columns\TextColumn::make('something') + ]); +} +``` + +### Table Actions + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Table\TypeActions; + +public function boot() +{ + TypeActions::register([ + \Filament\Tables\Actions\ReplicateAction::make() + ]); +} +``` + +### Table Filters + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Table\TypeFilters; + +public function boot() +{ + TypeFilters::register([ + \Filament\Tables\Filters\SelectFilter::make('something') + ]); +} +``` + +### Table Bulk Actions + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Table\TypeBulkActions; + +public function boot() +{ + TypeBulkActions::register([ + \Filament\Tables\BulkActions\DeleteAction::make() + ]); +} +``` + +### From Components + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Form\TypeForm; + +public function boot() +{ + TypeForm::register([ + \Filament\Forms\Components\TextInput::make('something') + ]); +} +``` + +### Page Actions + +```php +use TomatoPHP\FilamentTypes\Filament\Resources\TypeResource\Actions\ManagePageActions; + +public function boot() +{ + ManagePageActions::register([ + Filament\Actions\Action::make('action') + ]); + +} +``` + ## Publish Assets you can publish config file by use this command @@ -191,6 +304,31 @@ you can publish migrations file by use this command php artisan vendor:publish --tag="filament-types-migrations" ``` +## Testing + +if you like to run `PEST` testing just use this command + +```bash +composer test +``` + +## Code Style + +if you like to fix the code style just use this command + +```bash +composer format +``` + +## PHPStan + +if you like to check the code by `PHPStan` just use this command + +```bash +composer analyse +``` + + ## Other Filament Packages Checkout our [Awesome TomatoPHP](https://github.com/tomatophp/awesome) diff --git a/resources/views/components/type.blade.php b/resources/views/components/type.blade.php index b262c54..c054193 100644 --- a/resources/views/components/type.blade.php +++ b/resources/views/components/type.blade.php @@ -16,7 +16,7 @@ @endif -
+
{{ $type->name ?? config('filament-types.empty_state') }}
diff --git a/resources/views/pages/type-view-component.blade.php b/resources/views/pages/type-view-component.blade.php new file mode 100644 index 0000000..b7b05b0 --- /dev/null +++ b/resources/views/pages/type-view-component.blade.php @@ -0,0 +1,17 @@ +@php use TomatoPHP\FilamentTypes\Models\Type; @endphp + + @php + $type = Type::query()->create([ + 'order' => 1, + 'for' => 'notes', + 'name' => 'TODO', + 'key' => 'todo', + 'type' => 'groups', + 'description' => 'TODO', + 'color' => '#1461e3', + 'icon' => 'heroicon-o-list-bullet', + ]) + @endphp + + + diff --git a/src/Pages/BaseTypePage.php b/src/Pages/BaseTypePage.php index 7e688cc..3bb6f63 100644 --- a/src/Pages/BaseTypePage.php +++ b/src/Pages/BaseTypePage.php @@ -2,13 +2,13 @@ namespace TomatoPHP\FilamentTypes\Pages; +use Filament\Actions\Action; use Filament\Forms\Components\ColorPicker; use Filament\Forms\Components\Grid; use Filament\Forms\Components\TextInput; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; use Filament\Notifications\Notification; -use Filament\Actions\Action; use Filament\Pages\Page; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; @@ -109,7 +109,12 @@ public function mount(): void if (! $exists) { $type->for = $this->getFor(); $type->type = $this->getType(); - $exists = Type::create($type->toArray()); + if (! is_array($type->name)) { + $type->name = [ + app()->getLocale() => $type->name, + ]; + } + Type::create($type->toArray()); } } } @@ -127,6 +132,7 @@ public function getCreateAction(): bool public function table(Table $table): Table { return $table + ->deferLoading() ->query( Type::query() ->where('for', $this->getFor()) diff --git a/src/Services/FilamentTypesServices.php b/src/Services/FilamentTypesServices.php index 48e2650..948821c 100644 --- a/src/Services/FilamentTypesServices.php +++ b/src/Services/FilamentTypesServices.php @@ -3,6 +3,7 @@ namespace TomatoPHP\FilamentTypes\Services; use Illuminate\Support\Collection; +use TomatoPHP\FilamentTypes\Models\Type; use TomatoPHP\FilamentTypes\Services\Contracts\TypeFor; class FilamentTypesServices @@ -30,9 +31,30 @@ public function get(): Collection ->groupBy(fn ($typeFor) => $typeFor->for) // Group by `label` within each `for` group ->map(function ($labelGroup) { $mergedTypes = $labelGroup->flatMap(fn ($typeFor) => $typeFor->types) - ->map(function ($getType) { + ->map(function ($getType) use ($labelGroup) { $getType->label = ! $getType->label ? str($getType->type)->title()->toString() : $getType->label; + if (is_array($getType->types) && count($getType->types)) { + foreach ($getType->types as $typeItem) { + $checkExists = Type::query() + ->where('key', $typeItem->key) + ->where('type', $getType->type) + ->where('for', $labelGroup->first()->for) + ->first(); + + if (! $checkExists) { + Type::query()->create([ + 'key' => $typeItem->key, + 'type' => $getType->type, + 'icon' => $typeItem->icon, + 'color' => $typeItem->color, + 'for' => $labelGroup->first()->for, + 'name' => $typeItem->name, + ]); + } + } + } + return $getType; }) ->unique('type') // Ensure unique by `type` diff --git a/tests/database/database.sqlite b/tests/database/database.sqlite index 6141d00d3eeafdc06f1f353538ceb6a88a152831..ebdb8faef0bf56a8801773897627d1d8fb8e8ea3 100644 GIT binary patch delta 151394 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