From ba56b4cfa68e67f8c1c0505475326d9a6d1cb9bb Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Sat, 26 Oct 2024 16:58:44 +0300 Subject: [PATCH 1/3] 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 | 74 +- SECURITY.md | 3 + composer.json | 41 +- composer.lock | 12887 ++++++++++++++++ config/filament-translations.php | 83 +- ..._25_010712_create_language_lines_table.php | 16 +- phpstan.neon.dist | 13 + phpunit.xml | 28 + pint.json | 14 + resources/lang/ar/global.php | 8 +- resources/lang/ar/translation.php | 82 +- resources/lang/de/global.php | 8 +- resources/lang/de/translation.php | 80 +- resources/lang/en/global.php | 8 +- resources/lang/en/translation.php | 80 +- resources/lang/es/global.php | 8 +- resources/lang/es/translation.php | 86 +- resources/lang/my/global.php | 8 +- resources/lang/my/translation.php | 86 +- resources/lang/nl/global.php | 8 +- resources/lang/nl/translation.php | 86 +- resources/lang/pt_BR/global.php | 8 +- resources/lang/pt_BR/translation.php | 86 +- resources/views/language-switcher.blade.php | 73 - routes/web.php | 43 - src/Console/FilamentTranslationsInstall.php | 47 + src/Console/ImportCommand.php | 14 +- src/Console/ScanPath.php | 43 +- src/Exports/CustomTranslationExport.php | 14 +- src/Exports/TranslationsExport.php | 18 +- .../Resources/TranslationResource.php | 78 + .../Actions/Components}/.gitkeep | 0 .../Actions/Components/Action.php | 10 + .../Actions/Components/ClearAction.php | 28 + .../Actions/Components/CreateAction.php | 14 + .../Actions/Components/DeleteAction.php | 14 + .../Actions/Components/EditAction.php | 15 + .../Actions/Components/ScanAction.php | 43 + .../Actions/Components/ViewAction.php | 14 + .../Actions/Contracts/CanRegister.php | 56 + .../Actions/CreatePageActions.php | 16 + .../Actions/EditPageActions.php | 17 + .../Actions/ManagePageActions.php | 15 + .../Actions/ViewPageActions.php | 16 + .../Form/Components}/.gitkeep | 0 .../Form/Components/Component.php | 10 + .../Form/Components/Group.php | 17 + .../Form/Components/Key.php | 17 + .../Form/Components/Text.php | 16 + .../Form/TranslationForm.php | 44 + .../InfoList/Entries}/.gitkeep | 0 .../InfoList/Entries/Entry.php | 8 + .../InfoList/TranslationInfoList.php | 42 + .../Pages/CreateTranslation.php | 21 + .../Pages/EditTranslation.php | 21 + .../Pages/ListTranslations.php | 77 + .../Pages/ManageTranslations.php | 164 + .../Pages/ViewTranslations.php | 18 + .../Table/Actions/.gitkeep | 0 .../Table/Actions/Action.php | 8 + .../Table/Actions/DeleteAction.php | 17 + .../Table/Actions/EditAction.php | 15 + .../Table/Actions/ViewAction.php | 15 + .../Table/BulkActions/.gitkeep | 0 .../Table/BulkActions/Action.php | 10 + .../Table/BulkActions/DeleteAction.php | 15 + .../Table/Columns/.gitkeep | 0 .../Table/Columns/Column.php | 8 + .../Table/Columns/CreatedAt.php | 17 + .../TranslationResource/Table/Columns/Key.php | 16 + .../Table/Columns/Text.php | 16 + .../Table/Columns/UpdatedAt.php | 17 + .../Table/Filters/.gitkeep | 0 .../Table/Filters/Filter.php | 8 + .../Table/Filters/Group.php | 17 + .../Table/Filters/Text.php | 17 + .../Table/HeaderActions/.gitkeep | 0 .../Table/HeaderActions/Action.php | 8 + .../Table/HeaderActions/ExportAction.php | 19 + .../Table/HeaderActions/ImportAction.php | 37 + .../Table/TranslationActions.php | 43 + .../Table/TranslationBulkActions.php | 43 + .../Table/TranslationFilters.php | 42 + .../Table/TranslationHeaderActions.php | 41 + .../Table/TranslationTable.php | 52 + src/FilamentTranslationsPlugin.php | 78 +- src/FilamentTranslationsServiceProvider.php | 27 +- src/FilamentTranslationsSwitcherPlugin.php | 76 - src/Http/Middleware/LanguageMiddleware.php | 32 - src/Imports/CustomTranslationImport.php | 4 +- src/Imports/TranslationsImport.php | 16 +- src/Jobs/ScanJob.php | 10 +- src/Jobs/ScanWithGPT.php | 91 - src/Jobs/ScanWithGoogleTranslate.php | 47 - src/Models/Translation.php | 21 +- src/Resources/TranslationResource.php | 187 - .../Pages/CreateTranslation.php | 16 - .../Pages/EditTranslation.php | 16 - .../Pages/ListTranslations.php | 79 - .../Pages/ManageTranslations.php | 165 - src/Services/ExcelImportExportService.php | 6 +- src/Services/Manager.php | 12 +- src/Services/SaveScan.php | 28 +- src/Services/Scan.php | 22 +- tests/Pest.php | 5 + tests/database/database.sqlite | Bin 0 -> 360448 bytes .../database/factories/TranslationFactory.php | 27 + tests/database/factories/UserFactory.php | 23 + tests/src/AdminPanelProvider.php | 52 + tests/src/DebugTest.php | 5 + tests/src/Models/Translation.php | 64 + tests/src/Models/User.php | 34 + tests/src/PluginTest.php | 36 + tests/src/TestCase.php | 64 + tests/src/TranslationResourceTest.php | 227 + 126 files changed, 15802 insertions(+), 1464 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 phpstan.neon.dist create mode 100644 phpunit.xml create mode 100644 pint.json delete mode 100644 resources/views/language-switcher.blade.php delete mode 100644 routes/web.php create mode 100644 src/Console/FilamentTranslationsInstall.php create mode 100644 src/Filament/Resources/TranslationResource.php rename src/{Http/Middleware => Filament/Resources/TranslationResource/Actions/Components}/.gitkeep (100%) create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/Action.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/ClearAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/DeleteAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/EditAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/ScanAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/Contracts/CanRegister.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/EditPageActions.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/ManagePageActions.php create mode 100644 src/Filament/Resources/TranslationResource/Actions/ViewPageActions.php rename {tests/Feature => src/Filament/Resources/TranslationResource/Form/Components}/.gitkeep (100%) create mode 100644 src/Filament/Resources/TranslationResource/Form/Components/Component.php create mode 100644 src/Filament/Resources/TranslationResource/Form/Components/Group.php create mode 100644 src/Filament/Resources/TranslationResource/Form/Components/Key.php create mode 100644 src/Filament/Resources/TranslationResource/Form/Components/Text.php create mode 100644 src/Filament/Resources/TranslationResource/Form/TranslationForm.php rename {tests/Unit => src/Filament/Resources/TranslationResource/InfoList/Entries}/.gitkeep (100%) create mode 100644 src/Filament/Resources/TranslationResource/InfoList/Entries/Entry.php create mode 100644 src/Filament/Resources/TranslationResource/InfoList/TranslationInfoList.php create mode 100644 src/Filament/Resources/TranslationResource/Pages/CreateTranslation.php create mode 100644 src/Filament/Resources/TranslationResource/Pages/EditTranslation.php create mode 100644 src/Filament/Resources/TranslationResource/Pages/ListTranslations.php create mode 100644 src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php create mode 100644 src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Actions/.gitkeep create mode 100644 src/Filament/Resources/TranslationResource/Table/Actions/Action.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Actions/DeleteAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Actions/EditAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Actions/ViewAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/BulkActions/.gitkeep create mode 100644 src/Filament/Resources/TranslationResource/Table/BulkActions/Action.php create mode 100644 src/Filament/Resources/TranslationResource/Table/BulkActions/DeleteAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/.gitkeep create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/Column.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/CreatedAt.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/Key.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/Text.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Columns/UpdatedAt.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Filters/.gitkeep create mode 100644 src/Filament/Resources/TranslationResource/Table/Filters/Filter.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Filters/Group.php create mode 100644 src/Filament/Resources/TranslationResource/Table/Filters/Text.php create mode 100644 src/Filament/Resources/TranslationResource/Table/HeaderActions/.gitkeep create mode 100644 src/Filament/Resources/TranslationResource/Table/HeaderActions/Action.php create mode 100644 src/Filament/Resources/TranslationResource/Table/HeaderActions/ExportAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php create mode 100644 src/Filament/Resources/TranslationResource/Table/TranslationActions.php create mode 100644 src/Filament/Resources/TranslationResource/Table/TranslationBulkActions.php create mode 100644 src/Filament/Resources/TranslationResource/Table/TranslationFilters.php create mode 100644 src/Filament/Resources/TranslationResource/Table/TranslationHeaderActions.php create mode 100644 src/Filament/Resources/TranslationResource/Table/TranslationTable.php delete mode 100644 src/FilamentTranslationsSwitcherPlugin.php delete mode 100644 src/Http/Middleware/LanguageMiddleware.php delete mode 100644 src/Jobs/ScanWithGPT.php delete mode 100644 src/Jobs/ScanWithGoogleTranslate.php delete mode 100644 src/Resources/TranslationResource.php delete mode 100644 src/Resources/TranslationResource/Pages/CreateTranslation.php delete mode 100644 src/Resources/TranslationResource/Pages/EditTranslation.php delete mode 100644 src/Resources/TranslationResource/Pages/ListTranslations.php delete mode 100644 src/Resources/TranslationResource/Pages/ManageTranslations.php create mode 100644 tests/Pest.php create mode 100644 tests/database/database.sqlite create mode 100644 tests/database/factories/TranslationFactory.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/Models/Translation.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/TranslationResourceTest.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..4f9728f --- /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-translations/discussions/new?category=q-a + about: Ask the community for help + - name: Request a feature + url: https://github.com/tomatophp/filament-translations/discussions/new?category=ideas + about: Share ideas for new features + - name: Report a security issue + url: https://github.com/tomatophp/filament-translations/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..78d3904 --- /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 --parallel 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 58d02d1..41710ef 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,6 @@ ![Screenshot of Login](https://raw.githubusercontent.com/tomatophp/filament-translations/master/arts/3x1io-tomato-translations.jpg) -## Documentation - -1. [Filament translations](#filament-translations) -2. [Screenshots](#screenshots) -3. [Installation](#installation) - - [Allow ChatGPT Auto Translations](#allow-chatgpt-auto-translations) - - [Allow Google Translate Auto Translations](#allow-google-translate-auto-translations) - - [Allow Create Button to Create New Language](#allow-create-button-to-create-new-language) - - [Allow Clear All Translations Button](#allow-clear-all-translations-button) - - [Publish Resource](#publish-resource) - - [Publish Assets](#publish-assets) -4. [Use Language Switcher](#use-language-switcher) -5. [Usage](#usage) - - [Scan Using Command Line](#scan-using-command-line) - - [Change Scan to work on Queue](#change-scan-to-work-on-queue) - - [Custom Import Command](#custom-import-command) - - [Show or hide buttons in the UI](#show-or-hide-buttons-in-the-ui) -6. [Other Filament Packages](#other-filament-packages) -7. [Support](#support) -8. [Docs](#docs) -9. [Changelog](#changelog) -10. [Security](#security) -11. [Credits](#credits) -12. [License](#license) - -# Filament translations +# Filament Translations Manager [![Latest Stable Version](https://poser.pugx.org/tomatophp/filament-translations/version.svg)](https://packagist.org/packages/tomatophp/filament-translations) [![License](https://poser.pugx.org/tomatophp/filament-translations/license.svg)](https://packagist.org/packages/tomatophp/filament-translations) @@ -47,47 +22,16 @@ this plugin is build in [spatie/laravel-translation-loader](https://github.com/s composer require tomatophp/filament-translations ``` -Finally reigster the plugin on `/app/Providers/Filament/AdminPanelProvider.php` - -```php -$panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()) -``` - - -### Allow ChatGPT Auto Translations - -If you want to use ChatGPT to auto-translate your languages, you need to install `OpenAI` package by running: - -```bash -composer require openai-php/laravel -``` - -now you need to add the following to your `.env` file: - -```bash -OPENAI_API_KEY= -OPENAI_ORGANIZATION= -``` - -allow the feature on your panel provider by adding the following: - -```php -$panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()->allowGPTScan()) -``` - - -### Allow Google Translate Auto Translations - -If you want to use Google Translate for auto-translating your languages, you need to install the `stichoza/google-translate` package by running: +now run install command ```bash -composer require stichoza/google-translate-php +php artisan filament-translations:install ``` -Enable the feature on your admin panel provider file by adding the following: +Finally register the plugin on `/app/Providers/Filament/AdminPanelProvider.php` ```php -$panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()->allowGoogleTranslateScan()) +$panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()) ``` ### Allow Create Button to Create New Language @@ -154,13 +98,7 @@ php artisan vendor:publish --tag="filament-translations-migrations" ## Use Language Switcher -You can use the language switcher in your panel by using the following plugin: - -```php -$panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsSwitcherPlugin::make()) -``` - -**NOTE** your auth user table must have `lang` filed on the table to make this switch working fine. +we move language switcher to another package you can check it [Filament Language Switcher](https://github.com/tomatophp/filament-language-switcher) ## Usage diff --git a/SECURITY.md b/SECURITY.md index e69de29..b2490a9 100644 --- a/SECURITY.md +++ b/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/composer.json b/composer.json index 6f421a3..34c574f 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,13 @@ "keywords": [ "php", "laravel", - "template" + "translations", + "loader", + "translation manager", + "database translations", + "cache translations", + "translation UI", + "filament plugin" ], "license": "MIT", "autoload": { @@ -15,7 +21,8 @@ }, "autoload-dev": { "psr-4": { - "Tests\\": "tests/" + "TomatoPHP\\FilamentTranslations\\Tests\\": "tests/src/", + "TomatoPHP\\FilamentTranslations\\Tests\\Database\\Factories\\": "tests/database/factories" } }, "extra": { @@ -31,14 +38,40 @@ "email": "info@3x1.io" } ], + "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 + } + }, "require": { "php": "^8.1|^8.2", "tomatophp/console-helpers": "^1.1", - "filament/filament": "^3.0.0", - "filament/notifications": "^3.0.0", + "filament/filament": "^3.2", + "filament/notifications": "^3.2", "tomatophp/filament-developer-gate": "^1.0", "spatie/laravel-translation-loader": "^2.7", "tomatophp/filament-translation-component": "^1.0", "maatwebsite/excel": "^3.1" + }, + "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..7acafa4 --- /dev/null +++ b/composer.lock @@ -0,0 +1,12887 @@ +{ + "_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": "38520e3b92cebfced22b1bd2a1618f76", + "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": "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": "ezyang/htmlpurifier", + "version": "v4.17.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" + }, + "time": "2023-11-17T15:01:25+00:00" + }, + { + "name": "filament/actions", + "version": "v3.2.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/actions.git", + "reference": "3b525a00a5ff3641825a5bacc00bb74a8a3ad370" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/3b525a00a5ff3641825a5bacc00bb74a8a3ad370", + "reference": "3b525a00a5ff3641825a5bacc00bb74a8a3ad370", + "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-23T07:36:06+00:00" + }, + { + "name": "filament/filament", + "version": "v3.2.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/panels.git", + "reference": "1d17d655e0ee8c276ec51c0522346c78e592f9ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/1d17d655e0ee8c276ec51c0522346c78e592f9ac", + "reference": "1d17d655e0ee8c276ec51c0522346c78e592f9ac", + "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-23T07:36:20+00:00" + }, + { + "name": "filament/forms", + "version": "v3.2.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/forms.git", + "reference": "562f5d78c2cb22cdea027496c92bd69a649b626e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/562f5d78c2cb22cdea027496c92bd69a649b626e", + "reference": "562f5d78c2cb22cdea027496c92bd69a649b626e", + "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-23T07:36:11+00:00" + }, + { + "name": "filament/infolists", + "version": "v3.2.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/infolists.git", + "reference": "f107a83c3ac042a4d4608d45173cf88c0c55276c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/f107a83c3ac042a4d4608d45173cf88c0c55276c", + "reference": "f107a83c3ac042a4d4608d45173cf88c0c55276c", + "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-16T12:07:29+00:00" + }, + { + "name": "filament/notifications", + "version": "v3.2.120", + "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-translatable-plugin", + "version": "v3.2.120", + "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.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/support.git", + "reference": "1b63dfd79ea37e940efad438717935081a61ba24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/support/zipball/1b63dfd79ea37e940efad438717935081a61ba24", + "reference": "1b63dfd79ea37e940efad438717935081a61ba24", + "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-23T07:36:38+00:00" + }, + { + "name": "filament/tables", + "version": "v3.2.120", + "source": { + "type": "git", + "url": "https://github.com/filamentphp/tables.git", + "reference": "69ff3ae5eaf4efc3fd92236f5b286147169b319d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/69ff3ae5eaf4efc3fd92236f5b286147169b319d", + "reference": "69ff3ae5eaf4efc3fd92236f5b286147169b319d", + "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-23T07:36:38+00:00" + }, + { + "name": "filament/widgets", + "version": "v3.2.120", + "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": "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": "maatwebsite/excel", + "version": "3.1.58", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "18495a71b112f43af8ffab35111a58b4e4ba4a4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/18495a71b112f43af8ffab35111a58b4e4ba4a4d", + "reference": "18495a71b112f43af8ffab35111a58b4e4ba4a4d", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.29.1", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.58" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2024-09-07T13:53:36+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": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+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": "phpoffice/phpspreadsheet", + "version": "1.29.2", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", + "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.2" + }, + "time": "2024-09-29T07:04:47+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/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-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/laravel-translation-loader", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-translation-loader.git", + "reference": "aaf88739159ec415137738e4cc2b93b179fc1094" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-translation-loader/zipball/aaf88739159ec415137738e4cc2b93b179fc1094", + "reference": "aaf88739159ec415137738e4cc2b93b179fc1094", + "shasum": "" + }, + "require": { + "illuminate/translation": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^8.0|^9.0|^10.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\TranslationLoader\\TranslationServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\TranslationLoader\\": "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": "Store your language lines in the database, yaml or other sources", + "homepage": "https://github.com/spatie/laravel-translation-loader", + "keywords": [ + "database", + "db", + "i8n", + "language", + "laravel", + "laravel-translation-loader", + "spatie", + "translate" + ], + "support": { + "source": "https://github.com/spatie/laravel-translation-loader/tree/2.8.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2024-03-02T05:30:59+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "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.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee", + "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.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "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.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+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.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", + "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.3" + }, + "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-07-26T13:02:51+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "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.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+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.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823", + "reference": "d95bbf319f7d052082fb7af147e0f835a695e823", + "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.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-13T14:28:19+00:00" + }, + { + "name": "symfony/html-sanitizer", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/html-sanitizer.git", + "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/89bf376c056926bd7fe8a81c0f486a060e20fdbc", + "reference": "89bf376c056926bd7fe8a81c0f486a060e20fdbc", + "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.5" + }, + "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-20T13:35:23+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b", + "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b", + "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.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b", + "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b", + "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.5" + }, + "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-21T06:09:21+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b", + "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b", + "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.5" + }, + "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-08T12:32:26+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff", + "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff", + "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.5" + }, + "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-20T08:28:38+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.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5c03ee6369281177f07f7c68252a280beccba847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847", + "reference": "5c03ee6369281177f07f7c68252a280beccba847", + "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.5" + }, + "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-19T21:48:23+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7", + "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.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-29T08:16:25+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.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "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.5" + }, + "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-20T08:28:38+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea", + "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.5" + }, + "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-16T06:30:38+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.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317", + "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.5" + }, + "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-17T09:16:35+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d", + "reference": "e20e03889539fd4e4211e14d2179226c513c010d", + "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.5" + }, + "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-16T10:07:02+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-developer-gate", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/tomatophp/filament-developer-gate.git", + "reference": "4cec435f36cef2a06871cbe7d7cd7b8b11abc7ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tomatophp/filament-developer-gate/zipball/4cec435f36cef2a06871cbe7d7cd7b8b11abc7ac", + "reference": "4cec435f36cef2a06871cbe7d7cd7b8b11abc7ac", + "shasum": "" + }, + "require": { + "filament/filament": "^3.0.0", + "filament/notifications": "^3.0.0", + "php": "^8.1|^8.2", + "tomatophp/console-helpers": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "TomatoPHP\\FilamentDeveloperGate\\FilamentDeveloperGateServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "TomatoPHP\\FilamentDeveloperGate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fady Mondy", + "email": "info@3x1.io" + } + ], + "description": "Secure your selected route by using a middleware with static password for developers only", + "keywords": [ + "auth", + "developer", + "filament", + "gate", + "laravel", + "php", + "secure", + "tools" + ], + "support": { + "issues": "https://github.com/tomatophp/filament-developer-gate/issues", + "source": "https://github.com/tomatophp/filament-developer-gate/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/3x1io", + "type": "github" + } + ], + "time": "2024-07-08T10:18: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/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.3", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "9a5754622881f601951427a94c04c50e448cbf09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/9a5754622881f601951427a94c04c50e448cbf09", + "reference": "9a5754622881f601951427a94c04c50e448cbf09", + "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-06T11:20:27+00:00" + }, + { + "name": "orchestra/workbench", + "version": "v9.6.0", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "4bb12d505f24b450d1693e88faddc44a1c835907" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/4bb12d505f24b450d1693e88faddc44a1c835907", + "reference": "4bb12d505f24b450d1693e88faddc44a1c835907", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^11.11", + "laravel/tinker": "^2.9", + "nunomaduro/collision": "^8.0", + "orchestra/canvas": "^9.1", + "orchestra/testbench-core": "^9.4", + "php": "^8.1", + "spatie/laravel-ray": "^1.35", + "symfony/polyfill-php83": "^1.28", + "symfony/yaml": "^7.0" + }, + "require-dev": { + "laravel/pint": "^1.17", + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^10.5 || ^11.0", + "symfony/process": "^7.0" + }, + "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.6.0" + }, + "time": "2024-08-26T05:38:42+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/stopwatch", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d", + "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.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", + "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "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.5" + }, + "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-17T12:49:58+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-translations.php b/config/filament-translations.php index 20443d0..ef01a93 100644 --- a/config/filament-translations.php +++ b/config/filament-translations.php @@ -9,23 +9,12 @@ | add path that will be show to the scaner to catch lanuages tags | */ - "paths" => [ + 'paths' => [ app_path(), resource_path('views'), - base_path('vendor') + base_path('vendor'), ], - /* - |-------------------------------------------------------------------------- - | Redirect - |-------------------------------------------------------------------------- - | - | set the redirect path when change the language between selected path or next request - | - */ - "redirect" => "next", - - /* |-------------------------------------------------------------------------- | Excluded paths @@ -35,8 +24,7 @@ | */ - "excludedPaths" => [], - + 'excludedPaths' => [], /* |-------------------------------------------------------------------------- @@ -46,26 +34,25 @@ | add the locals that will be show on the languages selector | */ - "locals" => [ - "en" => [ - "label" => "English", - "flag" => "us" + 'locals' => [ + 'en' => [ + 'label' => 'English', + 'flag' => 'us', ], - "ar" => [ - "label" => "Arabic", - "flag" => "eg" + 'ar' => [ + 'label' => 'Arabic', + 'flag' => 'eg', ], - "pt_BR" => [ - "label" => "Português (Brasil)", - "flag" => "br" + 'pt_BR' => [ + 'label' => 'Português (Brasil)', + 'flag' => 'br', ], - "my" => [ - "label" => "Burmese", - "flag" => "mm" + 'my' => [ + 'label' => 'Burmese', + 'flag' => 'mm', ], ], - /* |-------------------------------------------------------------------------- | Modal @@ -74,27 +61,7 @@ | use simple modal resource for the translation resource | */ - "modal" => true, - - /* - |-------------------------------------------------------------------------- - | Language Switcher - |-------------------------------------------------------------------------- - | - | Enable the language switcher feature in the Filament top bar. - | - */ - 'language_switcher' => true, - - /* - |-------------------------------------------------------------------------- - | - | Determines the render hook for the language switcher. - | Available render hooks: https://filamentphp.com/docs/3.x/support/render-hooks#available-render-hooks - | - */ - - 'language_switcher_render_hook' => 'panels::user-menu.before', + 'modal' => true, /* |-------------------------------------------------------------------------- @@ -138,15 +105,14 @@ 'export_enabled' => true, 'import_enabled' => true, - /* |-------------------------------------------------------------------------- | | Translation resource. | */ - 'translation_resource' => \TomatoPHP\FilamentTranslations\Resources\TranslationResource::class, - + 'translation_resource' => \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource::class, + /* |-------------------------------------------------------------------------- | @@ -162,15 +128,4 @@ | */ 'path_to_custom_excel_import' => null, - - - /* - |-------------------------------------------------------------------------- - | - | Language Switch Middlewares - | - */ - 'language_switcher_middlewares' => [ - 'web' - ] ]; diff --git a/database/migrations/2022_01_25_010712_create_language_lines_table.php b/database/migrations/2022_01_25_010712_create_language_lines_table.php index a6d9a72..a6d4863 100644 --- a/database/migrations/2022_01_25_010712_create_language_lines_table.php +++ b/database/migrations/2022_01_25_010712_create_language_lines_table.php @@ -1,8 +1,8 @@ softDeletes(); $table->timestamps(); }); - - if (!Schema::hasColumn('users', 'lang')) { - Schema::table('users', function (Blueprint $table) { - $table->string('lang')->default('en'); - }); - } } /** @@ -41,11 +35,5 @@ public function up() public function down() { Schema::drop('language_lines'); - - if (Schema::hasColumn('users', 'lang')) { - Schema::table('users', function (Blueprint $table) { - $table->dropColumn('lang'); - }); - } } } diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..7f9ffa3 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,13 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: 8 + paths: + - src + - config + - database + - tests/PHPStan + tmpDir: build/phpstan + parallel: + maximumNumberOfProcesses: 1 diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..7b563df --- /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/global.php b/resources/lang/ar/global.php index c6f0a40..3b18ec9 100644 --- a/resources/lang/ar/global.php +++ b/resources/lang/ar/global.php @@ -1,8 +1,8 @@ "تمت الاضافة في", - "updated_at" => "تم التعديل في", - "filter_by_group" => "تصفية بالمجموعة", - "filter_by_null_text" => "تصفية بالنصوص الغير مترجمة", + 'created_at' => 'تمت الاضافة في', + 'updated_at' => 'تم التعديل في', + 'filter_by_group' => 'تصفية بالمجموعة', + 'filter_by_null_text' => 'تصفية بالنصوص الغير مترجمة', ]; diff --git a/resources/lang/ar/translation.php b/resources/lang/ar/translation.php index fc670c7..07b49ff 100644 --- a/resources/lang/ar/translation.php +++ b/resources/lang/ar/translation.php @@ -1,47 +1,47 @@ [ - "home" => "الترجمات", - "list" => "الترجمات", - "create" => "إنشاء ترجمة", - "edit" => "تعديل ترجمة", + 'title' => [ + 'home' => 'الترجمات', + 'list' => 'الترجمات', + 'create' => 'إنشاء ترجمة', + 'edit' => 'تعديل ترجمة', ], - "label" => "الترجمات", - "single" => "ترجمة", - "group" => "الإعدادات", - "key" => "المفتاح", - "text" => "النص", - "gpt_scan" => "استخدام GPT", - "gpt_scan_language" => "اللغة", - "gpt_scan_notification_start" => "تم بدء استخدام GPT", - "gpt_scan_notifications_done" => "تم الانتهاء من استخدام GPT", - "google_scan" => "Google استخدام ترجمة", - "google_scan_notification_start" => "تم بدء استخدام Google-Translate", - "google_scan_notifications_done" => "Google-Translate تم الانتهاء من استخدام", - "clear_notifications" => "تم مسح الترجمات", - "clear" => "مسح جميع الترجمات", - "scan" => "الحصول علي الترجمات", - "namespace" => "النطاق", - "notification" => "تم تغيير اللغة بنجاح", - "loaded" => "تم تحديث قائمة الترجمات بنجاح", - "uploaded" => "تم استيراد الترجمات بنجاح", - "menu" => "تغيير اللغة", - "import" => "استيراد", - "export" => "تصدير", - "import-file" => "برجاء اختيار ملف الاكسيل المصدر بعد ترجمته", - "modal" => [ - "heading" => "تحديث اللغة الحالية", - "button" => "حفظ اللغة", - "setting" => "الإعدادات", - "select" => "اللغة", + 'label' => 'الترجمات', + 'single' => 'ترجمة', + 'group' => 'الإعدادات', + 'key' => 'المفتاح', + 'text' => 'النص', + 'gpt_scan' => 'استخدام GPT', + 'gpt_scan_language' => 'اللغة', + 'gpt_scan_notification_start' => 'تم بدء استخدام GPT', + 'gpt_scan_notifications_done' => 'تم الانتهاء من استخدام GPT', + 'google_scan' => 'Google استخدام ترجمة', + 'google_scan_notification_start' => 'تم بدء استخدام Google-Translate', + 'google_scan_notifications_done' => 'Google-Translate تم الانتهاء من استخدام', + 'clear_notifications' => 'تم مسح الترجمات', + 'clear' => 'مسح جميع الترجمات', + 'scan' => 'الحصول علي الترجمات', + 'namespace' => 'النطاق', + 'notification' => 'تم تغيير اللغة بنجاح', + 'loaded' => 'تم تحديث قائمة الترجمات بنجاح', + 'uploaded' => 'تم استيراد الترجمات بنجاح', + 'menu' => 'تغيير اللغة', + 'import' => 'استيراد', + 'export' => 'تصدير', + 'import-file' => 'برجاء اختيار ملف الاكسيل المصدر بعد ترجمته', + 'modal' => [ + 'heading' => 'تحديث اللغة الحالية', + 'button' => 'حفظ اللغة', + 'setting' => 'الإعدادات', + 'select' => 'اللغة', + ], + 'lang' => [ + 'ar' => 'العربية', + 'en' => 'الانجليزية', + 'pt_BR' => 'البرتغالية - البرازيل', + 'my' => 'البورمية', + 'nl' => 'الهولندية', + 'de' => 'الألمانية', ], - "lang" => [ - "ar" => "العربية", - "en" => "الانجليزية", - "pt_BR" => "البرتغالية - البرازيل", - "my" => "البورمية", - "nl" => "الهولندية", - "de" => "الألمانية", - ] ]; diff --git a/resources/lang/de/global.php b/resources/lang/de/global.php index cb39be7..6895cbe 100644 --- a/resources/lang/de/global.php +++ b/resources/lang/de/global.php @@ -1,8 +1,8 @@ "Erstellt am", - "updated_at" => "Aktualisiert am", - "filter_by_group" => "Filter nach Gruppe", - "filter_by_null_text" => "Filter nach leerem Text", + 'created_at' => 'Erstellt am', + 'updated_at' => 'Aktualisiert am', + 'filter_by_group' => 'Filter nach Gruppe', + 'filter_by_null_text' => 'Filter nach leerem Text', ]; diff --git a/resources/lang/de/translation.php b/resources/lang/de/translation.php index 6d56f23..5e46435 100644 --- a/resources/lang/de/translation.php +++ b/resources/lang/de/translation.php @@ -1,46 +1,46 @@ [ - "home" => "Übersetzungen", - "list" => "Übersetzungen", - "create" => "Übersetzung erstellen", - "edit" => "Übersetzung bearbeiten", + 'title' => [ + 'home' => 'Übersetzungen', + 'list' => 'Übersetzungen', + 'create' => 'Übersetzung erstellen', + 'edit' => 'Übersetzung bearbeiten', ], - "label" => "Übersetzungen", - "single" => "Übersetzung", - "group" => "Einstellungen", - "gpt_scan" => "GPT verwenden", - "gpt_scan_notifications_done" => "GPT-Scan wurde abgeschlossen", - "gpt_scan_language" => "Sprache", - "gpt_scan_notification_start" => "GPT-Scan wurde gestartet", - "google_scan" => "Google Übersetzer verwenden", - "google_scan_notifications_start" => "Google-Übersetzer-Scan wurde gestartet", - "google_scan_notifications_done" => "Google-Übersetzer-Scan wurde abgeschlossen", - "clear_notifications" => "Übersetzungen wurden gelöscht", - "clear" => "Alle Übersetzungen löschen", - "key" => "Schlüssel", - "text" => "Text", - "scan" => "Nach neuen Sprachen suchen", - "namespace" => "Namensraum", - "notification" => "Sprache wurde erfolgreich geändert", - "loaded" => "Übersetzungsliste wurde aktualisiert", - "uploaded" => "Übersetzungen wurden erfolgreich hochgeladen", - "import" => "Importieren", - "export" => "Exportieren", - "import-file" => "Wählen Sie die exportierte Datei nach der Übersetzung aus", - "menu" => "Sprache ändern", - "modal" => [ - "heading" => "Aktuelle Sprache aktualisieren", - "button" => "Sprache speichern", - "setting" => "Einstellungen", - "select" => "Sprache", + 'label' => 'Übersetzungen', + 'single' => 'Übersetzung', + 'group' => 'Einstellungen', + 'gpt_scan' => 'GPT verwenden', + 'gpt_scan_notifications_done' => 'GPT-Scan wurde abgeschlossen', + 'gpt_scan_language' => 'Sprache', + 'gpt_scan_notification_start' => 'GPT-Scan wurde gestartet', + 'google_scan' => 'Google Übersetzer verwenden', + 'google_scan_notifications_start' => 'Google-Übersetzer-Scan wurde gestartet', + 'google_scan_notifications_done' => 'Google-Übersetzer-Scan wurde abgeschlossen', + 'clear_notifications' => 'Übersetzungen wurden gelöscht', + 'clear' => 'Alle Übersetzungen löschen', + 'key' => 'Schlüssel', + 'text' => 'Text', + 'scan' => 'Nach neuen Sprachen suchen', + 'namespace' => 'Namensraum', + 'notification' => 'Sprache wurde erfolgreich geändert', + 'loaded' => 'Übersetzungsliste wurde aktualisiert', + 'uploaded' => 'Übersetzungen wurden erfolgreich hochgeladen', + 'import' => 'Importieren', + 'export' => 'Exportieren', + 'import-file' => 'Wählen Sie die exportierte Datei nach der Übersetzung aus', + 'menu' => 'Sprache ändern', + 'modal' => [ + 'heading' => 'Aktuelle Sprache aktualisieren', + 'button' => 'Sprache speichern', + 'setting' => 'Einstellungen', + 'select' => 'Sprache', + ], + 'lang' => [ + 'ar' => 'Arabisch', + 'en' => 'Englisch', + 'pt_BR' => 'Portugiesisch (Brasilien)', + 'my' => 'Burmesisch', + 'de' => 'Deutsch', ], - "lang" => [ - "ar" => "Arabisch", - "en" => "Englisch", - "pt_BR" => "Portugiesisch (Brasilien)", - "my" => "Burmesisch", - "de" => "Deutsch", - ] ]; diff --git a/resources/lang/en/global.php b/resources/lang/en/global.php index 8ab602e..b80f737 100644 --- a/resources/lang/en/global.php +++ b/resources/lang/en/global.php @@ -1,8 +1,8 @@ "Created At", - "updated_at" => "Updated At", - "filter_by_group" => "Filter by Group", - "filter_by_null_text" => "Filter by Empty Text", + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + 'filter_by_group' => 'Filter by Group', + 'filter_by_null_text' => 'Filter by Empty Text', ]; diff --git a/resources/lang/en/translation.php b/resources/lang/en/translation.php index a06b611..f2b2734 100644 --- a/resources/lang/en/translation.php +++ b/resources/lang/en/translation.php @@ -1,46 +1,46 @@ [ - "home" => "Translations", - "list" => "Translations", - "create" => "Create Translation", - "edit" => "Edit Translation", + 'title' => [ + 'home' => 'Translations', + 'list' => 'Translations', + 'create' => 'Create Translation', + 'edit' => 'Edit Translation', ], - "label" => "Translations", - "single" => "Translation", - "group" => "Settings", - "gpt_scan_language" => "Language", - "gpt_scan" => "Use GPT", - "gpt_scan_notification_start" => "GPT Scan has been started", - "gpt_scan_notifications_done" => "GPT Scan has been completed", - "google_scan" => "Use Google Translate", - "google_scan_notifications_start" => "Google-Translate scan has been started", - "google_scan_notifications_done" => "Google-Translate scan has been completed", - "clear_notifications" => "Translations has been cleared", - "clear" => "Clear All Translations", - "key" => "Key", - "text" => "Text", - "scan" => "Scan For New Languages", - "namespace" => "Namespace", - "notification" => "Language has been changed successfully", - "loaded" => "Translations list has been updated", - "uploaded" => "Translations has been uploaded successfully", - "import" => "Import", - "export" => "Export", - "import-file" => "Select Exported File After Translate It", - "menu" => "Change Language", - "modal" => [ - "heading" => "Update current language", - "button" => "Save, language", - "setting" => "Settings", - "select" => "Language", + 'label' => 'Translations', + 'single' => 'Translation', + 'group' => 'Settings', + 'gpt_scan_language' => 'Language', + 'gpt_scan' => 'Use GPT', + 'gpt_scan_notification_start' => 'GPT Scan has been started', + 'gpt_scan_notifications_done' => 'GPT Scan has been completed', + 'google_scan' => 'Use Google Translate', + 'google_scan_notifications_start' => 'Google-Translate scan has been started', + 'google_scan_notifications_done' => 'Google-Translate scan has been completed', + 'clear_notifications' => 'Translations has been cleared', + 'clear' => 'Clear All Translations', + 'key' => 'Key', + 'text' => 'Text', + 'scan' => 'Scan For New Languages', + 'namespace' => 'Namespace', + 'notification' => 'Language has been changed successfully', + 'loaded' => 'Translations list has been updated', + 'uploaded' => 'Translations has been uploaded successfully', + 'import' => 'Import', + 'export' => 'Export', + 'import-file' => 'Select Exported File After Translate It', + 'menu' => 'Change Language', + 'modal' => [ + 'heading' => 'Update current language', + 'button' => 'Save, language', + 'setting' => 'Settings', + 'select' => 'Language', + ], + 'lang' => [ + 'ar' => 'Arabic', + 'en' => 'English', + 'pt_BR' => 'Português (Brasil)', + 'my' => 'Burmese', + 'de' => 'German', ], - "lang" => [ - "ar" => "Arabic", - "en" => "English", - "pt_BR" => "Português (Brasil)", - "my" => "Burmese", - "de" => "German", - ] ]; diff --git a/resources/lang/es/global.php b/resources/lang/es/global.php index 7f830ff..89a2a1a 100644 --- a/resources/lang/es/global.php +++ b/resources/lang/es/global.php @@ -1,8 +1,8 @@ "Creado", - "updated_at" => "Modificado", - "filter_by_group" => "Filter by Group", - "filter_by_null_text" => "Filter by Empty Text", + 'created_at' => 'Creado', + 'updated_at' => 'Modificado', + 'filter_by_group' => 'Filter by Group', + 'filter_by_null_text' => 'Filter by Empty Text', ]; diff --git a/resources/lang/es/translation.php b/resources/lang/es/translation.php index c81c841..899568a 100644 --- a/resources/lang/es/translation.php +++ b/resources/lang/es/translation.php @@ -1,46 +1,46 @@ [ - "home" => "Traducciones", - "list" => "Traducciones", - "create" => "Crear Traducción", - "edit" => "Editar Traducción", - ], - "label" => "Traducciones", - "single" => "Traducción", - "group" => "Configuraciones", - "language" => "Idioma", - "gpt_scan" => "Usar GPT", - "gpt_scan_notification_start" => "El escaneo GPT ha comenzado", - "gpt_scan_notifications_done" => "El escaneo GPT se ha completado", - "google_scan" => "Usar Google Translate", - "google_scan_notifications_start" => "El escaneo de Google Translate ha comenzado", - "google_scan_notifications_done" => "El escaneo de Google Translate se ha completado", - "clear_notifications" => "Las traducciones han sido borradas", - "clear" => "Borrar todas las traducciones", - "key" => "Clave", - "text" => "Texto", - "scan" => "Buscar nuevos idiomas", - "namespace" => "Espacio de nombres", - "notification" => "El idioma ha sido cambiado exitosamente", - "loaded" => "La lista de traducciones se ha actualizado", - "uploaded" => "Las traducciones se han subido con éxito", - "import" => "Importar", - "export" => "Exportar", - "import-file" => "Seleccione el archivo exportado después de traducirlo", - "menu" => "Cambiar idioma", - "modal" => [ - "heading" => "Actualizar el idioma actual", - "button" => "Guardar, idioma", - "setting" => "Configuraciones", - "select" => "Idioma", - ], - "lang" => [ - "ar" => "Árabe", - "en" => "Inglés", - "pt_BR" => "Portugués (Brasil)", - "my" => "Birmano", - "de" => "Alemán", - ] -]; \ No newline at end of file + 'title' => [ + 'home' => 'Traducciones', + 'list' => 'Traducciones', + 'create' => 'Crear Traducción', + 'edit' => 'Editar Traducción', + ], + 'label' => 'Traducciones', + 'single' => 'Traducción', + 'group' => 'Configuraciones', + 'language' => 'Idioma', + 'gpt_scan' => 'Usar GPT', + 'gpt_scan_notification_start' => 'El escaneo GPT ha comenzado', + 'gpt_scan_notifications_done' => 'El escaneo GPT se ha completado', + 'google_scan' => 'Usar Google Translate', + 'google_scan_notifications_start' => 'El escaneo de Google Translate ha comenzado', + 'google_scan_notifications_done' => 'El escaneo de Google Translate se ha completado', + 'clear_notifications' => 'Las traducciones han sido borradas', + 'clear' => 'Borrar todas las traducciones', + 'key' => 'Clave', + 'text' => 'Texto', + 'scan' => 'Buscar nuevos idiomas', + 'namespace' => 'Espacio de nombres', + 'notification' => 'El idioma ha sido cambiado exitosamente', + 'loaded' => 'La lista de traducciones se ha actualizado', + 'uploaded' => 'Las traducciones se han subido con éxito', + 'import' => 'Importar', + 'export' => 'Exportar', + 'import-file' => 'Seleccione el archivo exportado después de traducirlo', + 'menu' => 'Cambiar idioma', + 'modal' => [ + 'heading' => 'Actualizar el idioma actual', + 'button' => 'Guardar, idioma', + 'setting' => 'Configuraciones', + 'select' => 'Idioma', + ], + 'lang' => [ + 'ar' => 'Árabe', + 'en' => 'Inglés', + 'pt_BR' => 'Portugués (Brasil)', + 'my' => 'Birmano', + 'de' => 'Alemán', + ], +]; diff --git a/resources/lang/my/global.php b/resources/lang/my/global.php index e36dbd3..e68771a 100644 --- a/resources/lang/my/global.php +++ b/resources/lang/my/global.php @@ -1,8 +1,8 @@ "တည်ဆောက်သောနေ့", - "updated_at" => "ပြုပြင်သောနေ့", - "filter_by_group" => "Filter by Group", - "filter_by_null_text" => "Filter by Empty Text", + 'created_at' => 'တည်ဆောက်သောနေ့', + 'updated_at' => 'ပြုပြင်သောနေ့', + 'filter_by_group' => 'Filter by Group', + 'filter_by_null_text' => 'Filter by Empty Text', ]; diff --git a/resources/lang/my/translation.php b/resources/lang/my/translation.php index 21af103..e58a163 100644 --- a/resources/lang/my/translation.php +++ b/resources/lang/my/translation.php @@ -1,46 +1,46 @@ [ - "home" => "ဘာသာပြန်ဆိုမှုများ", - "list" => "ဘာသာပြန်ဆိုမှုများ", - "create" => "ဘာသာပြန်ဆိုမှု အသစ် ဖန်တီးပါ", - "edit" => "ဘာသာပြန်ဆိုမှု တည်းဖြတ်ပါ", - ], - "label" => "ဘာသာပြန်ဆိုမှုများ", - "single" => "ဘာသာပြန်ဆိုမှု", - "group" => "ဆက်တင်များ", - "language" => "ဘာသာစကား", - "gpt_scan" => "GPT အသုံးပြုပါ", - "gpt_scan_notification_start" => "GPT စစ်ဆေးမှု စတင်ပြီးပါပြီ", - "gpt_scan_notifications_done" => "GPT စစ်ဆေးမှု ပြီးစီးပြီးပါပြီ", - "google_scan" => "Google ဘာသာပြန်ကို အသုံးပြုပါ", - "google_scan_notifications_start" => "Google ဘာသာပြန် စစ်ဆေးမှု စတင်လိုက်ပါပြီ", - "google_scan_notifications_done" => "Google ဘာသာပြန် စစ်ဆေးမှု ပြီးစီးပါပြီ", - "clear_notifications" => "ဘာသာပြန်ဆိုမှုများကို ရှင်းလင်းပြီးပါပြီ", - "clear" => "အားလုံး ရှင်းလင်းပါ", - "key" => "Key", - "text" => "စာသား", - "scan" => "ဘာသာစကားအသစ်များအတွက် စစ်ဆေးပါ", - "namespace" => "Namespace", - "notification" => "ဘာသာစကား အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ", - "loaded" => "ဘာသာပြန်ဆိုမှု စာရင်းကို အပ်ဒိတ်လုပ်ပြီးပါပြီ", - "uploaded" => "ဘာသာပြန်ဆိုမှုများ အောင်မြင်စွာ တင်ပြီးပါပြီ", - "import" => "သွင်းယူပါ", - "export" => "တင်ပို့ပါ", - "import-file" => "ဘာသာပြန်ပြီးသော ဖိုင်ကို ရွေးပါ", - "menu" => "ဘာသာစကား ပြောင်းပါ", - "modal" => [ - "heading" => "လက်ရှိ ဘာသာစကားကို အပ်ဒိတ်လုပ်ပါ", - "button" => "ဘာသာစကား သိမ်းဆည်းပါ", - "setting" => "ဆက်တင်များ", - "select" => "ဘာသာစကား", - ], - "lang" => [ - "ar" => "အာရဗီ", - "en" => "အင်္ဂလိပ်", - "pt_BR" => "ပို်တူဂီ (ဘရာဇီး)", - "my" => "ဗမာ", - "de" => "ဂျာမန်", - ] -]; \ No newline at end of file + 'title' => [ + 'home' => 'ဘာသာပြန်ဆိုမှုများ', + 'list' => 'ဘာသာပြန်ဆိုမှုများ', + 'create' => 'ဘာသာပြန်ဆိုမှု အသစ် ဖန်တီးပါ', + 'edit' => 'ဘာသာပြန်ဆိုမှု တည်းဖြတ်ပါ', + ], + 'label' => 'ဘာသာပြန်ဆိုမှုများ', + 'single' => 'ဘာသာပြန်ဆိုမှု', + 'group' => 'ဆက်တင်များ', + 'language' => 'ဘာသာစကား', + 'gpt_scan' => 'GPT အသုံးပြုပါ', + 'gpt_scan_notification_start' => 'GPT စစ်ဆေးမှု စတင်ပြီးပါပြီ', + 'gpt_scan_notifications_done' => 'GPT စစ်ဆေးမှု ပြီးစီးပြီးပါပြီ', + 'google_scan' => 'Google ဘာသာပြန်ကို အသုံးပြုပါ', + 'google_scan_notifications_start' => 'Google ဘာသာပြန် စစ်ဆေးမှု စတင်လိုက်ပါပြီ', + 'google_scan_notifications_done' => 'Google ဘာသာပြန် စစ်ဆေးမှု ပြီးစီးပါပြီ', + 'clear_notifications' => 'ဘာသာပြန်ဆိုမှုများကို ရှင်းလင်းပြီးပါပြီ', + 'clear' => 'အားလုံး ရှင်းလင်းပါ', + 'key' => 'Key', + 'text' => 'စာသား', + 'scan' => 'ဘာသာစကားအသစ်များအတွက် စစ်ဆေးပါ', + 'namespace' => 'Namespace', + 'notification' => 'ဘာသာစကား အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ', + 'loaded' => 'ဘာသာပြန်ဆိုမှု စာရင်းကို အပ်ဒိတ်လုပ်ပြီးပါပြီ', + 'uploaded' => 'ဘာသာပြန်ဆိုမှုများ အောင်မြင်စွာ တင်ပြီးပါပြီ', + 'import' => 'သွင်းယူပါ', + 'export' => 'တင်ပို့ပါ', + 'import-file' => 'ဘာသာပြန်ပြီးသော ဖိုင်ကို ရွေးပါ', + 'menu' => 'ဘာသာစကား ပြောင်းပါ', + 'modal' => [ + 'heading' => 'လက်ရှိ ဘာသာစကားကို အပ်ဒိတ်လုပ်ပါ', + 'button' => 'ဘာသာစကား သိမ်းဆည်းပါ', + 'setting' => 'ဆက်တင်များ', + 'select' => 'ဘာသာစကား', + ], + 'lang' => [ + 'ar' => 'အာရဗီ', + 'en' => 'အင်္ဂလိပ်', + 'pt_BR' => 'ပို်တူဂီ (ဘရာဇီး)', + 'my' => 'ဗမာ', + 'de' => 'ဂျာမန်', + ], +]; diff --git a/resources/lang/nl/global.php b/resources/lang/nl/global.php index 0950f2a..0a59854 100644 --- a/resources/lang/nl/global.php +++ b/resources/lang/nl/global.php @@ -1,8 +1,8 @@ "Aangemaakt op", - "updated_at" => "Bijgewerkt op", - "filter_by_group" => "Filteren op Groep", - "filter_by_null_text" => "Filteren op Lege Tekst", + 'created_at' => 'Aangemaakt op', + 'updated_at' => 'Bijgewerkt op', + 'filter_by_group' => 'Filteren op Groep', + 'filter_by_null_text' => 'Filteren op Lege Tekst', ]; diff --git a/resources/lang/nl/translation.php b/resources/lang/nl/translation.php index d8c2edd..34629e9 100644 --- a/resources/lang/nl/translation.php +++ b/resources/lang/nl/translation.php @@ -1,46 +1,46 @@ [ - "home" => "Vertalingen", - "list" => "Vertalingen", - "create" => "Vertaling aanmaken", - "edit" => "Vertaling bewerken", - ], - "label" => "Vertalingen", - "single" => "Vertaling", - "group" => "Instellingen", - "language" => "Taal", - "gpt_scan" => "Gebruik GPT", - "gpt_scan_notification_start" => "GPT-scan is gestart", - "gpt_scan_notifications_done" => "GPT-scan is voltooid", - "google_scan" => "Gebruik Google Translate", - "google_scan_notifications_start" => "Google Translate-scan is gestart", - "google_scan_notifications_done" => "Google Translate-scan is voltooid", - "clear_notifications" => "Vertalingen zijn gewist", - "clear" => "Wis alle vertalingen", - "key" => "Sleutel", - "text" => "Tekst", - "scan" => "Scan voor nieuwe talen", - "namespace" => "Namespace", - "notification" => "Taal is succesvol gewijzigd", - "loaded" => "Vertalingenlijst is bijgewerkt", - "uploaded" => "Vertalingen zijn succesvol geüpload", - "import" => "Importeren", - "export" => "Exporteren", - "import-file" => "Selecteer geëxporteerd bestand na vertaling", - "menu" => "Wijzig taal", - "modal" => [ - "heading" => "Huidige taal bijwerken", - "button" => "Taal opslaan", - "setting" => "Instellingen", - "select" => "Taal", - ], - "lang" => [ - "ar" => "Arabisch", - "en" => "Engels", - "pt_BR" => "Portugees (Brazilië)", - "my" => "Birmaans", - "de" => "Duits", - ] -]; \ No newline at end of file + 'title' => [ + 'home' => 'Vertalingen', + 'list' => 'Vertalingen', + 'create' => 'Vertaling aanmaken', + 'edit' => 'Vertaling bewerken', + ], + 'label' => 'Vertalingen', + 'single' => 'Vertaling', + 'group' => 'Instellingen', + 'language' => 'Taal', + 'gpt_scan' => 'Gebruik GPT', + 'gpt_scan_notification_start' => 'GPT-scan is gestart', + 'gpt_scan_notifications_done' => 'GPT-scan is voltooid', + 'google_scan' => 'Gebruik Google Translate', + 'google_scan_notifications_start' => 'Google Translate-scan is gestart', + 'google_scan_notifications_done' => 'Google Translate-scan is voltooid', + 'clear_notifications' => 'Vertalingen zijn gewist', + 'clear' => 'Wis alle vertalingen', + 'key' => 'Sleutel', + 'text' => 'Tekst', + 'scan' => 'Scan voor nieuwe talen', + 'namespace' => 'Namespace', + 'notification' => 'Taal is succesvol gewijzigd', + 'loaded' => 'Vertalingenlijst is bijgewerkt', + 'uploaded' => 'Vertalingen zijn succesvol geüpload', + 'import' => 'Importeren', + 'export' => 'Exporteren', + 'import-file' => 'Selecteer geëxporteerd bestand na vertaling', + 'menu' => 'Wijzig taal', + 'modal' => [ + 'heading' => 'Huidige taal bijwerken', + 'button' => 'Taal opslaan', + 'setting' => 'Instellingen', + 'select' => 'Taal', + ], + 'lang' => [ + 'ar' => 'Arabisch', + 'en' => 'Engels', + 'pt_BR' => 'Portugees (Brazilië)', + 'my' => 'Birmaans', + 'de' => 'Duits', + ], +]; diff --git a/resources/lang/pt_BR/global.php b/resources/lang/pt_BR/global.php index 21536fa..6f451a2 100644 --- a/resources/lang/pt_BR/global.php +++ b/resources/lang/pt_BR/global.php @@ -1,8 +1,8 @@ "Criado em", - "updated_at" => "Atualizado em", - "filter_by_group" => "Filter by Group", - "filter_by_null_text" => "Filter by Empty Text", + 'created_at' => 'Criado em', + 'updated_at' => 'Atualizado em', + 'filter_by_group' => 'Filter by Group', + 'filter_by_null_text' => 'Filter by Empty Text', ]; diff --git a/resources/lang/pt_BR/translation.php b/resources/lang/pt_BR/translation.php index 549d7ba..6c1db71 100644 --- a/resources/lang/pt_BR/translation.php +++ b/resources/lang/pt_BR/translation.php @@ -1,46 +1,46 @@ [ - "home" => "Traduções", - "list" => "Traduções", - "create" => "Criar Tradução", - "edit" => "Editar Tradução", - ], - "label" => "Traduções", - "single" => "Tradução", - "group" => "Configurações", - "language" => "Idioma", - "gpt_scan" => "Usar GPT", - "gpt_scan_notification_start" => "A verificação GPT foi iniciada", - "gpt_scan_notifications_done" => "A verificação GPT foi concluída", - "google_scan" => "Usar Google Tradutor", - "google_scan_notifications_start" => "A verificação do Google Tradutor foi iniciada", - "google_scan_notifications_done" => "A verificação do Google Tradutor foi concluída", - "clear_notifications" => "As traduções foram limpas", - "clear" => "Limpar todas as traduções", - "key" => "Chave", - "text" => "Texto", - "scan" => "Verificar novos idiomas", - "namespace" => "Namespace", - "notification" => "Idioma alterado com sucesso", - "loaded" => "Lista de traduções foi atualizada", - "uploaded" => "Traduções foram carregadas com sucesso", - "import" => "Importar", - "export" => "Exportar", - "import-file" => "Selecione o arquivo exportado após traduzi-lo", - "menu" => "Alterar Idioma", - "modal" => [ - "heading" => "Atualizar idioma atual", - "button" => "Salvar, idioma", - "setting" => "Configurações", - "select" => "Idioma", - ], - "lang" => [ - "ar" => "Árabe", - "en" => "Inglês", - "pt_BR" => "Português (Brasil)", - "my" => "Birmanês", - "de" => "Alemão", - ] -]; \ No newline at end of file + 'title' => [ + 'home' => 'Traduções', + 'list' => 'Traduções', + 'create' => 'Criar Tradução', + 'edit' => 'Editar Tradução', + ], + 'label' => 'Traduções', + 'single' => 'Tradução', + 'group' => 'Configurações', + 'language' => 'Idioma', + 'gpt_scan' => 'Usar GPT', + 'gpt_scan_notification_start' => 'A verificação GPT foi iniciada', + 'gpt_scan_notifications_done' => 'A verificação GPT foi concluída', + 'google_scan' => 'Usar Google Tradutor', + 'google_scan_notifications_start' => 'A verificação do Google Tradutor foi iniciada', + 'google_scan_notifications_done' => 'A verificação do Google Tradutor foi concluída', + 'clear_notifications' => 'As traduções foram limpas', + 'clear' => 'Limpar todas as traduções', + 'key' => 'Chave', + 'text' => 'Texto', + 'scan' => 'Verificar novos idiomas', + 'namespace' => 'Namespace', + 'notification' => 'Idioma alterado com sucesso', + 'loaded' => 'Lista de traduções foi atualizada', + 'uploaded' => 'Traduções foram carregadas com sucesso', + 'import' => 'Importar', + 'export' => 'Exportar', + 'import-file' => 'Selecione o arquivo exportado após traduzi-lo', + 'menu' => 'Alterar Idioma', + 'modal' => [ + 'heading' => 'Atualizar idioma atual', + 'button' => 'Salvar, idioma', + 'setting' => 'Configurações', + 'select' => 'Idioma', + ], + 'lang' => [ + 'ar' => 'Árabe', + 'en' => 'Inglês', + 'pt_BR' => 'Português (Brasil)', + 'my' => 'Birmanês', + 'de' => 'Alemão', + ], +]; diff --git a/resources/views/language-switcher.blade.php b/resources/views/language-switcher.blade.php deleted file mode 100644 index cc22925..0000000 --- a/resources/views/language-switcher.blade.php +++ /dev/null @@ -1,73 +0,0 @@ -@php -if(!function_exists('try_svg')) { - function try_svg($name, $classes) { - try { - return svg($name, $classes); - } - catch(\Exception $e) { - return '❓'; - } - } -} -@endphp - -
- - - - -
diff --git a/routes/web.php b/routes/web.php deleted file mode 100644 index a0378e6..0000000 --- a/routes/web.php +++ /dev/null @@ -1,43 +0,0 @@ -validate([ - 'lang' => 'required|string', - 'model' => 'required|string', - 'model_id'=> 'required|integer' - ]); - - $user = $request->get('model')::find($request->get('model_id')); - - $user->lang = $request->get('lang'); - $user->save(); - - Notification::make() - ->title(trans('filament-translations::translation.notification')) - ->icon('heroicon-o-check-circle') - ->iconColor('success') - ->send(); - - if(config('filament-translations.redirect') === 'next'){ - return back(); - } - - return redirect()->to(config('filament-translations.redirect')); - -})->middleware(config('filament-translations.language_switcher_middlewares'))->name('filament-translations.switcher'); diff --git a/src/Console/FilamentTranslationsInstall.php b/src/Console/FilamentTranslationsInstall.php new file mode 100644 index 0000000..743fa45 --- /dev/null +++ b/src/Console/FilamentTranslationsInstall.php @@ -0,0 +1,47 @@ +info('Publish Vendor Assets'); + $this->artisanCommand(['migrate']); + $this->artisanCommand(['optimize:clear']); + $this->artisanCommand(['optimize']); + sleep(3); + $this->info('Scanning for translations'); + $this->artisanCommand(['filament-translations:import']); + $this->info('Filament Translations Manager installed successfully.'); + } +} diff --git a/src/Console/ImportCommand.php b/src/Console/ImportCommand.php index 50c94ed..f8e5cda 100644 --- a/src/Console/ImportCommand.php +++ b/src/Console/ImportCommand.php @@ -3,9 +3,8 @@ namespace TomatoPHP\FilamentTranslations\Console; use Illuminate\Console\Command; -use TomatoPHP\FilamentTranslations\Services\Manager; use TomatoPHP\FilamentTranslations\Services\SaveScan; -use function Laravel\Prompts\progress; + use function Laravel\Prompts\spin; class ImportCommand extends Command @@ -24,7 +23,6 @@ class ImportCommand extends Command */ protected $description = 'Import translations from the language files'; - /** * Execute the console command. */ @@ -32,21 +30,22 @@ public function handle() { if (config('filament-translations.path_to_custom_import_command')) { $response = spin( - function (){ + function () { $command = config('filament-translations.path_to_custom_import_command'); - $command = new $command(); + $command = new $command; $command->handle(); }, 'Fetching keys...' ); $this->info('Done importing'); + return; } $response = spin( - function (){ - $scan = new SaveScan(); + function () { + $scan = new SaveScan; $scan->save(); }, 'Fetching keys...' @@ -54,5 +53,4 @@ function (){ $this->info('Done importing'); } - } diff --git a/src/Console/ScanPath.php b/src/Console/ScanPath.php index 3abb6a0..38a795d 100644 --- a/src/Console/ScanPath.php +++ b/src/Console/ScanPath.php @@ -4,9 +4,9 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\File; -use TomatoPHP\ConsoleHelpers\Traits\HandleFiles; use TomatoPHP\ConsoleHelpers\Traits\RunCommand; use TomatoPHP\FilamentTranslations\Services\Scan; + use function Laravel\Prompts\error; use function Laravel\Prompts\info; use function Laravel\Prompts\text; @@ -38,12 +38,12 @@ public function handle() { $path = $this->argument('path'); - if(!$path){ + if (! $path) { text('Please enter path to scan', required: true); } $checkIfPathExists = File::exists($path); - while (!$checkIfPathExists){ + while (! $checkIfPathExists) { error('Path does not exist'); $path = text('Please enter path to scan', required: true); $checkIfPathExists = File::exists($path); @@ -54,39 +54,38 @@ public function handle() $scanner = app(Scan::class); $scanner->addScannedPath($path); - list($trans, $__) = $scanner->getAllViewFilesWithTranslations(); + [$trans, $__] = $scanner->getAllViewFilesWithTranslations(); //TODO: save translations to array file -// $trans->each(function ($trans) { -// list($group, $key) = explode('.', $trans, 2); -// $namespaceAndGroup = explode('::', $group, 2); -// if (count($namespaceAndGroup) === 1) { -// $namespace = '*'; -// $group = $namespaceAndGroup[0]; -// } else { -// list($namespace, $group) = $namespaceAndGroup; -// } -// $this->createOrUpdate($namespace, $group, $key); -// }); + // $trans->each(function ($trans) { + // list($group, $key) = explode('.', $trans, 2); + // $namespaceAndGroup = explode('::', $group, 2); + // if (count($namespaceAndGroup) === 1) { + // $namespace = '*'; + // $group = $namespaceAndGroup[0]; + // } else { + // list($namespace, $group) = $namespaceAndGroup; + // } + // $this->createOrUpdate($namespace, $group, $key); + // }); /** @var Collection $__ */ - $collectKeys = collect([]); $__->each(function ($default) use ($collectKeys) { - if(((!str_contains($default, '{{')) && (!str_contains($default, '}}')) && (!str_contains($default, '::')) && (!str_contains($default, '.$')))){ + if (((! str_contains($default, '{{')) && (! str_contains($default, '}}')) && (! str_contains($default, '::')) && (! str_contains($default, '.$')))) { $collectKeys->put($default, $default); } }); - $checkIfPathHasLang = File::exists($path.'/resources/lang'); - if(!$checkIfPathHasLang){ - File::makeDirectory($path.'/resources/lang'); + $checkIfPathHasLang = File::exists($path . '/resources/lang'); + if (! $checkIfPathHasLang) { + File::makeDirectory($path . '/resources/lang'); } $jsonFileContent = json_encode($collectKeys->toArray(), JSON_PRETTY_PRINT); - File::put($path.'/resources/lang/en.json', $jsonFileContent); + File::put($path . '/resources/lang/en.json', $jsonFileContent); - info('Translations saved to: ' . $path.'/resources/lang/en.json'); + info('Translations saved to: ' . $path . '/resources/lang/en.json'); } } diff --git a/src/Exports/CustomTranslationExport.php b/src/Exports/CustomTranslationExport.php index ead20e9..8f80b38 100644 --- a/src/Exports/CustomTranslationExport.php +++ b/src/Exports/CustomTranslationExport.php @@ -5,10 +5,10 @@ use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; -use Spatie\TranslationLoader\LanguageLine; use Maatwebsite\Excel\Concerns\WithMapping; +use Spatie\TranslationLoader\LanguageLine; -class CustomTranslationExport implements FromCollection, WithMapping, WithHeadings +class CustomTranslationExport implements FromCollection, WithHeadings, WithMapping { public function collection(): Collection { @@ -24,7 +24,7 @@ public function map($row): array ]; $locales = config('filament-translations.locals'); - foreach ($locales as $key=>$value){ + foreach ($locales as $key => $value) { $exportArray[] = $row->text[$key] ?? null; } @@ -34,13 +34,13 @@ public function map($row): array public function headings(): array { $headers = [ - "id", - "group", - "key", + 'id', + 'group', + 'key', ]; $locales = config('filament-translations.locals'); - foreach ($locales as $key => $value){ + foreach ($locales as $key => $value) { $headers[] = $key; } diff --git a/src/Exports/TranslationsExport.php b/src/Exports/TranslationsExport.php index 07bf380..4028bb2 100644 --- a/src/Exports/TranslationsExport.php +++ b/src/Exports/TranslationsExport.php @@ -4,14 +4,14 @@ use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; -use Spatie\TranslationLoader\LanguageLine; use Maatwebsite\Excel\Concerns\WithMapping; +use Spatie\TranslationLoader\LanguageLine; -class TranslationsExport implements FromCollection, WithMapping, WithHeadings +class TranslationsExport implements FromCollection, WithHeadings, WithMapping { /** - * @return \Illuminate\Support\Collection - */ + * @return \Illuminate\Support\Collection + */ public function collection() { return LanguageLine::all(); @@ -25,7 +25,7 @@ public function map($line): array ]; $locales = config('filament-translations.locals'); - foreach ($locales as $key=>$value){ + foreach ($locales as $key => $value) { $exportArray[] = $line->text[$key] ?? null; } @@ -35,13 +35,13 @@ public function map($line): array public function headings(): array { $headers = [ - "id", - "key", + 'id', + 'key', ]; $locales = config('filament-translations.locals'); - foreach ($locales as $key=>$value){ - $headers[] = $value["label"]; + foreach ($locales as $key => $value) { + $headers[] = $value['label']; } return $headers; diff --git a/src/Filament/Resources/TranslationResource.php b/src/Filament/Resources/TranslationResource.php new file mode 100644 index 0000000..1b9bd84 --- /dev/null +++ b/src/Filament/Resources/TranslationResource.php @@ -0,0 +1,78 @@ + \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ManageTranslations::route('/'), + ]; + } else { + return [ + 'index' => \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::route('/'), + 'create' => \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\CreateTranslation::route('/create'), + 'edit' => \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\EditTranslation::route('/{record}/edit'), + 'view' => \TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ViewTranslations::route('/{record}'), + ]; + } + } +} diff --git a/src/Http/Middleware/.gitkeep b/src/Filament/Resources/TranslationResource/Actions/Components/.gitkeep similarity index 100% rename from src/Http/Middleware/.gitkeep rename to src/Filament/Resources/TranslationResource/Actions/Components/.gitkeep diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/Action.php b/src/Filament/Resources/TranslationResource/Actions/Components/Action.php new file mode 100644 index 0000000..0e6c492 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Actions/Components/Action.php @@ -0,0 +1,10 @@ +requiresConfirmation() + ->icon('heroicon-o-trash') + ->action(function () { + Translation::query()->truncate(); + + Notification::make() + ->title(trans('filament-translations::translation.clear_notifications')) + ->success() + ->send(); + }) + ->color('danger') + ->label(trans('filament-translations::translation.clear')); + } +} diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php new file mode 100644 index 0000000..345839f --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php @@ -0,0 +1,14 @@ +requiresConfirmation() + ->icon('heroicon-m-magnifying-glass') + ->action(function (){ + if (config('filament-translations.use_queue_on_scan')) { + dispatch(new ScanJob); + } elseif (config('filament-translations.path_to_custom_import_command')) { + spin( + function () { + $command = config('filament-translations.path_to_custom_import_command'); + $command = new $command; + $command->handle(); + }, + 'Fetching keys...' + ); + } else { + $scan = new SaveScan; + $scan->save(); + } + + Notification::make() + ->title(trans('filament-translations::translation.loaded')) + ->success() + ->send(); + }) + ->label(trans('filament-translations::translation.scan')); + } +} diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php new file mode 100644 index 0000000..32d80df --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php @@ -0,0 +1,14 @@ +getActions(); + } + + public function getActions(): array + { + return collect($this->getDefaultActions())->merge(static::$actions)->map(function (StaticAction $action){ + if(method_exists($action, 'record') && str($action->getName())->contains(['create', 'edit', 'view'])){ + $action->record(method_exists(static::$page, 'getRecord') ? static::$page->getRecord() : null) + ->model(method_exists(static::$page, 'getModel') ? static::$page->getModel() : null) + ->modelLabel(method_exists(static::$page, 'getModelLabel') ? get_model_label(static::$page->getModel()) : null) + ->form(fn(Form $form) => app(static::$page->getResource())::form($form)) + ->url(fn() => isset(app(static::$page->getResource())::getPages()[$action->getName()]) ? app(app(static::$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) { + static::$actions[] = $item; + } + } + } + else if($component instanceof \Closure){ + static::$actions[] = (new static)->evaluate($component); + } + else { + static::$actions[] = $component; + } + } +} diff --git a/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php b/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php new file mode 100644 index 0000000..aa6ebb1 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php @@ -0,0 +1,16 @@ +label(trans('filament-translations::translation.group')) + ->required() + ->disabled(fn (Forms\Get $get) => $get('id') !== null) + ->maxLength(255); + } +} diff --git a/src/Filament/Resources/TranslationResource/Form/Components/Key.php b/src/Filament/Resources/TranslationResource/Form/Components/Key.php new file mode 100644 index 0000000..67aff79 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Form/Components/Key.php @@ -0,0 +1,17 @@ +label(trans('filament-translations::translation.key')) + ->disabled(fn (Forms\Get $get) => $get('id') !== null) + ->required() + ->maxLength(255); + } +} diff --git a/src/Filament/Resources/TranslationResource/Form/Components/Text.php b/src/Filament/Resources/TranslationResource/Form/Components/Text.php new file mode 100644 index 0000000..a1a310a --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Form/Components/Text.php @@ -0,0 +1,16 @@ +label(trans('filament-translations::translation.text')) + ->nullable() + ->columnSpanFull(); + } +} diff --git a/src/Filament/Resources/TranslationResource/Form/TranslationForm.php b/src/Filament/Resources/TranslationResource/Form/TranslationForm.php new file mode 100644 index 0000000..d04fbbe --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Form/TranslationForm.php @@ -0,0 +1,44 @@ +schema(self::getSchema()); + } + + public static function getDefaultComponents(): array + { + return [ + Components\Group::make(), + Components\Key::make(), + Components\Text::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/tests/Unit/.gitkeep b/src/Filament/Resources/TranslationResource/InfoList/Entries/.gitkeep similarity index 100% rename from tests/Unit/.gitkeep rename to src/Filament/Resources/TranslationResource/InfoList/Entries/.gitkeep diff --git a/src/Filament/Resources/TranslationResource/InfoList/Entries/Entry.php b/src/Filament/Resources/TranslationResource/InfoList/Entries/Entry.php new file mode 100644 index 0000000..772b63b --- /dev/null +++ b/src/Filament/Resources/TranslationResource/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/TranslationResource/Pages/CreateTranslation.php b/src/Filament/Resources/TranslationResource/Pages/CreateTranslation.php new file mode 100644 index 0000000..e730f18 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Pages/CreateTranslation.php @@ -0,0 +1,21 @@ + $item) { +// $options[$key] = $item['label']; +// } +// +// return [ +// Action::make('scan') +// ->icon('heroicon-m-magnifying-glass') +// ->action('scan') +// ->label(trans('filament-translations::translation.scan')), +// ]; +// } +// +// public function scan(): void +// { +// if (config('filament-translations.use_queue_on_scan')) { +// $this->dispatchScanJob(); +// } elseif (config('filament-translations.path_to_custom_import_command')) { +// $this->runCustomImportCommand(); +// } else { +// $this->saveScan(); +// } +// +// $this->notify('success', 'Translation Has Been Loaded'); +// } +// +// protected function dispatchScanJob(): void +// { +// dispatch(new ScanJob); +// } +// +// protected function runCustomImportCommand(): void +// { +// spin( +// function () { +// $command = config('filament-translations.path_to_custom_import_command'); +// $command = new $command; +// $command->handle(); +// }, +// 'Fetching keys...' +// ); +// } +// +// protected function saveScan(): void +// { +// $scan = new SaveScan; +// $scan->save(); +// } +} diff --git a/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php b/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php new file mode 100644 index 0000000..2ce5cb1 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php @@ -0,0 +1,164 @@ +requiresConfirmation() +// ->icon('heroicon-m-magnifying-glass') +// ->action('scan') +// ->label(trans('filament-translations::translation.scan')); +// } +// +// if (filament('filament-translations')->allowGPTScan && class_exists(OpenAI::class)) { +// $actions[] = Action::make('gpt') +// ->requiresConfirmation() +// ->icon('heroicon-o-link') +// ->form([ +// Select::make('language') +// ->searchable() +// ->options(collect(config('filament-translations.locals'))->pluck('label', 'label')->toArray()) +// ->label(trans('filament-translations::translation.gpt_scan_language')) +// ->required(), +// ]) +// ->action(function (array $data) { +// dispatch(new ScanWithGPT($data['language'], auth()->user()->id, get_class(auth()->user()))); +// +// Notification::make() +// ->title(trans('filament-translations::translation.gpt_scan_notification_start')) +// ->success() +// ->send(); +// }) +// ->color('warning') +// ->label(trans('filament-translations::translation.gpt_scan')); +// } +// +// if (filament('filament-translations')->allowGoogleTranslateScan && class_exists(GoogleTranslate::class)) { +// $actions[] = Action::make('google') +// ->requiresConfirmation() +// ->icon('heroicon-o-language') +// ->form([ +// Select::make('language') +// ->searchable() +// ->options( +// collect(config('filament-translations.locals'))->mapWithKeys(function ($item, $key) { +// return [$key => $item['label']]; +// })->toArray() +// ) +// ->label(trans('filament-translations::translation.gpt_scan_language')) +// ->required(), +// ]) +// ->action(function (array $data) { +// dispatch( +// new ScanWithGoogleTranslate(auth()->user(), $data['language']) +// ); +// +// Notification::make() +// ->title(trans('filament-translations::translation.google_scan_notifications_start')) +// ->success() +// ->send(); +// }) +// ->color('warning') +// ->label(trans('filament-translations::translation.google_scan')); +// } +// +// if (filament('filament-translations')->allowClearTranslations) { +// $actions[] = Action::make('clear') +// ->requiresConfirmation() +// ->icon('heroicon-o-trash') +// ->action(function () { +// Translation::query()->truncate(); +// +// Notification::make() +// ->title(trans('filament-translations::translation.clear_notifications')) +// ->success() +// ->send(); +// }) +// ->color('danger') +// ->label(trans('filament-translations::translation.clear')); +// } +// +// if (filament('filament-translations')->allowCreate) { +// $actions[] = CreateAction::make(); +// } +// +// return $actions; +// } +// +// public function scan(): void +// { +// if (config('filament-translations.use_queue_on_scan')) { +// $this->dispatchScanJob(); +// } elseif (config('filament-translations.path_to_custom_import_command')) { +// $this->runCustomImportCommand(); +// } else { +// $this->saveScan(); +// } +// +// $this->sendNotification(); +// } +// +// protected function dispatchScanJob(): void +// { +// dispatch(new ScanJob); +// } +// +// protected function runCustomImportCommand(): void +// { +// spin( +// function () { +// $command = config('filament-translations.path_to_custom_import_command'); +// $command = new $command; +// $command->handle(); +// }, +// 'Fetching keys...' +// ); +// } +// +// protected function saveScan(): void +// { +// $scan = new SaveScan; +// $scan->save(); +// } +// +// protected function sendNotification(): void +// { +// Notification::make() +// ->title(trans('filament-translations::translation.loaded')) +// ->success() +// ->send(); +// } +} diff --git a/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php b/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php new file mode 100644 index 0000000..62c73b3 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php @@ -0,0 +1,18 @@ +iconButton() + ->tooltip(__('filament-actions::delete.single.label')); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/Actions/EditAction.php b/src/Filament/Resources/TranslationResource/Table/Actions/EditAction.php new file mode 100644 index 0000000..70a59ee --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Actions/EditAction.php @@ -0,0 +1,15 @@ +iconButton() + ->tooltip(__('filament-actions::edit.single.label')); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/Actions/ViewAction.php b/src/Filament/Resources/TranslationResource/Table/Actions/ViewAction.php new file mode 100644 index 0000000..4dfb5e5 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Actions/ViewAction.php @@ -0,0 +1,15 @@ +iconButton() + ->tooltip(__('filament-actions::view.single.label')); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/BulkActions/.gitkeep b/src/Filament/Resources/TranslationResource/Table/BulkActions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TranslationResource/Table/BulkActions/Action.php b/src/Filament/Resources/TranslationResource/Table/BulkActions/Action.php new file mode 100644 index 0000000..ca7ceae --- /dev/null +++ b/src/Filament/Resources/TranslationResource/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/TranslationResource/Table/Columns/Key.php b/src/Filament/Resources/TranslationResource/Table/Columns/Key.php new file mode 100644 index 0000000..99b5347 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Columns/Key.php @@ -0,0 +1,16 @@ +label(trans('filament-translations::translation.key')) + ->searchable() + ->sortable(); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/Columns/Text.php b/src/Filament/Resources/TranslationResource/Table/Columns/Text.php new file mode 100644 index 0000000..1d76917 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Columns/Text.php @@ -0,0 +1,16 @@ +label(trans('filament-translations::translation.text')) + ->view('filament-translations::text-column') + ->searchable(); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/Columns/UpdatedAt.php b/src/Filament/Resources/TranslationResource/Table/Columns/UpdatedAt.php new file mode 100644 index 0000000..db998ec --- /dev/null +++ b/src/Filament/Resources/TranslationResource/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/TranslationResource/Table/Filters/.gitkeep b/src/Filament/Resources/TranslationResource/Table/Filters/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TranslationResource/Table/Filters/Filter.php b/src/Filament/Resources/TranslationResource/Table/Filters/Filter.php new file mode 100644 index 0000000..3c1a642 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Filters/Filter.php @@ -0,0 +1,8 @@ +label(trans('filament-translations::global.filter_by_group')) + ->options(fn (): array => LanguageLine::query()->groupBy('group')->pluck('group', 'group')->all()); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/Filters/Text.php b/src/Filament/Resources/TranslationResource/Table/Filters/Text.php new file mode 100644 index 0000000..a849755 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/Filters/Text.php @@ -0,0 +1,17 @@ +label(trans('filament-translations::global.filter_by_null_text')) + ->query(fn (Builder $query): Builder => $query->whereJsonContains('text', [])); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/HeaderActions/.gitkeep b/src/Filament/Resources/TranslationResource/Table/HeaderActions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Filament/Resources/TranslationResource/Table/HeaderActions/Action.php b/src/Filament/Resources/TranslationResource/Table/HeaderActions/Action.php new file mode 100644 index 0000000..eed2947 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/HeaderActions/Action.php @@ -0,0 +1,8 @@ +label(trans('filament-translations::translation.export')) + ->icon('heroicon-o-document-arrow-down') + ->color('danger') + ->action(fn () => ExcelImportExportService::export()); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php new file mode 100644 index 0000000..a7d6019 --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php @@ -0,0 +1,37 @@ +label(trans('filament-translations::translation.import')) + ->form([ + FileUpload::make('file') + ->label(trans('filament-translations::translation.import-file')) + ->acceptedFileTypes([ + 'application/csv', + 'application/vnd.ms-excel', + 'application/vnd.msexcel', + 'text/csv', + 'text/anytext', + 'text/plain', + 'text/x-c', + 'text/comma-separated-values', + 'inode/x-empty', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ]) + ->storeFiles(false), + ]) + ->icon('heroicon-o-document-arrow-up') + ->color('success') + ->action(fn (array $data) => ExcelImportExportService::import($data['file'])); + } +} diff --git a/src/Filament/Resources/TranslationResource/Table/TranslationActions.php b/src/Filament/Resources/TranslationResource/Table/TranslationActions.php new file mode 100644 index 0000000..64374cd --- /dev/null +++ b/src/Filament/Resources/TranslationResource/Table/TranslationActions.php @@ -0,0 +1,43 @@ +deferLoading() + ->bulkActions(TranslationBulkActions::make()) + ->actions(TranslationActions::make()) + ->filters(TranslationFilters::make()) + ->headerActions(TranslationHeaderActions::make()) + ->deferLoading() + ->defaultSort('key') + ->columns(self::getColumns()); + } + + public static function getDefaultColumns(): array + { + return [ + Columns\Key::make(), + Columns\Text::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/FilamentTranslationsPlugin.php b/src/FilamentTranslationsPlugin.php index 05d3930..c365d67 100644 --- a/src/FilamentTranslationsPlugin.php +++ b/src/FilamentTranslationsPlugin.php @@ -3,21 +3,23 @@ namespace TomatoPHP\FilamentTranslations; use Filament\Contracts\Plugin; +use Filament\Pages\Page; use Filament\Panel; -use Illuminate\View\View; -use Kenepa\TranslationManager\Http\Middleware\SetLanguage; -use Nwidart\Modules\Module; -use TomatoPHP\FilamentTranslations\Http\Middleware\LanguageMiddleware; - +use Filament\Tables\Actions\ReplicateAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\ClearAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\CreateAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\ScanAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\ManagePageActions; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\ExportAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\ImportAction; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationActions; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationHeaderActions; class FilamentTranslationsPlugin implements Plugin { - public bool $allowGPTScan = false; - public bool $allowGoogleTranslateScan = false; public bool $allowClearTranslations = false; - public bool $allowCreate = false; - private bool $isActive = false; + public bool $allowCreate = false; public function getId(): string { @@ -26,52 +28,50 @@ public function getId(): string public function register(Panel $panel): void { - if(class_exists(Module::class) && \Nwidart\Modules\Facades\Module::find('FilamentTranslations')?->isEnabled()){ - $this->isActive = true; - } - else { - $this->isActive = true; - } - - if($this->isActive) { - $panel - ->resources([ - config('filament-translations.translation_resource'), - ]); - } - } - - public function allowGPTScan(bool $allowGPTScan=true): self - { - $this->allowGPTScan = $allowGPTScan; - return $this; - } - - public function allowGoogleTranslateScan(bool $allowGoogleTranslateScan=true): self - { - $this->allowGoogleTranslateScan = $allowGoogleTranslateScan; - return $this; + $panel->resources([ + config('filament-translations.translation_resource'), + ]); } - public function allowClearTranslations(bool $allowClearTranslations=true): self + public function allowClearTranslations(bool $allowClearTranslations = true): self { $this->allowClearTranslations = $allowClearTranslations; + return $this; } - public function allowCreate(bool $allowCreate=true): self + public function allowCreate(bool $allowCreate = true): self { $this->allowCreate = $allowCreate; + return $this; } public function boot(Panel $panel): void { - // + if (config('filament-translations.import_enabled')) { + TranslationHeaderActions::register(ImportAction::make()); + } + + if (config('filament-translations.export_enabled')) { + TranslationHeaderActions::register(ExportAction::make()); + } + + if(config('filament-translations.scan_enabled')){ + ManagePageActions::register(ScanAction::make()); + } + + if(filament('filament-translations')->allowClearTranslations){ + ManagePageActions::register(ClearAction::make()); + } + + if(filament('filament-translations')->allowCreate){ + ManagePageActions::register(CreateAction::make()); + } } - public static function make(): static + public static function make(): FilamentTranslationsPlugin { - return new static(); + return new FilamentTranslationsPlugin; } } diff --git a/src/FilamentTranslationsServiceProvider.php b/src/FilamentTranslationsServiceProvider.php index 29797d0..389191c 100644 --- a/src/FilamentTranslationsServiceProvider.php +++ b/src/FilamentTranslationsServiceProvider.php @@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; -use Filament\Facades\Filament; +use TomatoPHP\FilamentTranslations\Console\FilamentTranslationsInstall; use TomatoPHP\FilamentTranslations\Console\ImportCommand; use TomatoPHP\FilamentTranslations\Console\ScanPath; @@ -13,48 +13,49 @@ class FilamentTranslationsServiceProvider extends ServiceProvider public function register(): void { //Register ConfigTomatoPHP file - $this->mergeConfigFrom(__DIR__.'/../config/filament-translations.php', 'filament-translations'); + $this->mergeConfigFrom(__DIR__ . '/../config/filament-translations.php', 'filament-translations'); //Publish Config $this->publishes([ - __DIR__.'/../config/filament-translations.php' => config_path('filament-translations.php'), + __DIR__ . '/../config/filament-translations.php' => config_path('filament-translations.php'), ], 'filament-translations-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-translations-migrations'); //Register views - $this->loadViewsFrom(__DIR__.'/../resources/views', 'filament-translations'); + $this->loadViewsFrom(__DIR__ . '/../resources/views', 'filament-translations'); //Publish Views $this->publishes([ - __DIR__.'/../resources/views' => resource_path('views/vendor/filament-translations'), + __DIR__ . '/../resources/views' => resource_path('views/vendor/filament-translations'), ], 'filament-translations-views'); //Register Langs - $this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'filament-translations'); + $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'filament-translations'); //Publish Lang $this->publishes([ - __DIR__.'/../resources/lang' => base_path('lang/vendor/filament-translations'), + __DIR__ . '/../resources/lang' => base_path('lang/vendor/filament-translations'), ], 'filament-translations-lang'); //Register Routes - $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); + // $this->loadRoutesFrom(__DIR__ . '/../routes/web.php'); $this->commands([ - ImportCommand::class, - ScanPath::class + FilamentTranslationsInstall::class, + ImportCommand::class, + ScanPath::class, ]); } public function boot(): void { - Config::set('filament-translation-component.languages', Config::get('filament-translations.locals')); + Config::set('filament-translation-component.languages', Config::get('filament-translations.locals')); } } diff --git a/src/FilamentTranslationsSwitcherPlugin.php b/src/FilamentTranslationsSwitcherPlugin.php deleted file mode 100644 index cc965fb..0000000 --- a/src/FilamentTranslationsSwitcherPlugin.php +++ /dev/null @@ -1,76 +0,0 @@ -isEnabled()){ - $this->isActive = true; - } - else { - $this->isActive = true; - } - - if($this->isActive) { - - $panel->renderHook( - config('filament-translations.language_switcher_render_hook'), - fn(): View => $this->getLanguageSwitcherView() - ); - - $panel->authMiddleware([ - LanguageMiddleware::class, - ]); - } - } - - public function boot(Panel $panel): void - { - // - } - - public static function make(): static - { - return new static(); - } - - - /** - * Returns a View object that renders the language switcher component. - * - * @return \Illuminate\Contracts\View\View The View object that renders the language switcher component. - */ - private function getLanguageSwitcherView(): View - { - $locales = config('filament-translations.locals'); - $currentLocale = app()->getLocale(); - $currentLanguage = collect($locales)->firstWhere('code', $currentLocale); - $otherLanguages = $locales; - $showFlags = config('filament-translations.show_flags'); - - return view('filament-translations::language-switcher', compact( - 'otherLanguages', - 'currentLanguage', - 'showFlags', - )); - } -} diff --git a/src/Http/Middleware/LanguageMiddleware.php b/src/Http/Middleware/LanguageMiddleware.php deleted file mode 100644 index 2a86d2f..0000000 --- a/src/Http/Middleware/LanguageMiddleware.php +++ /dev/null @@ -1,32 +0,0 @@ -user()) { - if (!empty($request->user()->lang)) { - app()->setLocale($request->user()->lang); - } else { - app()->setLocale('en'); - } - } - return $next($request); - } -} diff --git a/src/Imports/CustomTranslationImport.php b/src/Imports/CustomTranslationImport.php index fa019dc..8add552 100644 --- a/src/Imports/CustomTranslationImport.php +++ b/src/Imports/CustomTranslationImport.php @@ -9,7 +9,7 @@ use Maatwebsite\Excel\Validators\Failure; use Spatie\TranslationLoader\LanguageLine; -class CustomTranslationImport implements ToCollection, WithHeadingRow, SkipsOnFailure +class CustomTranslationImport implements SkipsOnFailure, ToCollection, WithHeadingRow { public function collection(Collection $collection): void { @@ -28,7 +28,7 @@ public function collection(Collection $collection): void } /** - * @param Failure[] $failures + * @param Failure[] $failures */ public function onFailure(Failure ...$failures) { diff --git a/src/Imports/TranslationsImport.php b/src/Imports/TranslationsImport.php index 4f6b9bd..4bd02da 100644 --- a/src/Imports/TranslationsImport.php +++ b/src/Imports/TranslationsImport.php @@ -2,30 +2,26 @@ namespace TomatoPHP\FilamentTranslations\Imports; -use Illuminate\Support\Facades\File; -use Maatwebsite\Excel\Concerns\ToCollection; -use Modules\TomatoTranslations\App\Models\Translation; use Illuminate\Support\Collection; +use Maatwebsite\Excel\Concerns\ToCollection; use Spatie\TranslationLoader\LanguageLine; - class TranslationsImport implements ToCollection { - public function collection(Collection $rows) { unset($rows[0]); $getLocals = config('filament-translations.locals'); - foreach ($rows as $key=>$row) { + foreach ($rows as $key => $row) { $langs = config('filament-translations.locals'); $id = $row[0]; $getTranslation = LanguageLine::find($id); $mergeTranslation = []; - $count =1; - foreach ($langs as $langKey=>$lang){ - if(isset($row[$count+1]) && !empty($row[$count+1])){ - $mergeTranslation[$langKey] = $row[$count+1]; + $count = 1; + foreach ($langs as $langKey => $lang) { + if (isset($row[$count + 1]) && ! empty($row[$count + 1])) { + $mergeTranslation[$langKey] = $row[$count + 1]; } $count++; } diff --git a/src/Jobs/ScanJob.php b/src/Jobs/ScanJob.php index eeeb2fb..fbf0b29 100644 --- a/src/Jobs/ScanJob.php +++ b/src/Jobs/ScanJob.php @@ -12,7 +12,10 @@ class ScanJob implements ShouldQueue { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + use Dispatchable; + use InteractsWithQueue; + use Queueable; + use SerializesModels; /** * Execute the job. @@ -21,12 +24,13 @@ public function handle(): void { if (config('filament-translations.path_to_custom_import_command')) { $command = config('filament-translations.path_to_custom_import_command'); - $command = new $command(); + $command = new $command; $command->handle(); + return; } - $saveScan = new SaveScan(); + $saveScan = new SaveScan; $saveScan->save(); } } diff --git a/src/Jobs/ScanWithGPT.php b/src/Jobs/ScanWithGPT.php deleted file mode 100644 index fb0e110..0000000 --- a/src/Jobs/ScanWithGPT.php +++ /dev/null @@ -1,91 +0,0 @@ -userType::find($this->userId); - $getAllTranslations = Translation::all(); - $chunks = array_chunk($getAllTranslations->toArray(), 50); - - foreach ($chunks as $chunk) { - $makeJsonArray = []; - foreach ($chunk as $translation) { - $makeJsonArray[$translation['key']] = $translation['text']['en'] ?? $translation['key']; - } - - $json = json_encode($makeJsonArray); - $result = OpenAI::chat()->create([ - "model" => "gpt-3.5-turbo", - "messages" => [ - [ - "role" => "system", - "content" => "You are a translator. Your job is to translate the following json object to the language specified in the prompt." - ], - [ - "role" => "user", - "content" => "Translate the following json object from English to " . $this->language . ", ensuring you return only the translated content without added quotes or any other extraneous details. Importantly, any word prefixed with the symbol ':' should remain unchanged" - ], - [ - "role" => "user", - "content" => $json - ] - ], - "temperature" => 0.4, - "n" => 1, - ]); - - if ($result->choices && count($result->choices) > 0 && $result->choices[0]->message) { - $translationArray = json_decode($result->choices[0]->message->content) ?? []; - } - - - $getLocal = config('filament-translations.locals'); - $local = "en"; - foreach ($getLocal as $key => $item) { - if ($item['label'] == $this->language) { - $local = $key; - } - } - - for ($i = 0; $i < count($chunk); $i++) { - $translationModel = Translation::where('key', $chunk[$i]['key'])->first(); - if ($translationModel) { - $text = $translationModel->text; - $text[$local] = $translationArray->{$chunk[$i]['key']} ?? $chunk[$i]['key']; - - $translationModel->text = $text; - $translationModel->save(); - } - } - - Notification::make() - ->title(trans('filament-translations::translation.gpt_scan_notifications_done')) - ->success() - ->sendToDatabase($user); - } - } -} \ No newline at end of file diff --git a/src/Jobs/ScanWithGoogleTranslate.php b/src/Jobs/ScanWithGoogleTranslate.php deleted file mode 100644 index 8ef788d..0000000 --- a/src/Jobs/ScanWithGoogleTranslate.php +++ /dev/null @@ -1,47 +0,0 @@ -language); - - Translation::chunk(200, function (Collection $translations) use ($translator) { - foreach ($translations as $translation) { - $textToTranslate = $translation->text['en'] ?? $translation['key']; - $translation->setTranslation($this->language, $translator->translate($textToTranslate)); - $translation->save(); - } - }); - - Notification::make() - ->title(trans('filament-translations::translation.google_scan_notifications_done')) - ->success() - ->sendToDatabase($this->user); - } -} diff --git a/src/Models/Translation.php b/src/Models/Translation.php index e990ce7..873b921 100644 --- a/src/Models/Translation.php +++ b/src/Models/Translation.php @@ -2,10 +2,9 @@ namespace TomatoPHP\FilamentTranslations\Models; -use Illuminate\Support\Facades\Cache; -use Spatie\TranslationLoader\LanguageLine; -use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\SoftDeletes; +use Spatie\TranslationLoader\LanguageLine; class Translation extends LanguageLine { @@ -20,28 +19,28 @@ class Translation extends LanguageLine /** @var array */ protected $casts = ['text' => 'array']; - protected $table = "language_lines"; + protected $table = 'language_lines'; protected $fillable = [ - "group", - "key", - "text", - "namespace" + 'group', + 'key', + 'text', + 'namespace', ]; - public static function getTranslatableLocales(): array { return config('filament-translations.locals'); } - public function getTranslation(string $locale, string $group = null): string + public function getTranslation(string $locale, ?string $group = null): string { - if ($group === '*' && !isset($this->text[$locale])) { + if ($group === '*' && ! isset($this->text[$locale])) { $fallback = config('app.fallback_locale'); return $this->text[$fallback] ?? $this->key; } + return $this->text[$locale] ?? ''; } diff --git a/src/Resources/TranslationResource.php b/src/Resources/TranslationResource.php deleted file mode 100644 index 37184f1..0000000 --- a/src/Resources/TranslationResource.php +++ /dev/null @@ -1,187 +0,0 @@ -schema([ - Forms\Components\TextInput::make('group') - ->label(trans('filament-translations::translation.group')) - ->required() - ->disabled(fn(Forms\Get $get) => $get('id') !== null) - ->maxLength(255), - Forms\Components\TextInput::make('key') - ->label(trans('filament-translations::translation.key')) - ->disabled(fn(Forms\Get $get) => $get('id') !== null) - ->required() - ->maxLength(255), - \TomatoPHP\FilamentTranslationComponent\Components\Translation::make('text') - ->label(trans('filament-translations::translation.text')) - ->columnSpanFull() - - ]); - } - - public static function table(Table $table): Table - { - $actions = []; - if (config('filament-translations.import_enabled')) { - $actions[] = Tables\Actions\Action::make('import') - ->label(trans('filament-translations::translation.import')) - ->form([ - FileUpload::make('file') - ->label(trans('filament-translations::translation.import-file')) - ->acceptedFileTypes([ - "application/csv", - "application/vnd.ms-excel", - "application/vnd.msexcel", - "text/csv", - "text/anytext", - "text/plain", - "text/x-c", - "text/comma-separated-values", - "inode/x-empty", - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" - ]) - ->storeFiles(false) - ]) - ->icon('heroicon-o-document-arrow-up') - ->color('success') - ->action(fn(array $data) => ExcelImportExportService::import($data['file'])); - } - - if (config('filament-translations.export_enabled')) { - $actions[] = Tables\Actions\Action::make('export') - ->label(trans('filament-translations::translation.export')) - ->icon('heroicon-o-document-arrow-down') - ->color('danger') - ->action(fn() => ExcelImportExportService::export()); - } - $table - ->headerActions($actions) - ->columns([ - Tables\Columns\TextColumn::make('key') - ->label(trans('filament-translations::translation.key')) - ->sortable() - ->searchable(), - Tables\Columns\TextColumn::make('text') - ->label(trans('filament-translations::translation.text')) - ->view('filament-translations::text-column') - ->searchable(), - Tables\Columns\TextColumn::make('created_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - Tables\Columns\TextColumn::make('updated_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - ]) - ->filters([ - Tables\Filters\SelectFilter::make('group') - ->label(trans('filament-translations::global.filter_by_group')) - ->options(fn (): array => LanguageLine::query()->groupBy('group')->pluck('group','group')->all()), - Tables\Filters\Filter::make('text') - ->label(trans('filament-translations::global.filter_by_null_text')) - ->query(fn (Builder $query): Builder => $query->whereJsonContains('text', [])) - ]) - ->bulkActions([ - Tables\Actions\BulkActionGroup::make([ - Tables\Actions\DeleteBulkAction::make(), - ]), - ]); - - if (!config('filament-translations.modal')) { - $table->actions([ - ActionGroup::make([ - ViewAction::make(), - EditAction::make(), - DeleteAction::make() - ]), - ]); - } - else { - $table->actions([ - Tables\Actions\EditAction::make(), - Tables\Actions\DeleteAction::make(), - ]); - } - - - return $table; - } - - public static function getPages(): array - { - if (config('filament-translations.modal')) { - return [ - 'index' => Pages\ManageTranslations::route('/'), - ]; - } else { - return [ - 'index' => Pages\ListTranslations::route('/'), - 'create' => Pages\CreateTranslation::route('/create'), - 'edit' => Pages\EditTranslation::route('/{record}/edit'), - ]; - } - } -} diff --git a/src/Resources/TranslationResource/Pages/CreateTranslation.php b/src/Resources/TranslationResource/Pages/CreateTranslation.php deleted file mode 100644 index 96284b6..0000000 --- a/src/Resources/TranslationResource/Pages/CreateTranslation.php +++ /dev/null @@ -1,16 +0,0 @@ -$item){ - $options[$key] = $item['label']; - } - return [ - Action::make('scan') - ->icon('heroicon-m-magnifying-glass') - ->action('scan') - ->label(trans('filament-translations::translation.scan')) - ]; - } - - /** - * @return void - */ - public function scan(): void - { - if (config('filament-translations.use_queue_on_scan')) { - $this->dispatchScanJob(); - } elseif (config('filament-translations.path_to_custom_import_command')) { - $this->runCustomImportCommand(); - } else { - $this->saveScan(); - } - - $this->notify('success', 'Translation Has Been Loaded'); - } - - protected function dispatchScanJob(): void - { - dispatch(new ScanJob()); - } - - protected function runCustomImportCommand(): void - { - spin( - function () { - $command = config('filament-translations.path_to_custom_import_command'); - $command = new $command(); - $command->handle(); - }, - 'Fetching keys...' - ); - } - - protected function saveScan(): void - { - $scan = new SaveScan(); - $scan->save(); - } -} diff --git a/src/Resources/TranslationResource/Pages/ManageTranslations.php b/src/Resources/TranslationResource/Pages/ManageTranslations.php deleted file mode 100644 index 01a3352..0000000 --- a/src/Resources/TranslationResource/Pages/ManageTranslations.php +++ /dev/null @@ -1,165 +0,0 @@ -icon('heroicon-m-magnifying-glass') - ->action('scan') - ->label(trans('filament-translations::translation.scan')); - } - - if(filament('filament-translations')->allowGPTScan && class_exists(OpenAI::class)){ - $actions[] = Action::make('gpt') - ->requiresConfirmation() - ->icon('heroicon-o-link') - ->form([ - Select::make('language') - ->searchable() - ->options(collect(config('filament-translations.locals'))->pluck('label', 'label')->toArray()) - ->label(trans('filament-translations::translation.gpt_scan_language')) - ->required() - ]) - ->action(function (array $data){ - dispatch(new ScanWithGPT($data['language'], auth()->user()->id,get_class(auth()->user()))); - - Notification::make() - ->title(trans('filament-translations::translation.gpt_scan_notification_start')) - ->success() - ->send(); - }) - ->color('warning') - ->label(trans('filament-translations::translation.gpt_scan')); - } - - if (filament('filament-translations')->allowGoogleTranslateScan && class_exists(GoogleTranslate::class)) { - $actions[] = Action::make('google') - ->requiresConfirmation() - ->icon('heroicon-o-language') - ->form([ - Select::make('language') - ->searchable() - ->options( - collect(config('filament-translations.locals'))->mapWithKeys(function ($item, $key) { - return [$key => $item['label']]; - })->toArray() - ) - ->label(trans('filament-translations::translation.gpt_scan_language')) - ->required() - ]) - ->action(function (array $data) { - dispatch( - new ScanWithGoogleTranslate(auth()->user(), $data['language']) - ); - - Notification::make() - ->title(trans('filament-translations::translation.google_scan_notifications_start')) - ->success() - ->send(); - }) - ->color('warning') - ->label(trans('filament-translations::translation.google_scan')); - } - - if(filament('filament-translations')->allowClearTranslations){ - $actions[] = Action::make('clear') - ->requiresConfirmation() - ->icon('heroicon-o-trash') - ->action(function (){ - Translation::query()->truncate(); - - Notification::make() - ->title(trans('filament-translations::translation.clear_notifications')) - ->success() - ->send(); - }) - ->color('danger') - ->label(trans('filament-translations::translation.clear')); - } - - if(filament('filament-translations')->allowCreate){ - $actions[] = CreateAction::make(); - } - - return $actions; - } - - public function scan(): void - { - if (config('filament-translations.use_queue_on_scan')) { - $this->dispatchScanJob(); - } elseif (config('filament-translations.path_to_custom_import_command')) { - $this->runCustomImportCommand(); - } else { - $this->saveScan(); - } - - $this->sendNotification(); - } - - protected function dispatchScanJob(): void - { - dispatch(new ScanJob()); - } - - protected function runCustomImportCommand(): void - { - spin( - function () { - $command = config('filament-translations.path_to_custom_import_command'); - $command = new $command(); - $command->handle(); - }, - 'Fetching keys...' - ); - } - - protected function saveScan(): void - { - $scan = new SaveScan(); - $scan->save(); - } - - protected function sendNotification(): void - { - Notification::make() - ->title(trans('filament-translations::translation.loaded')) - ->success() - ->send(); - } -} diff --git a/src/Services/ExcelImportExportService.php b/src/Services/ExcelImportExportService.php index bdf76eb..2c601a9 100644 --- a/src/Services/ExcelImportExportService.php +++ b/src/Services/ExcelImportExportService.php @@ -18,15 +18,15 @@ public static function export(): BinaryFileResponse $fileName = date('Y-m-d-H-i-s') . '-translations.xlsx'; - return Excel::download(new $exportClass(), $fileName); + return Excel::download(new $exportClass, $fileName); } - public static function import(UploadedFile|string $file): void + public static function import(UploadedFile | string $file): void { $importClass = config('filament-translations.path_to_custom_excel_import') ?? TranslationsImport::class; - Excel::import(new $importClass(), $file); + Excel::import(new $importClass, $file); self::sendSuccessNotification(); } diff --git a/src/Services/Manager.php b/src/Services/Manager.php index 189f056..006d8db 100644 --- a/src/Services/Manager.php +++ b/src/Services/Manager.php @@ -53,19 +53,19 @@ public function importTranslations($replace = false, $base = null, $import_group if (in_array($group, config('filament-translations.exclude_groups'))) { continue; } - $subLangPath = str_replace($langPath.DIRECTORY_SEPARATOR, '', $info['dirname']); + $subLangPath = str_replace($langPath . DIRECTORY_SEPARATOR, '', $info['dirname']); $subLangPath = str_replace(DIRECTORY_SEPARATOR, '/', $subLangPath); $langPath = str_replace(DIRECTORY_SEPARATOR, '/', $langPath); if ($subLangPath != $langPath) { - $group = $subLangPath.'/'.$group; + $group = $subLangPath . '/' . $group; } if (! $vendor) { $translations = \Lang::getLoader()->load($locale, $group); } else { $translations = include $file; - $group = 'vendor/'.$vendorName.'/'.$group; + $group = 'vendor/' . $vendorName . '/' . $group; } if ($translations && is_array($translations)) { @@ -89,13 +89,13 @@ public function importTranslation($key, $value, $locale, $group, $replace = fals } $value = (string) $value; $translation = Translation::firstOrNew([ - 'group' => $group, - 'key' => $key, + 'group' => $group, + 'key' => $key, ]); $text = $translation->text; - if(empty($text[$locale])) { + if (empty($text[$locale])) { $text[$locale] = $value; $replace = true; } diff --git a/src/Services/SaveScan.php b/src/Services/SaveScan.php index 0360452..48a9a73 100644 --- a/src/Services/SaveScan.php +++ b/src/Services/SaveScan.php @@ -3,10 +3,9 @@ namespace TomatoPHP\FilamentTranslations\Services; use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Lang; -use TomatoPHP\FilamentTranslations\Services\Scan; use TomatoPHP\FilamentTranslations\Models\Translation; -use Illuminate\Support\Facades\DB; class SaveScan { @@ -24,26 +23,25 @@ public function save() $scanner->addScannedPath($path); }); - list($trans, $__) = $scanner->getAllViewFilesWithTranslations(); + [$trans, $__] = $scanner->getAllViewFilesWithTranslations(); /** @var Collection $trans */ /** @var Collection $__ */ - DB::transaction(function () use ($trans, $__) { Translation::query() ->whereNull('deleted_at') ->update([ - 'deleted_at' => Carbon::now() + 'deleted_at' => Carbon::now(), ]); $trans->each(function ($trans) { - list($group, $key) = explode('.', $trans, 2); + [$group, $key] = explode('.', $trans, 2); $namespaceAndGroup = explode('::', $group, 2); if (count($namespaceAndGroup) === 1) { $namespace = '*'; $group = $namespaceAndGroup[0]; } else { - list($namespace, $group) = $namespaceAndGroup; + [$namespace, $group] = $namespaceAndGroup; } $this->createOrUpdate($namespace, $group, $key, $trans); }); @@ -54,11 +52,6 @@ public function save() }); } - /** - * @param $namespace - * @param $group - * @param $key - */ protected function createOrUpdate($namespace, $group, $key, $mainKey = null): void { /** @var Translation $translation */ @@ -71,14 +64,14 @@ protected function createOrUpdate($namespace, $group, $key, $mainKey = null): vo $defaultLocale = config('app.locale'); if ($translation) { - if (!$this->isCurrentTransForTranslationArray($translation, $defaultLocale)) { + if (! $this->isCurrentTransForTranslationArray($translation, $defaultLocale)) { $translation->restore(); } } else { $locals = config('filament-translations.locals'); $text = []; foreach ($locals as $locale => $lang) { - $text[$locale] = $locale === 'en' ? Lang::get($mainKey, [], $locale) : ''; + $text[$locale] = Lang::get($mainKey, [], $locale, $mainKey); } $translation = Translation::make([ 'namespace' => $namespace, @@ -87,17 +80,12 @@ protected function createOrUpdate($namespace, $group, $key, $mainKey = null): vo 'text' => $text, ]); - if (!$this->isCurrentTransForTranslationArray($translation, $defaultLocale)) { + if (! $this->isCurrentTransForTranslationArray($translation, $defaultLocale)) { $translation->save(); } } } - /** - * @param Translation $translation - * @param $locale - * @return bool - */ private function isCurrentTransForTranslationArray(Translation $translation, $locale): bool { if ($translation->group === '*') { diff --git a/src/Services/Scan.php b/src/Services/Scan.php index ec5697d..fd2e215 100644 --- a/src/Services/Scan.php +++ b/src/Services/Scan.php @@ -2,9 +2,8 @@ namespace TomatoPHP\FilamentTranslations\Services; -use Illuminate\Support\Str; -use Illuminate\Support\Facades\Lang; use Illuminate\Filesystem\Filesystem; +use Illuminate\Support\Str; use Symfony\Component\Finder\SplFileInfo; class Scan @@ -25,8 +24,6 @@ class Scan /** * Manager constructor. - * - * @param Filesystem $disk */ public function __construct(Filesystem $disk) { @@ -34,9 +31,6 @@ public function __construct(Filesystem $disk) $this->scannedPaths = collect([]); } - /** - * @param $path - */ public function addScannedPath($path): void { $this->scannedPaths->push($path); @@ -58,7 +52,7 @@ public function getAllViewFilesWithTranslations(): array 'Lang::transChoice', '@lang', '@choice', - '__' + '__', ]; $patternA = @@ -74,8 +68,7 @@ public function getAllViewFilesWithTranslations(): array "([.][^\1)$]+)+" . // Be followed by one or more items/keys ')' . // Close group "[\'\"]" . // Closing quote - "[\),]" // Close parentheses or new parameter - ; + "[\),]"; // Close parentheses or new parameter $patternB = // See https://regex101.com/r/2EfItR/2 @@ -91,8 +84,7 @@ public function getAllViewFilesWithTranslations(): array ')' . // Close group '[\"]' . // Closing quote - '[\)]' // Close parentheses or new parameter - ; + '[\)]'; // Close parentheses or new parameter $patternC = // See https://regex101.com/r/VaPQ7A/2 @@ -108,8 +100,7 @@ public function getAllViewFilesWithTranslations(): array ')' . // Close group '[\']' . // Closing quote - '[\)]' // Close parentheses or new parameter - ; + '[\)]'; // Close parentheses or new parameter $trans = collect(); $__ = collect(); @@ -120,7 +111,7 @@ public function getAllViewFilesWithTranslations(): array /** @var SplFileInfo $file */ foreach ($this->disk->allFiles($this->scannedPaths->toArray()) as $file) { $dir = dirname($file); - if(Str::startsWith($dir,$excludedPaths)) { + if (Str::startsWith($dir, $excludedPaths)) { continue; } @@ -136,6 +127,7 @@ public function getAllViewFilesWithTranslations(): array $__->push($matches[2]); } } + return [$trans->flatten()->unique(), $__->flatten()->unique()]; } } diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..7a3c75b --- /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..d89e1b08e3292ca52cc370e6dfe910d2a5a4398e GIT binary patch literal 360448 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 b-g>U9&`JfoHaBr^F}**Xwc6cW1pNO4yqTx; literal 0 HcmV?d00001 diff --git a/tests/database/factories/TranslationFactory.php b/tests/database/factories/TranslationFactory.php new file mode 100644 index 0000000..bc0119c --- /dev/null +++ b/tests/database/factories/TranslationFactory.php @@ -0,0 +1,27 @@ + $item) { + $text[$key] = $this->faker->sentence; + } + + return [ + 'group' => $this->faker->word, + 'key' => $this->faker->word, + 'text' => $text, + 'namespace' => '*', + ]; + } +} diff --git a/tests/database/factories/UserFactory.php b/tests/database/factories/UserFactory.php new file mode 100644 index 0000000..5351c8a --- /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..7b562cd --- /dev/null +++ b/tests/src/AdminPanelProvider.php @@ -0,0 +1,52 @@ +default() + ->id('admin') + ->path('admin') + ->login() + ->pages([ + Pages\Dashboard::class, + ]) + ->plugin( + FilamentTranslationsPlugin::make() + ->allowCreate() + ->allowClearTranslations() + ) + ->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/Models/Translation.php b/tests/src/Models/Translation.php new file mode 100644 index 0000000..6cf4b23 --- /dev/null +++ b/tests/src/Models/Translation.php @@ -0,0 +1,64 @@ + 'array']; + + protected $table = 'language_lines'; + + protected $fillable = [ + 'group', + 'key', + 'text', + 'namespace', + ]; + + public static function getTranslatableLocales(): array + { + return config('filament-translations.locals'); + } + + public function getTranslation(string $locale, ?string $group = null): string + { + if ($group === '*' && ! isset($this->text[$locale])) { + $fallback = config('app.fallback_locale'); + + return $this->text[$fallback] ?? $this->key; + } + + return $this->text[$locale] ?? ''; + } + + public function setTranslation(string $locale, string $value): self + { + $this->text = array_merge($this->text ?? [], [$locale => $value]); + + return $this; + } + + protected function getTranslatedLocales(): array + { + return array_keys($this->text); + } + + protected static function newFactory(): TranslationFactory + { + return TranslationFactory::new(); + } +} diff --git a/tests/src/Models/User.php b/tests/src/Models/User.php new file mode 100644 index 0000000..9f34bfb --- /dev/null +++ b/tests/src/Models/User.php @@ -0,0 +1,34 @@ +plugins([ + FilamentTranslationsPlugin::make(), + ]); + + expect($panel->getPlugin('filament-translations')) + ->not() + ->toThrow(Exception::class); +}); + +it('can modify allow create new translations', function ($condition) { + $plugin = FilamentTranslationsPlugin::make() + ->allowCreate($condition); + + expect($plugin->allowCreate)->toBe($condition); +})->with([ + false, + fn () => true, +]); + +it('can modify allow clear all translations', function ($condition) { + $plugin = FilamentTranslationsPlugin::make() + ->allowClearTranslations($condition); + + expect($plugin->allowClearTranslations)->toBe($condition); +})->with([ + false, + fn () => true, +]); diff --git a/tests/src/TestCase.php b/tests/src/TestCase.php new file mode 100644 index 0000000..828aad9 --- /dev/null +++ b/tests/src/TestCase.php @@ -0,0 +1,64 @@ +loadMigrationsFrom(__DIR__ . '/../../database/migrations'); + } + + 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, + FilamentTranslationComponentServiceProvider::class, + FilamentTranslationsServiceProvider::class, + AdminPanelProvider::class, + ]; + } + + public function getEnvironmentSetUp($app): void + { + $app['config']->set('filament-translations.use_queue_on_scan', false); + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite.database', __DIR__ . '/../database/database.sqlite'); + + $app['config']->set('view.paths', [ + ...$app['config']->get('view.paths'), + __DIR__ . '/../resources/views', + ]); + } +} diff --git a/tests/src/TranslationResourceTest.php b/tests/src/TranslationResourceTest.php new file mode 100644 index 0000000..64539e9 --- /dev/null +++ b/tests/src/TranslationResourceTest.php @@ -0,0 +1,227 @@ +create()); +}); + +it('can render translation resource', function () { + get(TranslationResource::getUrl())->assertSuccessful(); +}); + +it('can list translations', function () { + Translation::query()->delete(); + $translations = Translation::factory()->count(10)->create(); + + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->loadTable() + ->assertCanSeeTableRecords($translations) + ->assertCountTableRecords(10); +}); + +it('can render user key/text column in table', function () { + Translation::factory()->count(10)->create(); + + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->loadTable() + ->assertCanRenderTableColumn('key') + ->assertCanRenderTableColumn('text'); +}); + +it('can render translations list page', function () { + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class)->assertSuccessful(); +}); + +it('can render view translations page', function () { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class, [ + 'record' => Translation::factory()->create(), + ]) + ->mountAction('view') + ->assertSuccessful(); + } else { + get(TranslationResource::getUrl('view', [ + 'record' => Translation::factory()->create(), + ]))->assertSuccessful(); + } +}); + +it('can render translation create page', function () { + if (filament('filament-translations')->allowCreate) { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class) + ->mountAction('create') + ->assertSuccessful(); + } else { + get(TranslationResource::getUrl('create'))->assertSuccessful(); + } + } +}); + +it('can render translation scan button', function () { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class) + ->mountAction('scan') + ->assertSuccessful(); + } else { + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->mountAction('scan') + ->assertSuccessful(); + } +}); + +it('can run scan', function () { + Translation::query()->delete(); + + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class) + ->callAction('scan') + ->assertSuccessful(); + } else { + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->callAction('scan') + ->assertSuccessful(); + } + + assertNotEquals(Translation::query()->count(), 0); +}); + +it('can render translation clear button', function () { + Translation::factory()->count(10)->create(); + + if (filament('filament-translations')->allowClearTranslations) { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class) + ->callAction('clear') + ->assertSuccessful(); + } else { + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->callAction('clear') + ->assertSuccessful(); + } + + assertEquals(Translation::query()->count(), 0); + } +}); + +it('can perform clear translation clear', function () { + if (filament('filament-translations')->allowClearTranslations) { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class) + ->mountAction('clear') + ->assertSuccessful(); + } else { + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\ListTranslations::class) + ->mountAction('clear') + ->assertSuccessful(); + } + } +}); + + + + +it('can create new translation', function () { + $newData = Translation::factory()->make(); + + livewire(TranslationResource\Pages\CreateTranslation::class) + ->fillForm([ + 'group' => $newData->group, + 'key' => $newData->key, + 'text' => $newData->text, + 'namespace' => $newData->namespace, + ]) + ->call('create') + ->assertHasNoFormErrors(); + + assertDatabaseHas(Translation::class, [ + 'group' => $newData->group, + 'key' => $newData->key, + ]); +}); + +it('can validate translation input', function () { + livewire(TranslationResource\Pages\CreateTranslation::class) + ->fillForm([ + 'group' => null, + 'key' => null, + ]) + ->call('create') + ->assertHasFormErrors([ + 'group' => 'required', + 'key' => 'required' + ]); +}); + +it('can render translation edit page', function () { + if (config('filament-translations.modal')) { + livewire(TranslationResource\Pages\ManageTranslations::class, [ + 'record' => Translation::factory()->create(), + ]) + ->mountAction('edit') + ->assertSuccessful(); + } else { + get(TranslationResource::getUrl('edit', [ + 'record' => Translation::factory()->create(), + ]))->assertSuccessful(); + } +}); + +it('can retrieve translation data', function () { + $translation = Translation::factory()->create(); + + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\EditTranslation::class, [ + 'record' => $translation->getRouteKey(), + ]) + ->assertFormSet([ + 'group' => $translation->group, + 'key' => $translation->key, + 'text' => $translation->text, + ]); +}); + +it('can validate edit translation input', function () { + $translation = Translation::factory()->create(); + + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\EditTranslation::class, [ + 'record' => $translation->getRouteKey(), + ]) + ->fillForm([ + 'group' => null, + 'key' => null, + ]) + ->call('save') + ->assertHasFormErrors([ + 'group' => 'required', + 'key' => 'required' + ]); +}); + +it('can save translation data', function () { + $translation = Translation::factory()->create(); + $newData = Translation::factory()->make(); + + livewire(\TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\EditTranslation::class, [ + 'record' => $translation->getRouteKey(), + ]) + + ->fillForm([ + 'text' => $newData->text, + ]) + ->call('save') + ->assertHasNoFormErrors(); + + expect($translation->refresh()) + ->text->toBe($newData->text); +}); From 0e56502dc1722e47c5f63604eaa0b383d50adc44 Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Sat, 26 Oct 2024 17:27:31 +0300 Subject: [PATCH 2/3] v2 --- src/Console/ImportCommand.php | 4 +- .../Resources/TranslationResource.php | 1 - .../Actions/Components/Action.php | 2 - .../Actions/Components/ClearAction.php | 3 +- .../Actions/Components/CreateAction.php | 1 - .../Actions/Components/DeleteAction.php | 1 - .../Actions/Components/EditAction.php | 2 - .../Actions/Components/ScanAction.php | 6 +- .../Actions/Components/ViewAction.php | 1 - .../Actions/Contracts/CanRegister.php | 34 ++--- .../Actions/CreatePageActions.php | 3 +- .../Actions/EditPageActions.php | 3 +- .../Actions/ManagePageActions.php | 2 +- .../Actions/ViewPageActions.php | 4 +- .../Form/Components/Key.php | 2 +- .../Form/Components/Text.php | 2 - .../Pages/ListTranslations.php | 56 ------- .../Pages/ManageTranslations.php | 143 ------------------ .../Pages/ViewTranslations.php | 2 - .../Table/Actions/DeleteAction.php | 2 - .../Table/BulkActions/DeleteAction.php | 2 - .../Table/Filters/Group.php | 1 - .../Table/Filters/Text.php | 1 - .../Table/HeaderActions/ExportAction.php | 1 - .../Table/HeaderActions/ImportAction.php | 1 - src/FilamentTranslationsPlugin.php | 9 +- src/Services/SaveScan.php | 2 +- tests/database/database.sqlite | Bin 360448 -> 430080 bytes tests/src/TestCase.php | 1 - tests/src/TranslationResourceTest.php | 8 +- 30 files changed, 38 insertions(+), 262 deletions(-) diff --git a/src/Console/ImportCommand.php b/src/Console/ImportCommand.php index f8e5cda..e34e512 100644 --- a/src/Console/ImportCommand.php +++ b/src/Console/ImportCommand.php @@ -29,7 +29,7 @@ class ImportCommand extends Command public function handle() { if (config('filament-translations.path_to_custom_import_command')) { - $response = spin( + spin( function () { $command = config('filament-translations.path_to_custom_import_command'); $command = new $command; @@ -43,7 +43,7 @@ function () { return; } - $response = spin( + spin( function () { $scan = new SaveScan; $scan->save(); diff --git a/src/Filament/Resources/TranslationResource.php b/src/Filament/Resources/TranslationResource.php index 1b9bd84..5935cc1 100644 --- a/src/Filament/Resources/TranslationResource.php +++ b/src/Filament/Resources/TranslationResource.php @@ -2,7 +2,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources; -use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables\Table; diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/Action.php b/src/Filament/Resources/TranslationResource/Actions/Components/Action.php index 0e6c492..a89054c 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/Action.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/Action.php @@ -2,8 +2,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components; -use Illuminate\Database\Eloquent\Model; - abstract class Action { abstract public static function make(): \Filament\Actions\Action; diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/ClearAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/ClearAction.php index e211096..924bec2 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/ClearAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/ClearAction.php @@ -4,7 +4,6 @@ use Filament\Actions; use Filament\Notifications\Notification; -use Illuminate\Database\Eloquent\Model; use TomatoPHP\FilamentTranslations\Models\Translation; class ClearAction extends Action @@ -14,6 +13,8 @@ public static function make(): Actions\Action return Actions\Action::make('clear') ->requiresConfirmation() ->icon('heroicon-o-trash') + ->hiddenLabel() + ->tooltip(trans('filament-translations::translation.clear')) ->action(function () { Translation::query()->truncate(); diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php index 345839f..7b319ec 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/CreateAction.php @@ -3,7 +3,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components; use Filament\Actions; -use Illuminate\Database\Eloquent\Model; class CreateAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/DeleteAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/DeleteAction.php index 01dfe42..991cb15 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/DeleteAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/DeleteAction.php @@ -3,7 +3,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components; use Filament\Actions; -use Illuminate\Database\Eloquent\Model; class DeleteAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/EditAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/EditAction.php index 35c80ef..535cb70 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/EditAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/EditAction.php @@ -3,8 +3,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components; use Filament\Actions; -use Illuminate\Database\Eloquent\Model; -use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages\EditTranslation; class EditAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/ScanAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/ScanAction.php index f806393..befaaf1 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/ScanAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/ScanAction.php @@ -4,9 +4,9 @@ use Filament\Actions; use Filament\Notifications\Notification; -use Illuminate\Database\Eloquent\Model; use TomatoPHP\FilamentTranslations\Jobs\ScanJob; use TomatoPHP\FilamentTranslations\Services\SaveScan; + use function Laravel\Prompts\spin; class ScanAction extends Action @@ -16,7 +16,9 @@ public static function make(): Actions\Action return Actions\Action::make('scan') ->requiresConfirmation() ->icon('heroicon-m-magnifying-glass') - ->action(function (){ + ->hiddenLabel() + ->tooltip(trans('filament-translations::translation.scan')) + ->action(function () { if (config('filament-translations.use_queue_on_scan')) { dispatch(new ScanJob); } elseif (config('filament-translations.path_to_custom_import_command')) { diff --git a/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php b/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php index 32d80df..5d650b2 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php +++ b/src/Filament/Resources/TranslationResource/Actions/Components/ViewAction.php @@ -3,7 +3,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components; use Filament\Actions; -use Illuminate\Database\Eloquent\Model; class ViewAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Actions/Contracts/CanRegister.php b/src/Filament/Resources/TranslationResource/Actions/Contracts/CanRegister.php index 4799d77..b5b4ac7 100644 --- a/src/Filament/Resources/TranslationResource/Actions/Contracts/CanRegister.php +++ b/src/Filament/Resources/TranslationResource/Actions/Contracts/CanRegister.php @@ -6,6 +6,7 @@ use Filament\Forms\Form; use Filament\Pages\Page; use Filament\Support\Concerns\EvaluatesClosures; + use function Filament\Support\get_model_label; trait CanRegister @@ -16,23 +17,24 @@ trait CanRegister protected static ?Page $page = null; - public static function make(?Page $page=null): array + public static function make(?Page $page = null): array { - static::$page = $page; + self::$page = $page; - return (new static)->getActions(); + return (new self)->getActions(); } public function getActions(): array { - return collect($this->getDefaultActions())->merge(static::$actions)->map(function (StaticAction $action){ - if(method_exists($action, 'record') && str($action->getName())->contains(['create', 'edit', 'view'])){ - $action->record(method_exists(static::$page, 'getRecord') ? static::$page->getRecord() : null) - ->model(method_exists(static::$page, 'getModel') ? static::$page->getModel() : null) - ->modelLabel(method_exists(static::$page, 'getModelLabel') ? get_model_label(static::$page->getModel()) : null) - ->form(fn(Form $form) => app(static::$page->getResource())::form($form)) - ->url(fn() => isset(app(static::$page->getResource())::getPages()[$action->getName()]) ? app(app(static::$page->getResource())::getPages()[$action->getName()]->getPage())->getUrl() : null); + 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(); } @@ -42,15 +44,13 @@ public static function register(StaticAction | array | \Closure $component): voi if (is_array($component)) { foreach ($component as $item) { if ($item instanceof StaticAction) { - static::$actions[] = $item; + self::$actions[] = $item; } } - } - else if($component instanceof \Closure){ - static::$actions[] = (new static)->evaluate($component); - } - else { - static::$actions[] = $component; + } elseif ($component instanceof \Closure) { + self::$actions[] = (new self)->evaluate($component); + } else { + self::$actions[] = $component; } } } diff --git a/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php b/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php index aa6ebb1..9655a3a 100644 --- a/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php +++ b/src/Filament/Resources/TranslationResource/Actions/CreatePageActions.php @@ -2,8 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions; - -class CreatePageActions +final class CreatePageActions { use Contracts\CanRegister; diff --git a/src/Filament/Resources/TranslationResource/Actions/EditPageActions.php b/src/Filament/Resources/TranslationResource/Actions/EditPageActions.php index 21f2612..f908e5d 100644 --- a/src/Filament/Resources/TranslationResource/Actions/EditPageActions.php +++ b/src/Filament/Resources/TranslationResource/Actions/EditPageActions.php @@ -2,8 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions; - -class EditPageActions +final class EditPageActions { use Contracts\CanRegister; diff --git a/src/Filament/Resources/TranslationResource/Actions/ManagePageActions.php b/src/Filament/Resources/TranslationResource/Actions/ManagePageActions.php index 4b10d71..e336d72 100644 --- a/src/Filament/Resources/TranslationResource/Actions/ManagePageActions.php +++ b/src/Filament/Resources/TranslationResource/Actions/ManagePageActions.php @@ -2,7 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions; -class ManagePageActions +final class ManagePageActions { use Contracts\CanRegister; diff --git a/src/Filament/Resources/TranslationResource/Actions/ViewPageActions.php b/src/Filament/Resources/TranslationResource/Actions/ViewPageActions.php index 5ff3ee6..472b578 100644 --- a/src/Filament/Resources/TranslationResource/Actions/ViewPageActions.php +++ b/src/Filament/Resources/TranslationResource/Actions/ViewPageActions.php @@ -2,7 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions; -class ViewPageActions +final class ViewPageActions { use Contracts\CanRegister; @@ -10,7 +10,7 @@ public function getDefaultActions(): array { return [ Components\EditAction::make(), - Components\DeleteAction::make() + Components\DeleteAction::make(), ]; } } diff --git a/src/Filament/Resources/TranslationResource/Form/Components/Key.php b/src/Filament/Resources/TranslationResource/Form/Components/Key.php index 67aff79..97085d4 100644 --- a/src/Filament/Resources/TranslationResource/Form/Components/Key.php +++ b/src/Filament/Resources/TranslationResource/Form/Components/Key.php @@ -8,7 +8,7 @@ class Key extends Component { public static function make(): Forms\Components\TextInput { - return Forms\Components\TextInput::make('key') + return Forms\Components\TextInput::make('key') ->label(trans('filament-translations::translation.key')) ->disabled(fn (Forms\Get $get) => $get('id') !== null) ->required() diff --git a/src/Filament/Resources/TranslationResource/Form/Components/Text.php b/src/Filament/Resources/TranslationResource/Form/Components/Text.php index a1a310a..c8b71fd 100644 --- a/src/Filament/Resources/TranslationResource/Form/Components/Text.php +++ b/src/Filament/Resources/TranslationResource/Form/Components/Text.php @@ -2,8 +2,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Form\Components; -use Filament\Forms; - class Text extends Component { public static function make(): \TomatoPHP\FilamentTranslationComponent\Components\Translation diff --git a/src/Filament/Resources/TranslationResource/Pages/ListTranslations.php b/src/Filament/Resources/TranslationResource/Pages/ListTranslations.php index 0400d23..6699c86 100644 --- a/src/Filament/Resources/TranslationResource/Pages/ListTranslations.php +++ b/src/Filament/Resources/TranslationResource/Pages/ListTranslations.php @@ -2,12 +2,8 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages; -use Filament\Pages\Actions\Action; use Filament\Resources\Pages\ListRecords; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource; -use TomatoPHP\FilamentTranslations\Jobs\ScanJob; -use TomatoPHP\FilamentTranslations\Services\SaveScan; -use function Laravel\Prompts\spin; class ListTranslations extends ListRecords { @@ -20,58 +16,6 @@ public function getTitle(): string protected function getHeaderActions(): array { -// dd(TranslationResource\Actions\ManagePageActions::make($this)); return TranslationResource\Actions\ManagePageActions::make($this); } -// -// protected function getActions(): array -// { -// $options = []; -// foreach (config('filament-translations.locals') as $key => $item) { -// $options[$key] = $item['label']; -// } -// -// return [ -// Action::make('scan') -// ->icon('heroicon-m-magnifying-glass') -// ->action('scan') -// ->label(trans('filament-translations::translation.scan')), -// ]; -// } -// -// public function scan(): void -// { -// if (config('filament-translations.use_queue_on_scan')) { -// $this->dispatchScanJob(); -// } elseif (config('filament-translations.path_to_custom_import_command')) { -// $this->runCustomImportCommand(); -// } else { -// $this->saveScan(); -// } -// -// $this->notify('success', 'Translation Has Been Loaded'); -// } -// -// protected function dispatchScanJob(): void -// { -// dispatch(new ScanJob); -// } -// -// protected function runCustomImportCommand(): void -// { -// spin( -// function () { -// $command = config('filament-translations.path_to_custom_import_command'); -// $command = new $command; -// $command->handle(); -// }, -// 'Fetching keys...' -// ); -// } -// -// protected function saveScan(): void -// { -// $scan = new SaveScan; -// $scan->save(); -// } } diff --git a/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php b/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php index 2ce5cb1..12ed818 100644 --- a/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php +++ b/src/Filament/Resources/TranslationResource/Pages/ManageTranslations.php @@ -2,20 +2,8 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages; -use Filament\Actions\Action; -use Filament\Actions\CreateAction; -use Filament\Forms\Components\Select; -use Filament\Notifications\Notification; use Filament\Resources\Pages\ManageRecords; -use OpenAI\Laravel\Facades\OpenAI; -use Stichoza\GoogleTranslate\GoogleTranslate; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource; -use TomatoPHP\FilamentTranslations\Jobs\ScanJob; -use TomatoPHP\FilamentTranslations\Jobs\ScanWithGPT; -use TomatoPHP\FilamentTranslations\Models\Translation; -use TomatoPHP\FilamentTranslations\Services\SaveScan; -use TomatoPHP\FilamentTranslationsGoogle\Jobs\ScanWithGoogleTranslate; -use function Laravel\Prompts\spin; class ManageTranslations extends ManageRecords { @@ -30,135 +18,4 @@ protected function getActions(): array { return TranslationResource\Actions\ManagePageActions::make($this); } -// -// protected function getActions(): array -// { -// $actions = []; -// -// if (config('filament-translations.scan_enabled')) { -// $actions[] = Action::make('scan') -// ->requiresConfirmation() -// ->icon('heroicon-m-magnifying-glass') -// ->action('scan') -// ->label(trans('filament-translations::translation.scan')); -// } -// -// if (filament('filament-translations')->allowGPTScan && class_exists(OpenAI::class)) { -// $actions[] = Action::make('gpt') -// ->requiresConfirmation() -// ->icon('heroicon-o-link') -// ->form([ -// Select::make('language') -// ->searchable() -// ->options(collect(config('filament-translations.locals'))->pluck('label', 'label')->toArray()) -// ->label(trans('filament-translations::translation.gpt_scan_language')) -// ->required(), -// ]) -// ->action(function (array $data) { -// dispatch(new ScanWithGPT($data['language'], auth()->user()->id, get_class(auth()->user()))); -// -// Notification::make() -// ->title(trans('filament-translations::translation.gpt_scan_notification_start')) -// ->success() -// ->send(); -// }) -// ->color('warning') -// ->label(trans('filament-translations::translation.gpt_scan')); -// } -// -// if (filament('filament-translations')->allowGoogleTranslateScan && class_exists(GoogleTranslate::class)) { -// $actions[] = Action::make('google') -// ->requiresConfirmation() -// ->icon('heroicon-o-language') -// ->form([ -// Select::make('language') -// ->searchable() -// ->options( -// collect(config('filament-translations.locals'))->mapWithKeys(function ($item, $key) { -// return [$key => $item['label']]; -// })->toArray() -// ) -// ->label(trans('filament-translations::translation.gpt_scan_language')) -// ->required(), -// ]) -// ->action(function (array $data) { -// dispatch( -// new ScanWithGoogleTranslate(auth()->user(), $data['language']) -// ); -// -// Notification::make() -// ->title(trans('filament-translations::translation.google_scan_notifications_start')) -// ->success() -// ->send(); -// }) -// ->color('warning') -// ->label(trans('filament-translations::translation.google_scan')); -// } -// -// if (filament('filament-translations')->allowClearTranslations) { -// $actions[] = Action::make('clear') -// ->requiresConfirmation() -// ->icon('heroicon-o-trash') -// ->action(function () { -// Translation::query()->truncate(); -// -// Notification::make() -// ->title(trans('filament-translations::translation.clear_notifications')) -// ->success() -// ->send(); -// }) -// ->color('danger') -// ->label(trans('filament-translations::translation.clear')); -// } -// -// if (filament('filament-translations')->allowCreate) { -// $actions[] = CreateAction::make(); -// } -// -// return $actions; -// } -// -// public function scan(): void -// { -// if (config('filament-translations.use_queue_on_scan')) { -// $this->dispatchScanJob(); -// } elseif (config('filament-translations.path_to_custom_import_command')) { -// $this->runCustomImportCommand(); -// } else { -// $this->saveScan(); -// } -// -// $this->sendNotification(); -// } -// -// protected function dispatchScanJob(): void -// { -// dispatch(new ScanJob); -// } -// -// protected function runCustomImportCommand(): void -// { -// spin( -// function () { -// $command = config('filament-translations.path_to_custom_import_command'); -// $command = new $command; -// $command->handle(); -// }, -// 'Fetching keys...' -// ); -// } -// -// protected function saveScan(): void -// { -// $scan = new SaveScan; -// $scan->save(); -// } -// -// protected function sendNotification(): void -// { -// Notification::make() -// ->title(trans('filament-translations::translation.loaded')) -// ->success() -// ->send(); -// } } diff --git a/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php b/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php index 62c73b3..d6ae522 100644 --- a/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php +++ b/src/Filament/Resources/TranslationResource/Pages/ViewTranslations.php @@ -2,7 +2,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Pages; -use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\ViewRecord; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource; @@ -10,7 +9,6 @@ class ViewTranslations extends ViewRecord { protected static string $resource = TranslationResource::class; - protected function getHeaderActions(): array { return TranslationResource\Actions\ViewPageActions::make($this); diff --git a/src/Filament/Resources/TranslationResource/Table/Actions/DeleteAction.php b/src/Filament/Resources/TranslationResource/Table/Actions/DeleteAction.php index 1f98836..8817532 100644 --- a/src/Filament/Resources/TranslationResource/Table/Actions/DeleteAction.php +++ b/src/Filament/Resources/TranslationResource/Table/Actions/DeleteAction.php @@ -2,9 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\Actions; -use Filament\Notifications\Notification; use Filament\Tables; -use Illuminate\Database\Eloquent\Model; class DeleteAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Table/BulkActions/DeleteAction.php b/src/Filament/Resources/TranslationResource/Table/BulkActions/DeleteAction.php index 64d2874..d54eba2 100644 --- a/src/Filament/Resources/TranslationResource/Table/BulkActions/DeleteAction.php +++ b/src/Filament/Resources/TranslationResource/Table/BulkActions/DeleteAction.php @@ -2,9 +2,7 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\BulkActions; -use Filament\Notifications\Notification; use Filament\Tables; -use Illuminate\Database\Eloquent\Model; class DeleteAction extends Action { diff --git a/src/Filament/Resources/TranslationResource/Table/Filters/Group.php b/src/Filament/Resources/TranslationResource/Table/Filters/Group.php index a2ac329..1505b1e 100644 --- a/src/Filament/Resources/TranslationResource/Table/Filters/Group.php +++ b/src/Filament/Resources/TranslationResource/Table/Filters/Group.php @@ -7,7 +7,6 @@ class Group extends Filter { - public static function make(): Filters\SelectFilter { return Filters\SelectFilter::make('group') diff --git a/src/Filament/Resources/TranslationResource/Table/Filters/Text.php b/src/Filament/Resources/TranslationResource/Table/Filters/Text.php index a849755..7b28051 100644 --- a/src/Filament/Resources/TranslationResource/Table/Filters/Text.php +++ b/src/Filament/Resources/TranslationResource/Table/Filters/Text.php @@ -4,7 +4,6 @@ use Filament\Tables\Filters; use Illuminate\Database\Eloquent\Builder; -use Spatie\TranslationLoader\LanguageLine; class Text extends Filter { diff --git a/src/Filament/Resources/TranslationResource/Table/HeaderActions/ExportAction.php b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ExportAction.php index 263479a..25726c1 100644 --- a/src/Filament/Resources/TranslationResource/Table/HeaderActions/ExportAction.php +++ b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ExportAction.php @@ -3,7 +3,6 @@ namespace TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions; use Filament\Tables; -use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\Action; use TomatoPHP\FilamentTranslations\Services\ExcelImportExportService; class ExportAction extends Action diff --git a/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php index a7d6019..554285b 100644 --- a/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php +++ b/src/Filament/Resources/TranslationResource/Table/HeaderActions/ImportAction.php @@ -4,7 +4,6 @@ use Filament\Forms\Components\FileUpload; use Filament\Tables; -use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\Action; use TomatoPHP\FilamentTranslations\Services\ExcelImportExportService; class ImportAction extends Action diff --git a/src/FilamentTranslationsPlugin.php b/src/FilamentTranslationsPlugin.php index c365d67..7c664f2 100644 --- a/src/FilamentTranslationsPlugin.php +++ b/src/FilamentTranslationsPlugin.php @@ -3,16 +3,13 @@ namespace TomatoPHP\FilamentTranslations; use Filament\Contracts\Plugin; -use Filament\Pages\Page; use Filament\Panel; -use Filament\Tables\Actions\ReplicateAction; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\ClearAction; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\CreateAction; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\Components\ScanAction; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\ManagePageActions; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\ExportAction; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\HeaderActions\ImportAction; -use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationActions; use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationHeaderActions; class FilamentTranslationsPlugin implements Plugin @@ -57,15 +54,15 @@ public function boot(Panel $panel): void TranslationHeaderActions::register(ExportAction::make()); } - if(config('filament-translations.scan_enabled')){ + if (config('filament-translations.scan_enabled')) { ManagePageActions::register(ScanAction::make()); } - if(filament('filament-translations')->allowClearTranslations){ + if (filament('filament-translations')->allowClearTranslations) { ManagePageActions::register(ClearAction::make()); } - if(filament('filament-translations')->allowCreate){ + if (filament('filament-translations')->allowCreate) { ManagePageActions::register(CreateAction::make()); } } diff --git a/src/Services/SaveScan.php b/src/Services/SaveScan.php index 48a9a73..0b48cbe 100644 --- a/src/Services/SaveScan.php +++ b/src/Services/SaveScan.php @@ -73,7 +73,7 @@ protected function createOrUpdate($namespace, $group, $key, $mainKey = null): vo foreach ($locals as $locale => $lang) { $text[$locale] = Lang::get($mainKey, [], $locale, $mainKey); } - $translation = Translation::make([ + $translation = Translation::query()->create([ 'namespace' => $namespace, 'group' => $group, 'key' => $key, diff --git a/tests/database/database.sqlite b/tests/database/database.sqlite index d89e1b08e3292ca52cc370e6dfe910d2a5a4398e..a8c25a0a8776c0006061b4f8a38d4b20e5c788f4 100644 GIT binary patch literal 430080 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 R>V}3Z>K?%uzF|wD{}1#XKKlRw delta 48477 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 gG%9Cf30W|6Dmake(); @@ -160,7 +158,7 @@ ->call('create') ->assertHasFormErrors([ 'group' => 'required', - 'key' => 'required' + 'key' => 'required', ]); }); @@ -204,7 +202,7 @@ ->call('save') ->assertHasFormErrors([ 'group' => 'required', - 'key' => 'required' + 'key' => 'required', ]); }); From dc7833e35014fe9489644ab6c873a61a43cb0ac6 Mon Sep 17 00:00:00 2001 From: Fady Mondy Date: Sat, 26 Oct 2024 17:40:27 +0300 Subject: [PATCH 3/3] v2 --- README.md | 191 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 133 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 41710ef..5c4cc7b 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,11 @@ Finally register the plugin on `/app/Providers/Filament/AdminPanelProvider.php` $panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()) ``` +## Extensions + +- [Filament ChatGPT Auto Translation](https://www.github.com/tomatophp/filament-translations-gpt) +- [Filament Google Translations Auto Translation](https://www.github.com/tomatophp/filament-translations-google) + ### Allow Create Button to Create New Language If you want to allow the user to create a new language, you need to add the following to your panel provider: @@ -50,59 +55,12 @@ If you want to allow the user to clear all translations, you need to add the fol $panel->plugin(\TomatoPHP\FilamentTranslations\FilamentTranslationsPlugin::make()->allowClearTranslations()) ``` -### Publish Resource - -You can publish the resource to your project using: - -```bash -php artisan vendor:publish --tag="filament-translations-migrations" -``` - -If you need to publish config run: - -```bash -php artisan vendor:publish --tag="filament-translations-config" -``` - -Run migration: - -```bash -php artisan migrate -``` - -and now clear cache running: - -```bash -php artisan optimize:clear -``` - -### Publish Assets - -You can publish views file by use this command: - -```bash -php artisan vendor:publish --tag="filament-translations-views" -``` - -You can publish languages file by use this command: - -```bash -php artisan vendor:publish --tag="filament-translations-lang" -``` - -You can publish migrations file by use this command: - -```bash -php artisan vendor:publish --tag="filament-translations-migrations" -``` - ## Use Language Switcher we move language switcher to another package you can check it [Filament Language Switcher](https://github.com/tomatophp/filament-language-switcher) -## Usage -### Scan Using Command Line +## Scan Using Command Line You can scan your project to get all the languages tags and save them to the database @@ -110,7 +68,7 @@ You can scan your project to get all the languages tags and save them to the dat php artisan filament-translations:import ``` -### Change Scan to work on Queue +## Change Scan to work on Queue In your config file just change the `use_queue_on_scan` to `true` @@ -120,7 +78,7 @@ In your config file just change the `use_queue_on_scan` to `true` ``` -### Custom Import Command +## Custom Import Command You can create your own command to import the translations, add your custom import class to the config file like this: @@ -130,7 +88,7 @@ You can create your own command to import the translations, add your custom impo This command will automatically run when you click on the "Scan For New Languages" button in the UI. -### Custom Excel Import +## Custom Excel Import You can create your own Excel import to import the translations, add your custom import class to the config file like this: @@ -142,7 +100,7 @@ The import class is based on the Laravel Excel package. You can check the documentation [here](https://docs.laravel-excel.com/3.1/imports/). This import will automatically run when you click on the "Import" button in the UI. -### Custom Excel Export +## Custom Excel Export You can create your own Excel export to export the translations in your own format, add your custom export class to the config file like this: @@ -154,26 +112,143 @@ The export class is based on the Laravel Excel package. You can check the documentation [here](https://docs.laravel-excel.com/3.1/imports/). This import will automatically run when you click on the "Export" button in the UI. -### Show or hide buttons in the UI +## Show or hide buttons in the UI You can show or hide the buttons in the UI by changing the config file. By default, all buttons are shown. ```php - 'show_import_button' => true, - 'show_export_button' => false, - 'show_scan_button' => false , +'show_import_button' => true, +'show_export_button' => false, +'show_scan_button' => false , ``` -### Custom Resource +## Custom Resource You can create your own resource to show the translations in the UI, add your custom resource class to the config file like this: ```php - 'translation_resource' => CustomResource::class, +'translation_resource' => CustomResource::class, ``` This is especially useful when you want to have complete control over the UI but still want to use the translations package. Think about implementing a check on user roles when using `shouldRegisterNavigation` in your custom resource. +## Translation Translations Resource Hooks + +we have add a lot of hooks to make it easy to attach actions, columns, filters, etc + +### Table Columns + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationTable; + +public function boot() +{ + TranslationTable::register([ + \Filament\Tables\Columns\TextColumn::make('something') + ]); +} +``` + +### Table Actions + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationActions; + +public function boot() +{ + TranslationActions::register([ + \Filament\Tables\Actions\ReplicateAction::make() + ]); +} +``` + +### Table Filters + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationFilters; + +public function boot() +{ + TranslationFilters::register([ + \Filament\Tables\Filters\SelectFilter::make('something') + ]); +} +``` + +### Table Bulk Actions + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Table\TranslationBulkActions; + +public function boot() +{ + TranslationBulkActions::register([ + \Filament\Tables\BulkActions\DeleteAction::make() + ]); +} +``` + +### From Components + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Form\TranslationForm; + +public function boot() +{ + TranslationForm::register([ + \Filament\Forms\Components\TextInput::make('something') + ]); +} +``` + +### Page Actions + +```php +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\ManagePageActions; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\EditPageActions; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\ViewPageActions; +use TomatoPHP\FilamentTranslations\Filament\Resources\TranslationResource\Actions\CreatePageActions; + +public function boot() +{ + ManagePageActions::register([ + Filament\Actions\Action::make('action') + ]); + + EditPageActions::register([ + Filament\Actions\Action::make('action') + ]); + + ViewPageActions::register([ + Filament\Actions\Action::make('action') + ]); + + CreatePageActions::register([ + Filament\Actions\Action::make('action') + ]); +} +``` + +## Publish Assets + +You can publish views file by use this command: + +```bash +php artisan vendor:publish --tag="filament-translations-views" +``` + +You can publish languages file by use this command: + +```bash +php artisan vendor:publish --tag="filament-translations-lang" +``` + +You can publish migrations file by use this command: + +```bash +php artisan vendor:publish --tag="filament-translations-migrations" +``` + ## Other Filament Packages Checkout our [Awesome TomatoPHP](https://github.com/tomatophp/awesome)