From f20989e1e011304caa2997e89049003f6a6f62bb Mon Sep 17 00:00:00 2001 From: Tyson Glore Date: Fri, 15 Aug 2025 22:29:30 -0600 Subject: [PATCH] Completed Challange --- .editorconfig | 18 + .env.example | 65 + .gitattributes | 11 + .gitignore | 24 + README.md | 106 +- app/Http/Controllers/ArticleController.php | 100 + .../Auth/AuthenticatedSessionController.php | 47 + .../Auth/ConfirmablePasswordController.php | 40 + ...mailVerificationNotificationController.php | 24 + .../EmailVerificationPromptController.php | 21 + .../Auth/NewPasswordController.php | 62 + .../Controllers/Auth/PasswordController.php | 29 + .../Auth/PasswordResetLinkController.php | 44 + .../Auth/RegisteredUserController.php | 50 + .../Auth/VerifyEmailController.php | 27 + app/Http/Controllers/CategoryController.php | 53 + app/Http/Controllers/Controller.php | 8 + app/Http/Controllers/DashboardController.php | 22 + app/Http/Controllers/ProfileController.php | 60 + app/Http/Controllers/TagController.php | 47 + app/Http/Requests/Auth/LoginRequest.php | 85 + app/Http/Requests/ProfileUpdateRequest.php | 30 + app/Http/Requests/StoreArticleRequest.php | 33 + app/Http/Requests/StoreCategoryRequest.php | 29 + app/Http/Requests/StoreTagRequest.php | 29 + app/Models/Article.php | 32 + app/Models/Category.php | 23 + app/Models/Tag.php | 22 + app/Models/User.php | 48 + app/Providers/AppServiceProvider.php | 24 + app/View/Components/AppLayout.php | 17 + app/View/Components/GuestLayout.php | 17 + app/View/Components/SelectInput.php | 33 + app/View/Components/TextArea.php | 31 + artisan | 18 + bootstrap/app.php | 18 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 82 + composer.lock | 9483 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 108 + config/database.php | 174 + config/debugbar.php | 338 + config/filesystems.php | 96 + config/logging.php | 132 + config/mail.php | 118 + config/queue.php | 112 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/ArticleFactory.php | 46 + database/factories/CategoryFactory.php | 50 + database/factories/TagFactory.php | 39 + database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...5_08_13_002141_create_categories_table.php | 28 + .../2025_08_13_002204_create_tags_table.php | 28 + ...025_08_13_002224_create_articles_table.php | 31 + ..._08_13_020706_create_article_tag_table.php | 27 + database/seeders/ArticleSeeder.php | 17 + database/seeders/CategorySeeder.php | 17 + database/seeders/DatabaseSeeder.php | 44 + database/seeders/TagSeeder.php | 17 + docker-compose.yml | 56 + package-lock.json | 4053 +++++++ package.json | 25 + phpunit.xml | 33 + postcss.config.js | 6 + public/.htaccess | 25 + public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 3 + resources/js/Components/MyComponent.vue | 42 + resources/js/app.js | 21 + resources/js/bootstrap.js | 4 + resources/views/about-us.blade.php | 16 + resources/views/article.blade.php | 28 + resources/views/articles/create.blade.php | 55 + resources/views/articles/edit.blade.php | 55 + resources/views/articles/index.blade.php | 56 + resources/views/articles/show.blade.php | 1 + .../views/auth/confirm-password.blade.php | 27 + .../views/auth/forgot-password.blade.php | 25 + resources/views/auth/login.blade.php | 47 + resources/views/auth/register.blade.php | 52 + resources/views/auth/reset-password.blade.php | 39 + resources/views/auth/verify-email.blade.php | 31 + resources/views/categories/create.blade.php | 29 + resources/views/categories/edit.blade.php | 29 + resources/views/categories/index.blade.php | 48 + resources/views/categories/show.blade.php | 1 + .../components/application-logo.blade.php | 3 + .../components/auth-session-status.blade.php | 7 + .../views/components/danger-button.blade.php | 3 + .../views/components/dropdown-link.blade.php | 1 + resources/views/components/dropdown.blade.php | 35 + .../views/components/input-error.blade.php | 9 + .../views/components/input-label.blade.php | 5 + resources/views/components/modal.blade.php | 78 + resources/views/components/nav-link.blade.php | 11 + .../views/components/primary-button.blade.php | 3 + .../components/responsive-nav-link.blade.php | 11 + .../components/secondary-button.blade.php | 3 + .../views/components/select-input.blade.php | 15 + .../views/components/text-area.blade.php | 3 + .../views/components/text-input.blade.php | 3 + resources/views/dashboard.blade.php | 37 + resources/views/layouts/app.blade.php | 36 + resources/views/layouts/guest.blade.php | 30 + resources/views/layouts/navigation.blade.php | 131 + resources/views/partials/footer.blade.php | 1 + resources/views/profile/edit.blade.php | 29 + .../partials/delete-user-form.blade.php | 55 + .../partials/update-password-form.blade.php | 48 + .../update-profile-information-form.blade.php | 64 + resources/views/tags/create.blade.php | 29 + resources/views/tags/edit.blade.php | 30 + resources/views/tags/index.blade.php | 46 + routes/auth.php | 59 + routes/console.php | 8 + routes/web.php | 40 + storage/app/private/.gitignore | 2 + storage/app/public/articles/1002-200x300.jpg | Bin 0 -> 7602 bytes storage/app/public/articles/1027-200x300.jpg | Bin 0 -> 7055 bytes storage/app/public/articles/237-200x300.jpg | Bin 0 -> 10839 bytes storage/app/public/articles/290-200x300.jpg | Bin 0 -> 9617 bytes storage/app/public/articles/362-200x300.jpg | Bin 0 -> 9465 bytes storage/app/public/articles/37-200x300.jpg | Bin 0 -> 9189 bytes storage/app/public/articles/58-200x300.jpg | Bin 0 -> 11045 bytes storage/app/public/articles/611-200x300.jpg | Bin 0 -> 10137 bytes storage/app/public/articles/727-200x300.jpg | Bin 0 -> 7151 bytes storage/app/public/articles/73-200x300.jpg | Bin 0 -> 6912 bytes storage/app/public/articles/819-200x300.jpg | Bin 0 -> 12446 bytes storage/app/public/articles/980-200x300.jpg | Bin 0 -> 11028 bytes storage/app/public/articles/996-200x300.jpg | Bin 0 -> 5561 bytes storage/debugbar/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tailwind.config.js | 21 + tests/Feature/Auth/AuthenticationTest.php | 41 + tests/Feature/Auth/EmailVerificationTest.php | 46 + .../Feature/Auth/PasswordConfirmationTest.php | 32 + tests/Feature/Auth/PasswordResetTest.php | 60 + tests/Feature/Auth/PasswordUpdateTest.php | 40 + tests/Feature/Auth/RegistrationTest.php | 19 + tests/Feature/ExampleTest.php | 7 + tests/Feature/ProfileTest.php | 85 + tests/Pest.php | 47 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 5 + vite.config.js | 19 + 161 files changed, 19077 insertions(+), 66 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 app/Http/Controllers/ArticleController.php create mode 100644 app/Http/Controllers/Auth/AuthenticatedSessionController.php create mode 100644 app/Http/Controllers/Auth/ConfirmablePasswordController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationNotificationController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationPromptController.php create mode 100644 app/Http/Controllers/Auth/NewPasswordController.php create mode 100644 app/Http/Controllers/Auth/PasswordController.php create mode 100644 app/Http/Controllers/Auth/PasswordResetLinkController.php create mode 100644 app/Http/Controllers/Auth/RegisteredUserController.php create mode 100644 app/Http/Controllers/Auth/VerifyEmailController.php create mode 100644 app/Http/Controllers/CategoryController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/DashboardController.php create mode 100644 app/Http/Controllers/ProfileController.php create mode 100644 app/Http/Controllers/TagController.php create mode 100644 app/Http/Requests/Auth/LoginRequest.php create mode 100644 app/Http/Requests/ProfileUpdateRequest.php create mode 100644 app/Http/Requests/StoreArticleRequest.php create mode 100644 app/Http/Requests/StoreCategoryRequest.php create mode 100644 app/Http/Requests/StoreTagRequest.php create mode 100644 app/Models/Article.php create mode 100644 app/Models/Category.php create mode 100644 app/Models/Tag.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/View/Components/AppLayout.php create mode 100644 app/View/Components/GuestLayout.php create mode 100644 app/View/Components/SelectInput.php create mode 100644 app/View/Components/TextArea.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/debugbar.php create mode 100644 config/filesystems.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/ArticleFactory.php create mode 100644 database/factories/CategoryFactory.php create mode 100644 database/factories/TagFactory.php create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2025_08_13_002141_create_categories_table.php create mode 100644 database/migrations/2025_08_13_002204_create_tags_table.php create mode 100644 database/migrations/2025_08_13_002224_create_articles_table.php create mode 100644 database/migrations/2025_08_13_020706_create_article_tag_table.php create mode 100644 database/seeders/ArticleSeeder.php create mode 100644 database/seeders/CategorySeeder.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/TagSeeder.php create mode 100644 docker-compose.yml create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 postcss.config.js create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/Components/MyComponent.vue create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/about-us.blade.php create mode 100644 resources/views/article.blade.php create mode 100644 resources/views/articles/create.blade.php create mode 100644 resources/views/articles/edit.blade.php create mode 100644 resources/views/articles/index.blade.php create mode 100644 resources/views/articles/show.blade.php create mode 100644 resources/views/auth/confirm-password.blade.php create mode 100644 resources/views/auth/forgot-password.blade.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/reset-password.blade.php create mode 100644 resources/views/auth/verify-email.blade.php create mode 100644 resources/views/categories/create.blade.php create mode 100644 resources/views/categories/edit.blade.php create mode 100644 resources/views/categories/index.blade.php create mode 100644 resources/views/categories/show.blade.php create mode 100644 resources/views/components/application-logo.blade.php create mode 100644 resources/views/components/auth-session-status.blade.php create mode 100644 resources/views/components/danger-button.blade.php create mode 100644 resources/views/components/dropdown-link.blade.php create mode 100644 resources/views/components/dropdown.blade.php create mode 100644 resources/views/components/input-error.blade.php create mode 100644 resources/views/components/input-label.blade.php create mode 100644 resources/views/components/modal.blade.php create mode 100644 resources/views/components/nav-link.blade.php create mode 100644 resources/views/components/primary-button.blade.php create mode 100644 resources/views/components/responsive-nav-link.blade.php create mode 100644 resources/views/components/secondary-button.blade.php create mode 100644 resources/views/components/select-input.blade.php create mode 100644 resources/views/components/text-area.blade.php create mode 100644 resources/views/components/text-input.blade.php create mode 100644 resources/views/dashboard.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/guest.blade.php create mode 100644 resources/views/layouts/navigation.blade.php create mode 100644 resources/views/partials/footer.blade.php create mode 100644 resources/views/profile/edit.blade.php create mode 100644 resources/views/profile/partials/delete-user-form.blade.php create mode 100644 resources/views/profile/partials/update-password-form.blade.php create mode 100644 resources/views/profile/partials/update-profile-information-form.blade.php create mode 100644 resources/views/tags/create.blade.php create mode 100644 resources/views/tags/edit.blade.php create mode 100644 resources/views/tags/index.blade.php create mode 100644 routes/auth.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/articles/1002-200x300.jpg create mode 100644 storage/app/public/articles/1027-200x300.jpg create mode 100644 storage/app/public/articles/237-200x300.jpg create mode 100644 storage/app/public/articles/290-200x300.jpg create mode 100644 storage/app/public/articles/362-200x300.jpg create mode 100644 storage/app/public/articles/37-200x300.jpg create mode 100644 storage/app/public/articles/58-200x300.jpg create mode 100644 storage/app/public/articles/611-200x300.jpg create mode 100644 storage/app/public/articles/727-200x300.jpg create mode 100644 storage/app/public/articles/73-200x300.jpg create mode 100644 storage/app/public/articles/819-200x300.jpg create mode 100644 storage/app/public/articles/980-200x300.jpg create mode 100644 storage/app/public/articles/996-200x300.jpg create mode 100644 storage/debugbar/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tailwind.config.js create mode 100644 tests/Feature/Auth/AuthenticationTest.php create mode 100644 tests/Feature/Auth/EmailVerificationTest.php create mode 100644 tests/Feature/Auth/PasswordConfirmationTest.php create mode 100644 tests/Feature/Auth/PasswordResetTest.php create mode 100644 tests/Feature/Auth/PasswordUpdateTest.php create mode 100644 tests/Feature/Auth/RegistrationTest.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/Feature/ProfileTest.php create mode 100644 tests/Pest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..8f0de65c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..f973e2ab --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=beginner_level_challange +DB_USERNAME=root +DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fcb21d39 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b71b1ea3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/README.md b/README.md index b77ae4c1..75c347a8 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,61 @@ -# Laravel Roadmap: Beginner Level Challenge +

Laravel Logo

-This is a task for the **Beginner Level** of the [Laravel Roadmap](https://laraveldaily.com/roadmap-learning-path), with the goal to implement as many of its topics as possible. +

+Build Status +Total Downloads +Latest Stable Version +License +

-This repository is intentionally empty, with only a Readme file. Your task if to submit a Pull Request with your version of implementing the task, and your PR may be reviewed by someone on our team, or other volunteers. +## About Laravel -## The Task: Simple Personal Blog +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: -You need to create a personal blog with just three pages: +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). -- Homepage: List of articles -- Article page -- Some static text page like "About me" +Laravel is accessible, powerful, and provides tools required for large, robust applications. +## Learning Laravel -Also, there should be a Login mechanism (but no Register) for the author to write articles: +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. -- Manage (meaning, create/update/delete) categories -- Manage tags -- Manage articles -- For Auth Starter Kit, use [Laravel Breeze](https://github.com/laravel/breeze) (Tailwind) or your preferred starter kit: the design is irrelevant for accomplishing the task +You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. -**DB Structure:** +## Laravel Sponsors -- Article has title (required), full text (required) and image to upload (optional) -- Article may have only one category, but may have multiple tags +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). +### Premium Partners ------ +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** -## Features to implement +## Contributing -Here's the list of Laravel features you need to try to implement in your code: +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). -**Routing and Controllers: Basics** +## Code of Conduct -- Callback Functions and Route::view() -- Routing to a Single Controller Method -- Route Parameters -- Route Naming -- Route Groups +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). +## Security Vulnerabilities -**Blade Basics** +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. -- Displaying Variables in Blade -- Blade If-Else and Loop Structures -- Blade Loops -- Layout: @include, @extends, @section, @yield -- Blade Components +## License - -**Auth Basics** - -- Default Auth Model and Access its Fields from Anywhere -- Check Auth in Controller / Blade -- Auth Middleware - - -**Database Basics** - -- Database Migrations -- Basic Eloquent Model and MVC: Controller -> Model -> View -- Eloquent Relationships: belongsTo / hasMany / belongsToMany -- Eager Loading and N+1 Query Problem - - -**Full Simple CRUD** - -- Route Resource and Resourceful Controllers -- Forms, Validation and Form Requests -- File Uploads and Storage Folder Basics -- Table Pagination - - ------ - -## Example Solutions - -If you need help, or you want to compare your version with our simple version, here are two public repositories with the solution: - -- [Laravel Roadmap Beginner: Breeze Starter Kit](https://github.com/LaravelDaily/Laravel-Roadmap-Beginner-Blog-Breeze) -- [Laravel Roadmap Beginner: Laravel Daily Starter Kit](https://github.com/LaravelDaily/Laravel-Roadmap-Beginner-Blog-Starter-Kit) - - -**Notice**: please look at those repositories only AFTER you've accomplished the task yourself, or if you're confident about your Laravel beginner skills and you think you don't need to practice this task. +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Http/Controllers/ArticleController.php b/app/Http/Controllers/ArticleController.php new file mode 100644 index 00000000..b4f11a43 --- /dev/null +++ b/app/Http/Controllers/ArticleController.php @@ -0,0 +1,100 @@ +paginate(10); + + return view('articles.index', compact('articles')); + } + + public function show(Article $article) + { + return view('articles.index', compact('article')); + } + + public function create() + { + $categories = Category::all(); + + $tags = Tag::all(); + + return view('articles.create', compact('categories','tags')); + } + + public function edit(Article $article) + { + $categories = Category::all(); + + $tags = Tag::all(); + + return view('articles.edit', compact('categories','tags', 'article')); + } + + public function store(StoreArticleRequest $request) + { + // Store new image file + if($request->hasFile('photo')) { + $photo = $request->file('photo')->store(options: 'articles'); + } + + // Create new article record and assign to $article + $article = Article::create([ + 'title' => $request->validated('title'), + 'category_id' => $request->validated('category'), + 'article' => $request->validated('article'), + 'photo' => $photo ?? null, + ]); + + // Sync pivot table relationship + $article->tags()->sync($request->validated('tags')); + + return to_route('articles.index'); + } + + public function update(Article $article, StoreArticleRequest $request) + { + // Store new image file + if($request->hasFile('photo')) { + $photo = $request->file('photo')->store(options: 'articles'); + } + + // Delete old file if it exists + if($article->photo !== null && Storage::disk('articles')->exists($article->photo)) { + Storage::disk('articles')->delete($article->photo); + } + + $article->update([ + 'title' => $request->validated('title'), + 'category_id' => $request->validated('category'), + 'article' => $request->validated('article'), + 'photo' => $photo ?? null, + ]); + + // Sync pivot table relationship + $article->tags()->sync($request->validated('tags')); + + return to_route('articles.index'); + } + + public function destroy(Article $article) + { + // Delete photo file if it exists + if($article->photo !== null && Storage::disk('articles')->exists($article->photo)) { + Storage::disk('articles')->delete($article->photo); + } + + $article->delete(); + + return to_route('articles.index'); + } +} diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 00000000..613bcd9d --- /dev/null +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,47 @@ +authenticate(); + + $request->session()->regenerate(); + + return redirect()->intended(route('dashboard', absolute: false)); + } + + /** + * Destroy an authenticated session. + */ + public function destroy(Request $request): RedirectResponse + { + Auth::guard('web')->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 00000000..712394a5 --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,40 @@ +validate([ + 'email' => $request->user()->email, + 'password' => $request->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + $request->session()->put('auth.password_confirmed_at', time()); + + return redirect()->intended(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 00000000..f64fa9ba --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,24 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false)); + } + + $request->user()->sendEmailVerificationNotification(); + + return back()->with('status', 'verification-link-sent'); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 00000000..ee3cb6fa --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,21 @@ +user()->hasVerifiedEmail() + ? redirect()->intended(route('dashboard', absolute: false)) + : view('auth.verify-email'); + } +} diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 00000000..e8368bd2 --- /dev/null +++ b/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,62 @@ + $request]); + } + + /** + * Handle an incoming new password request. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request): RedirectResponse + { + $request->validate([ + 'token' => ['required'], + 'email' => ['required', 'email'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function (User $user) use ($request) { + $user->forceFill([ + 'password' => Hash::make($request->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $status == Password::PASSWORD_RESET + ? redirect()->route('login')->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 00000000..69164091 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -0,0 +1,29 @@ +validateWithBag('updatePassword', [ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + return back()->with('status', 'password-updated'); + } +} diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 00000000..bf1ebfa7 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,44 @@ +validate([ + 'email' => ['required', 'email'], + ]); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $status = Password::sendResetLink( + $request->only('email') + ); + + return $status == Password::RESET_LINK_SENT + ? back()->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 00000000..0739e2e8 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,50 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + event(new Registered($user)); + + Auth::login($user); + + return redirect(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 00000000..784765e3 --- /dev/null +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,27 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } +} diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php new file mode 100644 index 00000000..61f61a60 --- /dev/null +++ b/app/Http/Controllers/CategoryController.php @@ -0,0 +1,53 @@ +validated()); + + return to_route('categories.index'); + } + + public function update(Category $category, StoreCategoryRequest $request) + { + $category->update($request->validated()); + + return to_route('categories.index'); + } + + public function destroy(Category $category) + { + $category->delete(); + + return to_route('categories.index'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..8677cd5c --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +paginate(12); + + return view('dashboard', compact('articles')); + } + + public function article(Article $article) + { + $article->with('category','tags')->get(); + + return view('article', compact('article')); + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100644 index 00000000..a48eb8d8 --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,60 @@ + $request->user(), + ]); + } + + /** + * Update the user's profile information. + */ + public function update(ProfileUpdateRequest $request): RedirectResponse + { + $request->user()->fill($request->validated()); + + if ($request->user()->isDirty('email')) { + $request->user()->email_verified_at = null; + } + + $request->user()->save(); + + return Redirect::route('profile.edit')->with('status', 'profile-updated'); + } + + /** + * Delete the user's account. + */ + public function destroy(Request $request): RedirectResponse + { + $request->validateWithBag('userDeletion', [ + 'password' => ['required', 'current_password'], + ]); + + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return Redirect::to('/'); + } +} diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php new file mode 100644 index 00000000..576e67e5 --- /dev/null +++ b/app/Http/Controllers/TagController.php @@ -0,0 +1,47 @@ +validated()); + + return to_route('tags.index'); + } + + public function update(Tag $tag, StoreTagRequest $request) + { + $tag->update($request->validated()); + + return to_route('tags.index'); + } + + public function destroy(Tag $tag) + { + $tag->delete(); + + return to_route('tags.index'); + } +} diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php new file mode 100644 index 00000000..25746424 --- /dev/null +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -0,0 +1,85 @@ +|string> + */ + public function rules(): array + { + return [ + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]; + } + + /** + * Attempt to authenticate the request's credentials. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function authenticate(): void + { + $this->ensureIsNotRateLimited(); + + if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + } + + /** + * Ensure the login request is not rate limited. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function ensureIsNotRateLimited(): void + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout($this)); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the rate limiting throttle key for the request. + */ + public function throttleKey(): string + { + return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip()); + } +} diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php new file mode 100644 index 00000000..3622a8f3 --- /dev/null +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'lowercase', + 'email', + 'max:255', + Rule::unique(User::class)->ignore($this->user()->id), + ], + ]; + } +} diff --git a/app/Http/Requests/StoreArticleRequest.php b/app/Http/Requests/StoreArticleRequest.php new file mode 100644 index 00000000..23b095d1 --- /dev/null +++ b/app/Http/Requests/StoreArticleRequest.php @@ -0,0 +1,33 @@ +|string> + */ + public function rules(): array + { + return [ + 'title' => ['required'], + 'photo' => ['nullable','image','mimes:jpeg,png,jpg,gif','max:2048'], + 'category' => ['required'], + 'tags' => ['nullable'], + 'article' => ['required'], + ]; + } +} diff --git a/app/Http/Requests/StoreCategoryRequest.php b/app/Http/Requests/StoreCategoryRequest.php new file mode 100644 index 00000000..a965f0ad --- /dev/null +++ b/app/Http/Requests/StoreCategoryRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required'], + ]; + } +} diff --git a/app/Http/Requests/StoreTagRequest.php b/app/Http/Requests/StoreTagRequest.php new file mode 100644 index 00000000..934c0f74 --- /dev/null +++ b/app/Http/Requests/StoreTagRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required'], + ]; + } +} diff --git a/app/Models/Article.php b/app/Models/Article.php new file mode 100644 index 00000000..75991566 --- /dev/null +++ b/app/Models/Article.php @@ -0,0 +1,32 @@ + */ + use HasFactory; + + protected $fillable = [ + 'category_id', + 'title', + 'article', + 'photo', + ]; + + public function category(): BelongsTo + { + return $this->belongsTo(Category::class); + } + + public function tags(): belongsToMany + { + return $this->belongsToMany(Tag::class); + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php new file mode 100644 index 00000000..7537d504 --- /dev/null +++ b/app/Models/Category.php @@ -0,0 +1,23 @@ + */ + use HasFactory; + + protected $fillable = [ + 'name', + ]; + + public function articles(): HasMany + { + return $this->hasMany(Article::class); + } +} diff --git a/app/Models/Tag.php b/app/Models/Tag.php new file mode 100644 index 00000000..6fbfcd31 --- /dev/null +++ b/app/Models/Tag.php @@ -0,0 +1,22 @@ + */ + use HasFactory; + + protected $fillable = [ + 'name' + ]; + + public function articles(): BelongsToMany + { + return $this->belongsToMany(Article::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 00000000..749c7b77 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,48 @@ + */ + use HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..452e6b65 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +options = $options; + $this->selected = $selected; + $this->name = $name; + $this->id = $id ?? $name; // Use name as id if not provided + } + + public function render(): View|Closure|string + { + return view('components.select-input'); + } +} diff --git a/app/View/Components/TextArea.php b/app/View/Components/TextArea.php new file mode 100644 index 00000000..5cb17fd5 --- /dev/null +++ b/app/View/Components/TextArea.php @@ -0,0 +1,31 @@ +value = $value; + $this->name = $name; + $this->id = $id ?? $name; // Use name as id if not provided + } + + public function render(): View|Closure|string + { + return view('components.text-area'); + } +} diff --git a/artisan b/artisan new file mode 100755 index 00000000..c35e31d6 --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 00000000..c1832766 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,18 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware): void { + // + }) + ->withExceptions(function (Exceptions $exceptions): void { + // + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 00000000..38b258d1 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,5 @@ +=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": "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/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "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" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "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": "2025-08-10T19:31:58+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.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+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.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "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.3" + }, + "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": "2025-03-27T13:37:11+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "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.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-03-27T13:27:01+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "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.1" + }, + "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": "2025-03-27T12:30:47+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "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.4" + }, + "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": "2025-02-03T10:55:03+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.23.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "2a0e9331a0db904236143fe915c281ff4be274a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/2a0e9331a0db904236143fe915c281ff4be274a3", + "reference": "2a0e9331a0db904236143fe915c281ff4be274a3", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "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.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.7", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "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.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/polyfill-php85": "^1.31", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "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.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^10.0.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "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.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "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.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "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": "2025-08-12T17:35:05+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "86a8b692e8661d0fb308cec64f3d176821323077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/86a8b692e8661d0fb308cec64f3d176821323077", + "reference": "86a8b692e8661d0fb308cec64f3d176821323077", + "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|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "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.6" + }, + "time": "2025-07-07T14:17:42+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "2025-03-19T13:51:03+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.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|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.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.1" + }, + "time": "2025-01-27T14:24:01+00:00" + }, + { + "name": "league/commonmark", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "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/process": "^5.4 | ^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 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-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": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", + "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|^2", + "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|^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.30.0" + }, + "time": "2025-06-25T13:29:59+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.30.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", + "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.30.0" + }, + "time": "2025-05-21T10:34:19+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.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.5", + "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.5.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:40:02+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "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.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-12-08T08:18:47+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", + "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", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "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.9.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-03-24T10:02:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.10.2", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", + "reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^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.75.0", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.17", + "phpunit/phpunit": "^10.5.46", + "squizlabs/php_codesniffer": "^3.13.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "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/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/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": "2025-08-02T09:36:06+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.8", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "reference": "c930ca4e3cf4f17dcfb03037703679d2396d2ede", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/tester": "^2.5", + "phpstan/phpstan-nette": "^2.0@stable", + "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": { + "psr-4": { + "Nette\\": "src" + }, + "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.8" + }, + "time": "2025-08-06T21:43:34+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "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.6.0" + }, + "time": "2025-07-27T20:03:57+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.2.6" + }, + "require-dev": { + "illuminate/console": "^11.44.7", + "laravel/pint": "^1.22.0", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.2", + "phpstan/phpstan": "^1.12.25", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.2.6", + "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.3.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-05-08T08:14:37+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/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": "psy/psysh", + "version": "v0.12.10", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "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": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "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" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" + }, + "time": "2025-08-04T12:39:37+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.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "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.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "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.9.0" + }, + "time": "2025-06-25T14:20:11+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "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.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/console", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1", + "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2" + }, + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-30T17:13:41+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "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.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "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/console": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-07T08:17:57+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "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.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-22T09:11:45+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6877c122b3a6cc3695849622720054f6e6fa5fa6", + "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:47:49+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6ecc895559ec0097e221ed2fd5eb44d5fede083c", + "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c", + "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": "^7.3", + "symfony/http-foundation": "^7.3", + "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.12" + }, + "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.12" + }, + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-31T10:45:04+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d43e84d9522345f96ad6283d5dfccc8c1cfc299b", + "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b", + "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": "^7.2", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:36:08+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.32.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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.32.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.32.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.32.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "000df7860439609837bbe28670b0be15783b7fbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", + "reference": "000df7860439609837bbe28670b0be15783b7fbf", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.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": "2025-02-20T12:04:08+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd", + "reference": "6fedf31ce4e3648f4ff5ca58bfd53127d38f05fd", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "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.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.32.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": "2025-05-02T08:40:52+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.32.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.32.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.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "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.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-17T09:11:12+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:36:08+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "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": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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": "2025-04-25T09:37:31+00:00" + }, + { + "name": "symfony/string", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca", + "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:47:49+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/81b48f4daa96272efcce9c7a6c4b58e629df3c90", + "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "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": "^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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-30T17:31:46+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "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.6.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-27T08:32:26+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", + "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.3.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": "2025-06-27T19:55:54+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "53205bea27450dc5c65377518b3275e126d45e75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/53205bea27450dc5c65377518b3275e126d45e75", + "reference": "53205bea27450dc5c65377518b3275e126d45e75", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "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.12" + }, + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-29T20:02:46+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "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.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "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.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "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": "https://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.3" + }, + "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": "2024-11-21T01:49:47+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": "barryvdh/laravel-debugbar", + "version": "v3.16.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23", + "reference": "f265cf5e38577d42311f1a90d619bcd3740bea23", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.2.0", + "symfony/finder": "^6|^7" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.16-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "dev", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-07-14T11:56:43+00:00" + }, + { + "name": "brianium/paratest", + "version": "v7.8.3", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "a585c346ddf1bec22e51e20b5387607905604a71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/a585c346ddf1bec22e51e20b5387607905604a71", + "reference": "a585c346ddf1bec22e51e20b5387607905604a71", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.1.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^11.0.9 || ^12.0.4", + "phpunit/php-file-iterator": "^5.1.0 || ^6", + "phpunit/php-timer": "^7.0.1 || ^8", + "phpunit/phpunit": "^11.5.11 || ^12.0.6", + "sebastian/environment": "^7.2.0 || ^8", + "symfony/console": "^6.4.17 || ^7.2.1", + "symfony/process": "^6.4.19 || ^7.2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.6", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", + "squizlabs/php_codesniffer": "^3.11.3", + "symfony/filesystem": "^6.4.13 || ^7.2.0" + }, + "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.8.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2025-03-05T08:29:11+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "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.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "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.24.1" + }, + "time": "2024-11-21T13:46:39+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.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "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.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.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.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "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.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, + { + "name": "laravel/breeze", + "version": "v2.3.8", + "source": { + "type": "git", + "url": "https://github.com/laravel/breeze.git", + "reference": "1a29c5792818bd4cddf70b5f743a227e02fbcfcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/breeze/zipball/1a29c5792818bd4cddf70b5f743a227e02fbcfcd", + "reference": "1a29c5792818bd4cddf70b5f743a227e02fbcfcd", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0|^12.0", + "illuminate/filesystem": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", + "illuminate/validation": "^11.0|^12.0", + "php": "^8.2.0", + "symfony/console": "^7.0" + }, + "require-dev": { + "laravel/framework": "^11.0|^12.0", + "orchestra/testbench-core": "^9.0|^10.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Breeze\\BreezeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Breeze\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/breeze/issues", + "source": "https://github.com/laravel/breeze" + }, + "time": "2025-07-18T18:49:59+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-06-05T13:55:57+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.24.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/0345f3b05f136801af8c339f9d16ef29e6b4df8a", + "reference": "0345f3b05f136801af8c339f9d16ef29e6b4df8a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.82.2", + "illuminate/view": "^11.45.1", + "larastan/larastan": "^3.5.0", + "laravel-zero/framework": "^11.45.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3.1", + "pestphp/pest": "^2.36.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "files": [ + "overrides/Runner/Parallel/ProcessFactory.php" + ], + "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": "2025-07-10T18:09:32+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.44.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "a09097bd2a8a38e23ac472fa6a6cf5b0d1c1d3fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/a09097bd2a8a38e23ac472fa6a6cf5b0d1c1d3fe", + "reference": "a09097bd2a8a38e23ac472fa6a6cf5b0d1c1d3fe", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-07-04T16:17:06+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.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "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.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.8.2", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", + "php": "^8.2.0", + "symfony/console": "^7.3.0" + }, + "conflict": { + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", + "laravel/tinker": "^2.10.1", + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.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", + "dev", + "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": "2025-06-25T02:12:12+00:00" + }, + { + "name": "pestphp/pest", + "version": "v3.8.2", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/c6244a8712968dbac88eb998e7ff3b5caa556b0d", + "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.8.3", + "nunomaduro/collision": "^8.8.0", + "nunomaduro/termwind": "^2.3.0", + "pestphp/pest-plugin": "^3.0.0", + "pestphp/pest-plugin-arch": "^3.1.0", + "pestphp/pest-plugin-mutate": "^3.0.5", + "php": "^8.2.0", + "phpunit/phpunit": "^11.5.15" + }, + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">11.5.15", + "sebastian/exporter": "<6.0.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^3.4.0", + "pestphp/pest-plugin-type-coverage": "^3.5.0", + "symfony/process": "^7.2.5" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "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/v3.8.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-04-17T10:53:02+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.2" + }, + "conflict": { + "pestphp/pest": "<3.0.0" + }, + "require-dev": { + "composer/composer": "^2.7.9", + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.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/v3.0.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": "2024-09-08T23:21:41+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" + }, + "require-dev": { + "pestphp/pest": "^3.8.1", + "pestphp/pest-dev-tools": "^3.4.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/v3.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-04-16T22:59:48+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "6801be82fd92b96e82dd72e563e5674b1ce365fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/6801be82fd92b96e82dd72e563e5674b1ce365fc", + "reference": "6801be82fd92b96e82dd72e563e5674b1ce365fc", + "shasum": "" + }, + "require": { + "laravel/framework": "^11.39.1|^12.9.2", + "pestphp/pest": "^3.8.2", + "php": "^8.2.0" + }, + "require-dev": { + "laravel/dusk": "^8.2.13|dev-develop", + "orchestra/testbench": "^9.9.0|^10.2.1", + "pestphp/pest-dev-tools": "^3.4.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "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/v3.2.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-04-21T07:40:53+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v3.0.5", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.2.0", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^3.0.8", + "pestphp/pest-dev-tools": "^3.0.0", + "pestphp/pest-plugin-type-coverage": "^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-09-22T07:54:40+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-debugbar/php-debugbar", + "version": "v2.2.4", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "reference": "3146d04671f51f69ffec2a4207ac3bdcf13a9f35", + "shasum": "" + }, + "require": { + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "replace": { + "maximebf/debugbar": "self.version" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debug", + "debug bar", + "debugbar", + "dev" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.4" + }, + "time": "2025-07-22T14:01:30+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.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "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|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "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.6.2" + }, + "time": "2025-04-13T19:20:35+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "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.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "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/2.2.0" + }, + "time": "2025-07-13T07:04:09+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "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": "11.0.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/show" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-06-18T08:56:18+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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", + "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/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "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", + "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", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.15", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", + "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.2", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.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/11.5.15" + }, + "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": "2025-03-23T16:02:11+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "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": "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", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-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/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-08-10T08:07:46+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "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" + }, + { + "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/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-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/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "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" + }, + { + "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/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:10:34+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "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", + "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", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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", + "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", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/b8d7d868da9eb0919e99c8830431ea087d6aae30", + "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "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.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:47:49+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.5", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "cf6fb197b676ba716837c886baca842e4db29005" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", + "reference": "cf6fb197b676ba716837c886baca842e4db29005", + "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 || ^12.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.5" + }, + "time": "2025-04-20T20:23:40+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" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 00000000..423eed59 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 00000000..7d1eb0de --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 00000000..c2d927d7 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,108 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 00000000..5b318f58 --- /dev/null +++ b/config/database.php @@ -0,0 +1,174 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 00000000..8ee60a60 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,338 @@ + env('DEBUGBAR_ENABLED', null), + 'hide_empty_tabs' => env('DEBUGBAR_HIDE_EMPTY_TABS', true), // Hide tabs until they have content + 'except' => [ + 'telescope*', + 'horizon*', + ], + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | Debugbar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + | Warning: Enabling storage.open will allow everyone to access previous + | request, do not enable open storage in publicly available environments! + | Specify a callback if you want to limit based on IP or authentication. + | Leaving it to null will allow localhost only. + */ + 'storage' => [ + 'enabled' => env('DEBUGBAR_STORAGE_ENABLED', true), + 'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback. + 'driver' => env('DEBUGBAR_STORAGE_DRIVER', 'file'), // redis, file, pdo, socket, custom + 'path' => env('DEBUGBAR_STORAGE_PATH', storage_path('debugbar')), // For file driver + 'connection' => env('DEBUGBAR_STORAGE_CONNECTION', null), // Leave null for default connection (Redis/PDO) + 'provider' => env('DEBUGBAR_STORAGE_PROVIDER', ''), // Instance of StorageInterface for custom driver + 'hostname' => env('DEBUGBAR_STORAGE_HOSTNAME', '127.0.0.1'), // Hostname to use with the "socket" driver + 'port' => env('DEBUGBAR_STORAGE_PORT', 2304), // Port to use with the "socket" driver + ], + + /* + |-------------------------------------------------------------------------- + | Editor + |-------------------------------------------------------------------------- + | + | Choose your preferred editor to use when clicking file name. + | + | Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote", + | "vscode-insiders-remote", "vscodium", "textmate", "emacs", + | "sublime", "atom", "nova", "macvim", "idea", "netbeans", + | "xdebug", "espresso" + | + */ + + 'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'), + + /* + |-------------------------------------------------------------------------- + | Remote Path Mapping + |-------------------------------------------------------------------------- + | + | If you are using a remote dev server, like Laravel Homestead, Docker, or + | even a remote VPS, it will be necessary to specify your path mapping. + | + | Leaving one, or both of these, empty or null will not trigger the remote + | URL changes and Debugbar will treat your editor links as local files. + | + | "remote_sites_path" is an absolute base path for your sites or projects + | in Homestead, Vagrant, Docker, or another remote development server. + | + | Example value: "/home/vagrant/Code" + | + | "local_sites_path" is an absolute base path for your sites or projects + | on your local computer where your IDE or code editor is running on. + | + | Example values: "/Users//Code", "C:\Users\\Documents\Code" + | + */ + + 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'), + 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')), + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => env('DEBUGBAR_INCLUDE_VENDORS', true), + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + | + | Note for your request to be identified as ajax requests they must either send the header + | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. + | + | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar. + | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading. + | + | You can defer loading the dataset, so it will be loaded with ajax after the request is done. (Experimental) + */ + + 'capture_ajax' => env('DEBUGBAR_CAPTURE_AJAX', true), + 'add_ajax_timing' => env('DEBUGBAR_ADD_AJAX_TIMING', false), + 'ajax_handler_auto_show' => env('DEBUGBAR_AJAX_HANDLER_AUTO_SHOW', true), + 'ajax_handler_enable_tab' => env('DEBUGBAR_AJAX_HANDLER_ENABLE_TAB', true), + 'defer_datasets' => env('DEBUGBAR_DEFER_DATASETS', false), + /* + |-------------------------------------------------------------------------- + | Custom Error Handler for Deprecated warnings + |-------------------------------------------------------------------------- + | + | When enabled, the Debugbar shows deprecated warnings for Symfony components + | in the Messages tab. + | + */ + 'error_handler' => env('DEBUGBAR_ERROR_HANDLER', false), + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => env('DEBUGBAR_CLOCKWORK', false), + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => env('DEBUGBAR_COLLECTORS_PHPINFO', false), // Php version + 'messages' => env('DEBUGBAR_COLLECTORS_MESSAGES', true), // Messages + 'time' => env('DEBUGBAR_COLLECTORS_TIME', true), // Time Datalogger + 'memory' => env('DEBUGBAR_COLLECTORS_MEMORY', true), // Memory usage + 'exceptions' => env('DEBUGBAR_COLLECTORS_EXCEPTIONS', true), // Exception displayer + 'log' => env('DEBUGBAR_COLLECTORS_LOG', true), // Logs from Monolog (merged in messages if enabled) + 'db' => env('DEBUGBAR_COLLECTORS_DB', true), // Show database (PDO) queries and bindings + 'views' => env('DEBUGBAR_COLLECTORS_VIEWS', true), // Views with their data + 'route' => env('DEBUGBAR_COLLECTORS_ROUTE', false), // Current route information + 'auth' => env('DEBUGBAR_COLLECTORS_AUTH', false), // Display Laravel authentication status + 'gate' => env('DEBUGBAR_COLLECTORS_GATE', true), // Display Laravel Gate checks + 'session' => env('DEBUGBAR_COLLECTORS_SESSION', false), // Display session data + 'symfony_request' => env('DEBUGBAR_COLLECTORS_SYMFONY_REQUEST', true), // Only one can be enabled.. + 'mail' => env('DEBUGBAR_COLLECTORS_MAIL', true), // Catch mail messages + 'laravel' => env('DEBUGBAR_COLLECTORS_LARAVEL', true), // Laravel version and environment + 'events' => env('DEBUGBAR_COLLECTORS_EVENTS', false), // All events fired + 'default_request' => env('DEBUGBAR_COLLECTORS_DEFAULT_REQUEST', false), // Regular or special Symfony request logger + 'logs' => env('DEBUGBAR_COLLECTORS_LOGS', false), // Add the latest log messages + 'files' => env('DEBUGBAR_COLLECTORS_FILES', false), // Show the included files + 'config' => env('DEBUGBAR_COLLECTORS_CONFIG', false), // Display config settings + 'cache' => env('DEBUGBAR_COLLECTORS_CACHE', false), // Display cache events + 'models' => env('DEBUGBAR_COLLECTORS_MODELS', true), // Display models + 'livewire' => env('DEBUGBAR_COLLECTORS_LIVEWIRE', true), // Display Livewire (when available) + 'jobs' => env('DEBUGBAR_COLLECTORS_JOBS', false), // Display dispatched jobs + 'pennant' => env('DEBUGBAR_COLLECTORS_PENNANT', false), // Display Pennant feature flags + ], + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => [ + 'time' => [ + 'memory_usage' => env('DEBUGBAR_OPTIONS_TIME_MEMORY_USAGE', false), // Calculated by subtracting memory start and end, it may be inaccurate + ], + 'messages' => [ + 'trace' => env('DEBUGBAR_OPTIONS_MESSAGES_TRACE', true), // Trace the origin of the debug message + 'capture_dumps' => env('DEBUGBAR_OPTIONS_MESSAGES_CAPTURE_DUMPS', false), // Capture laravel `dump();` as message + ], + 'memory' => [ + 'reset_peak' => env('DEBUGBAR_OPTIONS_MEMORY_RESET_PEAK', false), // run memory_reset_peak_usage before collecting + 'with_baseline' => env('DEBUGBAR_OPTIONS_MEMORY_WITH_BASELINE', false), // Set boot memory usage as memory peak baseline + 'precision' => (int) env('DEBUGBAR_OPTIONS_MEMORY_PRECISION', 0), // Memory rounding precision + ], + 'auth' => [ + 'show_name' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_NAME', true), // Also show the users name/email in the debugbar + 'show_guards' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_GUARDS', true), // Show the guards that are used + ], + 'gate' => [ + 'trace' => false, // Trace the origin of the Gate checks + ], + 'db' => [ + 'with_params' => env('DEBUGBAR_OPTIONS_WITH_PARAMS', true), // Render SQL with the parameters substituted + 'exclude_paths' => [ // Paths to exclude entirely from the collector + //'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries + ], + 'backtrace' => env('DEBUGBAR_OPTIONS_DB_BACKTRACE', true), // Use a backtrace to find the origin of the query in your files. + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'timeline' => env('DEBUGBAR_OPTIONS_DB_TIMELINE', false), // Add the queries to the timeline + 'duration_background' => env('DEBUGBAR_OPTIONS_DB_DURATION_BACKGROUND', true), // Show shaded background on each query relative to how long it took to execute. + 'explain' => [ // Show EXPLAIN output on queries + 'enabled' => env('DEBUGBAR_OPTIONS_DB_EXPLAIN_ENABLED', false), + ], + 'hints' => env('DEBUGBAR_OPTIONS_DB_HINTS', false), // Show hints for common mistakes + 'show_copy' => env('DEBUGBAR_OPTIONS_DB_SHOW_COPY', true), // Show copy button next to the query, + 'slow_threshold' => env('DEBUGBAR_OPTIONS_DB_SLOW_THRESHOLD', false), // Only track queries that last longer than this time in ms + 'memory_usage' => env('DEBUGBAR_OPTIONS_DB_MEMORY_USAGE', false), // Show queries memory usage + 'soft_limit' => (int) env('DEBUGBAR_OPTIONS_DB_SOFT_LIMIT', 100), // After the soft limit, no parameters/backtrace are captured + 'hard_limit' => (int) env('DEBUGBAR_OPTIONS_DB_HARD_LIMIT', 500), // After the hard limit, queries are ignored + ], + 'mail' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_MAIL_TIMELINE', true), // Add mails to the timeline + 'show_body' => env('DEBUGBAR_OPTIONS_MAIL_SHOW_BODY', true), + ], + 'views' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_VIEWS_TIMELINE', true), // Add the views to the timeline + 'data' => env('DEBUGBAR_OPTIONS_VIEWS_DATA', false), // True for all data, 'keys' for only names, false for no parameters. + 'group' => (int) env('DEBUGBAR_OPTIONS_VIEWS_GROUP', 50), // Group duplicate views. Pass value to auto-group, or true/false to force + 'inertia_pages' => env('DEBUGBAR_OPTIONS_VIEWS_INERTIA_PAGES', 'js/Pages'), // Path for Inertia views + 'exclude_paths' => [ // Add the paths which you don't want to appear in the views + 'vendor/filament' // Exclude Filament components by default + ], + ], + 'route' => [ + 'label' => env('DEBUGBAR_OPTIONS_ROUTE_LABEL', true), // Show complete route on bar + ], + 'session' => [ + 'hiddens' => [], // Hides sensitive values using array paths + ], + 'symfony_request' => [ + 'label' => env('DEBUGBAR_OPTIONS_SYMFONY_REQUEST_LABEL', true), // Show route on bar + 'hiddens' => [], // Hides sensitive values using array paths, example: request_request.password + ], + 'events' => [ + 'data' => env('DEBUGBAR_OPTIONS_EVENTS_DATA', false), // Collect events data, listeners + 'excluded' => [], // Example: ['eloquent.*', 'composing', Illuminate\Cache\Events\CacheHit::class] + ], + 'logs' => [ + 'file' => env('DEBUGBAR_OPTIONS_LOGS_FILE', null), + ], + 'cache' => [ + 'values' => env('DEBUGBAR_OPTIONS_CACHE_VALUES', true), // Collect cache values + ], + ], + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => env('DEBUGBAR_INJECT', true), + + /* + |-------------------------------------------------------------------------- + | Debugbar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by Debugbar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => env('DEBUGBAR_ROUTE_PREFIX', '_debugbar'), + + /* + |-------------------------------------------------------------------------- + | Debugbar route middleware + |-------------------------------------------------------------------------- + | + | Additional middleware to run on the Debugbar routes + */ + 'route_middleware' => [], + + /* + |-------------------------------------------------------------------------- + | Debugbar route domain + |-------------------------------------------------------------------------- + | + | By default Debugbar route served from the same domain that request served. + | To override default domain, specify it as a non-empty value. + */ + 'route_domain' => env('DEBUGBAR_ROUTE_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | Debugbar theme + |-------------------------------------------------------------------------- + | + | Switches between light and dark theme. If set to auto it will respect system preferences + | Possible values: auto, light, dark + */ + 'theme' => env('DEBUGBAR_THEME', 'auto'), + + /* + |-------------------------------------------------------------------------- + | Backtrace stack limit + |-------------------------------------------------------------------------- + | + | By default, the Debugbar limits the number of frames returned by the 'debug_backtrace()' function. + | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit. + */ + 'debug_backtrace_limit' => (int) env('DEBUGBAR_DEBUG_BACKTRACE_LIMIT', 50), +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 00000000..27d72196 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,96 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 'categories' => [ + 'driver' => 'local', + 'root' => storage_path('app/public/categories'), + 'url' => env('APP_URL').'/storage/categories', + 'visibility' => 'public', + 'throw' => false, + ], + + 'articles' => [ + 'driver' => 'local', + 'root' => storage_path('app/public/articles'), + 'url' => env('APP_URL').'/storage/articles', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 00000000..9e998a49 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 00000000..522b284b --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 00000000..116bd8d0 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,112 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 00000000..6182e4b9 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 00000000..f715097f --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/ArticleFactory.php b/database/factories/ArticleFactory.php new file mode 100644 index 00000000..0419bb41 --- /dev/null +++ b/database/factories/ArticleFactory.php @@ -0,0 +1,46 @@ + + */ +class ArticleFactory extends Factory +{ + protected $model = Article::class; + + public $images = [ + '1002-200x300.jpg', + '1027-200x300.jpg', + '237-200x300.jpg', + '290-200x300.jpg', + '362-200x300.jpg', + '37-200x300.jpg', + '58-200x300.jpg', + '611-200x300.jpg', + '727-200x300.jpg', + '73-200x300.jpg', + '819-200x300.jpg', + '980-200x300.jpg', + '996-200x300.jpg', + ]; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'category_id' => Category::factory(), + 'title' => fake()->sentence(5, true), + 'article' => fake()->paragraphs(3, true), + 'photo' => fake()->randomElement($this->images), + ]; + } +} diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php new file mode 100644 index 00000000..daa3e741 --- /dev/null +++ b/database/factories/CategoryFactory.php @@ -0,0 +1,50 @@ + + */ +class CategoryFactory extends Factory +{ + protected $model = Category::class; + + private array $categoryNames = [ + "Electronics", + "Fashion", + "Home & Garden", + "Books & Media", + "Sports & Outdoors", + "Beauty & Personal Care", + "Food & Beverages", + "Health & Wellness", + "Toys & Hobbies", + "Automotive", + "Baby Products", + "Pet Supplies", + "Office Supplies", + "Arts & Crafts", + "Music & Instruments", + "Travel", + "Services", + "Education", + "Software", + "Jewelry", + ]; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + //'name' => fake()->word(2), + 'name' => fake()->unique()->randomElement($this->categoryNames), + ]; + } +} diff --git a/database/factories/TagFactory.php b/database/factories/TagFactory.php new file mode 100644 index 00000000..c433b266 --- /dev/null +++ b/database/factories/TagFactory.php @@ -0,0 +1,39 @@ + + */ +class TagFactory extends Factory +{ + protected $model = Tag::class; + + private $tagNames = array( + "Content Marketing", + "SEO", + "Writing Tips", + "Blog Promotion", + "Audience Engagement", + "Social Media", + "Traffic Generation", + "Blogging Strategies", + "Monetization", + "Analytics" + ); + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + //'name' => fake()->words(2, true), + 'name' => fake()->unique()->randomElement($this->tagNames), + ]; + } +} diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 00000000..584104c9 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 00000000..05fb5d9e --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 00000000..b9c106be --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 00000000..425e7058 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2025_08_13_002141_create_categories_table.php b/database/migrations/2025_08_13_002141_create_categories_table.php new file mode 100644 index 00000000..b86b7b18 --- /dev/null +++ b/database/migrations/2025_08_13_002141_create_categories_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/database/migrations/2025_08_13_002204_create_tags_table.php b/database/migrations/2025_08_13_002204_create_tags_table.php new file mode 100644 index 00000000..38167d89 --- /dev/null +++ b/database/migrations/2025_08_13_002204_create_tags_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tags'); + } +}; diff --git a/database/migrations/2025_08_13_002224_create_articles_table.php b/database/migrations/2025_08_13_002224_create_articles_table.php new file mode 100644 index 00000000..6f97c915 --- /dev/null +++ b/database/migrations/2025_08_13_002224_create_articles_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('category_id')->constrained()->onDelete('cascade'); + $table->string('title'); + $table->text('article'); + $table->string('photo')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('articles'); + } +}; diff --git a/database/migrations/2025_08_13_020706_create_article_tag_table.php b/database/migrations/2025_08_13_020706_create_article_tag_table.php new file mode 100644 index 00000000..a04cf00c --- /dev/null +++ b/database/migrations/2025_08_13_020706_create_article_tag_table.php @@ -0,0 +1,27 @@ +foreignId('article_id')->constrained()->onDelete('cascade'); + $table->foreignId('tag_id')->constrained()->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('articles_tags'); + } +}; diff --git a/database/seeders/ArticleSeeder.php b/database/seeders/ArticleSeeder.php new file mode 100644 index 00000000..8c2a6c35 --- /dev/null +++ b/database/seeders/ArticleSeeder.php @@ -0,0 +1,17 @@ +create(); + + // Create my default user + if(!User::where('email','tyson.glore@gmail.com')->exists()) { + User::factory()->create([ + 'name' => 'Tyson Glore', + 'email' => 'tyson.glore@gmail.com', + 'password' => 'password', + ]); + } + + $categories = Category::factory(20)->create(); + + $tags = Tag::factory(10)->create(); + + // Create 30 articles with random recycled categories + Article::factory(30) + ->recycle($categories) + ->create(); + + // Attach random amount of random recycled tags + Article::all()->each(function ($article) use ($tags) { + $article->tags()->attach($tags->random(random_int(1, 10))); + }); + } +} diff --git a/database/seeders/TagSeeder.php b/database/seeders/TagSeeder.php new file mode 100644 index 00000000..31ac45b2 --- /dev/null +++ b/database/seeders/TagSeeder.php @@ -0,0 +1,17 @@ +=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", + "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", + "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "tailwindcss": "4.1.11" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/compiler-dom/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/compiler-ssr/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-core/node_modules/@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-core/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-dom/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "vue": "3.5.18" + } + }, + "node_modules/@vue/server-renderer/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/alpinejs": { + "version": "3.14.9", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.9.tgz", + "integrity": "sha512-gqSOhTEyryU9FhviNqiHBHzgjkvtukq9tevew29fTj+ofZtfsYriw4zPirHHOAy9bw8QoL3WGhyk7QqCh5AYlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001734", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz", + "integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concurrently": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", + "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.200", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz", + "integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.0.0.tgz", + "integrity": "sha512-pnaKHInJgiWpG/g+LmaISHl7D/1s5wnOXnrGiBdt4NOs+tYZRw0v/ZANELGX2/dGgHyEzO+iZ6x4idpoK04z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.46.2", + "@rollup/rollup-android-arm64": "4.46.2", + "@rollup/rollup-darwin-arm64": "4.46.2", + "@rollup/rollup-darwin-x64": "4.46.2", + "@rollup/rollup-freebsd-arm64": "4.46.2", + "@rollup/rollup-freebsd-x64": "4.46.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", + "@rollup/rollup-linux-arm64-gnu": "4.46.2", + "@rollup/rollup-linux-arm64-musl": "4.46.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-musl": "4.46.2", + "@rollup/rollup-linux-s390x-gnu": "4.46.2", + "@rollup/rollup-linux-x64-gnu": "4.46.2", + "@rollup/rollup-linux-x64-musl": "4.46.2", + "@rollup/rollup-win32-arm64-msvc": "4.46.2", + "@rollup/rollup-win32-ia32-msvc": "4.46.2", + "@rollup/rollup-win32-x64-msvc": "4.46.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.2.tgz", + "integrity": "sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue/node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "devOptional": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..a8e99066 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/vite": "^4.0.0", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", + "vite": "^7.0.4" + }, + "dependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "vue": "^3.5.18" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..6b25d0d1 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,33 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..49c0612d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..b574a597 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 00000000..e69de29b diff --git a/public/index.php b/public/index.php new file mode 100644 index 00000000..ee8f07e9 --- /dev/null +++ b/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 00000000..eb053628 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/resources/js/Components/MyComponent.vue b/resources/js/Components/MyComponent.vue new file mode 100644 index 00000000..a3289f52 --- /dev/null +++ b/resources/js/Components/MyComponent.vue @@ -0,0 +1,42 @@ + + + + + + diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 00000000..277bc267 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1,21 @@ +import './bootstrap'; + +import Alpine from 'alpinejs'; + +window.Alpine = Alpine; + +Alpine.start(); + +import { createApp } from 'vue'; +import MyComponent from './Components/MyComponent.vue'; + +const app = createApp({}); + +// Register the component globally if needed +app.component('my-component', MyComponent); + +// Or, if you're mounting a root Vue app (e.g., App.vue) +// import App from './App.vue'; +// createApp(App).mount('#app'); + +app.mount('#app'); // Mount your Vue app to an element with ID 'app' diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 00000000..5f1390b0 --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,4 @@ +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/resources/views/about-us.blade.php b/resources/views/about-us.blade.php new file mode 100644 index 00000000..4571358b --- /dev/null +++ b/resources/views/about-us.blade.php @@ -0,0 +1,16 @@ + + +

+ {{ __('About Us') }} +

+
+
+
+
+
+ {{ __("I'm just a guy with a computer who wants to become a competent full stack developer.") }} +
+
+
+
+
diff --git a/resources/views/article.blade.php b/resources/views/article.blade.php new file mode 100644 index 00000000..0217af18 --- /dev/null +++ b/resources/views/article.blade.php @@ -0,0 +1,28 @@ + + + +

+ {{ __($article->category->name . ' - ' . $article->title) }} +

+
+
+
+ +
+
+ @isset($article->photo) + Article cover + @endisset +
+ @foreach($article->tags as $tag) + + {{ $tag->name }} + + @endforeach +
+
{{ $article->article }}
+
+
+
+
+
diff --git a/resources/views/articles/create.blade.php b/resources/views/articles/create.blade.php new file mode 100644 index 00000000..ded0cfaa --- /dev/null +++ b/resources/views/articles/create.blade.php @@ -0,0 +1,55 @@ + + +

+ {{ __('Articles') }} +

+
+
+
+
+
+
+ @csrf + @method('POST') +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + {{ __('Create') }} + +
+
+
+
+
+
+
diff --git a/resources/views/articles/edit.blade.php b/resources/views/articles/edit.blade.php new file mode 100644 index 00000000..65e6ec1d --- /dev/null +++ b/resources/views/articles/edit.blade.php @@ -0,0 +1,55 @@ + + +

+ {{ __('Articles') }} +

+
+
+
+
+
+
+ @csrf + @method('PUT') +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + {{ __('Update') }} + +
+
+
+
+
+
+
diff --git a/resources/views/articles/index.blade.php b/resources/views/articles/index.blade.php new file mode 100644 index 00000000..19c71955 --- /dev/null +++ b/resources/views/articles/index.blade.php @@ -0,0 +1,56 @@ + + +

+ {{ __('Articles') }} +

+
+ {{--
+ --}}{{-- experimenting with vue --}}{{-- +
--}} +
+
+
+ + {{ __('Add Article') }} + +
+
+
+ + + + + + + + + + + + @foreach($articles as $article) + + + + + + + + @endforeach + +
TitleArticleCategoryTagsActions
{{ $article->title }}{{ substr($article->article, 0, 20) . '...' }}{{ $article->category->name }} + {{ implode(', ', array_column($article->tags->toArray(), 'name')) }} + + Edit +
+ @csrf + @method('DELETE') + Delete +
+
+
{{ $articles->links() }}
+
+
+
+
+
+ diff --git a/resources/views/articles/show.blade.php b/resources/views/articles/show.blade.php new file mode 100644 index 00000000..b3d9bbc7 --- /dev/null +++ b/resources/views/articles/show.blade.php @@ -0,0 +1 @@ + +
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} +
+ +
+ @csrf + + +
+ + + + + +
+ +
+ + {{ __('Confirm') }} + +
+
+ diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php new file mode 100644 index 00000000..3c707887 --- /dev/null +++ b/resources/views/auth/forgot-password.blade.php @@ -0,0 +1,25 @@ + +
+ {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} +
+ + + + +
+ @csrf + + +
+ + + +
+ +
+ + {{ __('Email Password Reset Link') }} + +
+
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 00000000..80e1b392 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,47 @@ + + + + +
+ @csrf + + +
+ + + +
+ + +
+ + + + + +
+ + +
+ +
+ +
+ @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif + + + {{ __('Log in') }} + +
+
+
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 00000000..d4b3d589 --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,52 @@ + +
+ @csrf + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Already registered?') }} + + + + {{ __('Register') }} + +
+
+
diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php new file mode 100644 index 00000000..a6494cca --- /dev/null +++ b/resources/views/auth/reset-password.blade.php @@ -0,0 +1,39 @@ + +
+ @csrf + + + + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php new file mode 100644 index 00000000..4e4222f4 --- /dev/null +++ b/resources/views/auth/verify-email.blade.php @@ -0,0 +1,31 @@ + +
+ {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+ + @if (session('status') == 'verification-link-sent') +
+ {{ __('A new verification link has been sent to the email address you provided during registration.') }} +
+ @endif + +
+
+ @csrf + +
+ + {{ __('Resend Verification Email') }} + +
+
+ +
+ @csrf + + +
+
+
diff --git a/resources/views/categories/create.blade.php b/resources/views/categories/create.blade.php new file mode 100644 index 00000000..1355c65d --- /dev/null +++ b/resources/views/categories/create.blade.php @@ -0,0 +1,29 @@ + + +

+ {{ __('Categories') }} +

+
+
+
+
+
+
+ @csrf + @method('POST') +
+ + + +
+
+ + {{ __('Create') }} + +
+
+
+
+
+
+
diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php new file mode 100644 index 00000000..66dc1244 --- /dev/null +++ b/resources/views/categories/edit.blade.php @@ -0,0 +1,29 @@ + + +

+ {{ __('Categories') }} +

+
+
+
+
+
+
+ @method("PUT") + @csrf +
+ + + +
+
+ + {{ __('Update') }} + +
+
+
+
+
+
+
diff --git a/resources/views/categories/index.blade.php b/resources/views/categories/index.blade.php new file mode 100644 index 00000000..0702a4fb --- /dev/null +++ b/resources/views/categories/index.blade.php @@ -0,0 +1,48 @@ + + +

+ {{ __('Categories') }} +

+
+
+
+
+ + {{ __('Add Category') }} + +
+
+
+ + + + + + + + + + @foreach($categories as $category) + + + + + + @endforeach + +
CategoryArticle CountActions
{{ $category->name }} + {{ count($category->articles) }} + + Edit +
+ @csrf + @method('DELETE') + Delete +
+
+
{{ $categories->links() }}
+
+
+
+
+
diff --git a/resources/views/categories/show.blade.php b/resources/views/categories/show.blade.php new file mode 100644 index 00000000..b3d9bbc7 --- /dev/null +++ b/resources/views/categories/show.blade.php @@ -0,0 +1 @@ + + + diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php new file mode 100644 index 00000000..a39bc7d2 --- /dev/null +++ b/resources/views/components/auth-session-status.blade.php @@ -0,0 +1,7 @@ +@props(['status']) + +@if ($status) +
merge(['class' => 'font-medium text-sm text-green-600 dark:text-green-400']) }}> + {{ $status }} +
+@endif diff --git a/resources/views/components/danger-button.blade.php b/resources/views/components/danger-button.blade.php new file mode 100644 index 00000000..d7417b21 --- /dev/null +++ b/resources/views/components/danger-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php new file mode 100644 index 00000000..6d5279d8 --- /dev/null +++ b/resources/views/components/dropdown-link.blade.php @@ -0,0 +1 @@ +merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-800 transition duration-150 ease-in-out']) }}>{{ $slot }} diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php new file mode 100644 index 00000000..e4106a4e --- /dev/null +++ b/resources/views/components/dropdown.blade.php @@ -0,0 +1,35 @@ +@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white dark:bg-gray-700']) + +@php +$alignmentClasses = match ($align) { + 'left' => 'ltr:origin-top-left rtl:origin-top-right start-0', + 'top' => 'origin-top', + default => 'ltr:origin-top-right rtl:origin-top-left end-0', +}; + +$width = match ($width) { + '48' => 'w-48', + default => $width, +}; +@endphp + +
+
+ {{ $trigger }} +
+ + +
diff --git a/resources/views/components/input-error.blade.php b/resources/views/components/input-error.blade.php new file mode 100644 index 00000000..ad95f6b5 --- /dev/null +++ b/resources/views/components/input-error.blade.php @@ -0,0 +1,9 @@ +@props(['messages']) + +@if ($messages) +
    merge(['class' => 'text-sm text-red-600 dark:text-red-400 space-y-1']) }}> + @foreach ((array) $messages as $message) +
  • {{ $message }}
  • + @endforeach +
+@endif diff --git a/resources/views/components/input-label.blade.php b/resources/views/components/input-label.blade.php new file mode 100644 index 00000000..e93b059a --- /dev/null +++ b/resources/views/components/input-label.blade.php @@ -0,0 +1,5 @@ +@props(['value']) + + diff --git a/resources/views/components/modal.blade.php b/resources/views/components/modal.blade.php new file mode 100644 index 00000000..384662a1 --- /dev/null +++ b/resources/views/components/modal.blade.php @@ -0,0 +1,78 @@ +@props([ + 'name', + 'show' => false, + 'maxWidth' => '2xl' +]) + +@php +$maxWidth = [ + 'sm' => 'sm:max-w-sm', + 'md' => 'sm:max-w-md', + 'lg' => 'sm:max-w-lg', + 'xl' => 'sm:max-w-xl', + '2xl' => 'sm:max-w-2xl', +][$maxWidth]; +@endphp + +
+
+
+
+ +
+ {{ $slot }} +
+
diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php new file mode 100644 index 00000000..37bad554 --- /dev/null +++ b/resources/views/components/nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 dark:border-indigo-600 text-sm font-medium leading-5 text-gray-900 dark:text-gray-100 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' + : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-700 focus:outline-none focus:text-gray-700 dark:focus:text-gray-300 focus:border-gray-300 dark:focus:border-gray-700 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php new file mode 100644 index 00000000..99bf3890 --- /dev/null +++ b/resources/views/components/primary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php new file mode 100644 index 00000000..98b55d19 --- /dev/null +++ b/resources/views/components/responsive-nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 dark:border-indigo-600 text-start text-base font-medium text-indigo-700 dark:text-indigo-300 bg-indigo-50 dark:bg-indigo-900/50 focus:outline-none focus:text-indigo-800 dark:focus:text-indigo-200 focus:bg-indigo-100 dark:focus:bg-indigo-900 focus:border-indigo-700 dark:focus:border-indigo-300 transition duration-150 ease-in-out' + : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-gray-800 dark:focus:text-gray-200 focus:bg-gray-50 dark:focus:bg-gray-700 focus:border-gray-300 dark:focus:border-gray-600 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php new file mode 100644 index 00000000..fa1c5491 --- /dev/null +++ b/resources/views/components/secondary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/components/select-input.blade.php b/resources/views/components/select-input.blade.php new file mode 100644 index 00000000..28c6702a --- /dev/null +++ b/resources/views/components/select-input.blade.php @@ -0,0 +1,15 @@ +@props(['disabled' => false] ) + diff --git a/resources/views/components/text-area.blade.php b/resources/views/components/text-area.blade.php new file mode 100644 index 00000000..6e3e305a --- /dev/null +++ b/resources/views/components/text-area.blade.php @@ -0,0 +1,3 @@ +@props(['disabled' => false] ) + + diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php new file mode 100644 index 00000000..3f44b2f7 --- /dev/null +++ b/resources/views/components/text-input.blade.php @@ -0,0 +1,3 @@ +@props(['disabled' => false]) + +merge(['class' => 'border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm']) }}> diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php new file mode 100644 index 00000000..ced6a7a2 --- /dev/null +++ b/resources/views/dashboard.blade.php @@ -0,0 +1,37 @@ + + +

+ {{ __('Dashboard') }} +

+
+
+ @foreach($articles->chunk(3) as $chunk) +
+
+ @foreach($chunk as $article) +
+ @isset($article->photo) + Article cover + @endisset +
+

{{ $article->category->name }}

+ @foreach($article->tags as $tag) + + {{ $tag->name }} + + @endforeach +

{{ $article->title }}

+

{{ substr($article->article, 1, 400) . '...' }}

+
+
+ @endforeach +
+
+ @endforeach + +
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 00000000..0a471a4d --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,36 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +
+ @include('layouts.navigation') + + + @isset($header) +
+
+ {{ $header }} +
+
+ @endisset + + +
+ {{ $slot }} +
+
+ + diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php new file mode 100644 index 00000000..4b369b63 --- /dev/null +++ b/resources/views/layouts/guest.blade.php @@ -0,0 +1,30 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +
+
+ + + +
+ +
+ {{ $slot }} +
+
+ + diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php new file mode 100644 index 00000000..c0fcfba8 --- /dev/null +++ b/resources/views/layouts/navigation.blade.php @@ -0,0 +1,131 @@ + diff --git a/resources/views/partials/footer.blade.php b/resources/views/partials/footer.blade.php new file mode 100644 index 00000000..435c380b --- /dev/null +++ b/resources/views/partials/footer.blade.php @@ -0,0 +1 @@ +{!! $message !!} diff --git a/resources/views/profile/edit.blade.php b/resources/views/profile/edit.blade.php new file mode 100644 index 00000000..ef699107 --- /dev/null +++ b/resources/views/profile/edit.blade.php @@ -0,0 +1,29 @@ + + +

+ {{ __('Profile') }} +

+
+ +
+
+
+
+ @include('profile.partials.update-profile-information-form') +
+
+ +
+
+ @include('profile.partials.update-password-form') +
+
+ +
+
+ @include('profile.partials.delete-user-form') +
+
+
+
+
diff --git a/resources/views/profile/partials/delete-user-form.blade.php b/resources/views/profile/partials/delete-user-form.blade.php new file mode 100644 index 00000000..b3a63820 --- /dev/null +++ b/resources/views/profile/partials/delete-user-form.blade.php @@ -0,0 +1,55 @@ +
+
+

+ {{ __('Delete Account') }} +

+ +

+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }} +

+
+ + {{ __('Delete Account') }} + + +
+ @csrf + @method('delete') + +

+ {{ __('Are you sure you want to delete your account?') }} +

+ +

+ {{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }} +

+ +
+ + + + + +
+ +
+ + {{ __('Cancel') }} + + + + {{ __('Delete Account') }} + +
+
+
+
diff --git a/resources/views/profile/partials/update-password-form.blade.php b/resources/views/profile/partials/update-password-form.blade.php new file mode 100644 index 00000000..acd200d7 --- /dev/null +++ b/resources/views/profile/partials/update-password-form.blade.php @@ -0,0 +1,48 @@ +
+
+

+ {{ __('Update Password') }} +

+ +

+ {{ __('Ensure your account is using a long, random password to stay secure.') }} +

+
+ +
+ @csrf + @method('put') + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ {{ __('Save') }} + + @if (session('status') === 'password-updated') +

{{ __('Saved.') }}

+ @endif +
+
+
diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php new file mode 100644 index 00000000..7273fff3 --- /dev/null +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -0,0 +1,64 @@ +
+
+

+ {{ __('Profile Information') }} +

+ +

+ {{ __("Update your account's profile information and email address.") }} +

+
+ +
+ @csrf +
+ +
+ @csrf + @method('patch') + +
+ + + +
+ +
+ + + + + @if ($user instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! $user->hasVerifiedEmail()) +
+

+ {{ __('Your email address is unverified.') }} + + +

+ + @if (session('status') === 'verification-link-sent') +

+ {{ __('A new verification link has been sent to your email address.') }} +

+ @endif +
+ @endif +
+ +
+ {{ __('Save') }} + + @if (session('status') === 'profile-updated') +

{{ __('Saved.') }}

+ @endif +
+
+
diff --git a/resources/views/tags/create.blade.php b/resources/views/tags/create.blade.php new file mode 100644 index 00000000..66c29160 --- /dev/null +++ b/resources/views/tags/create.blade.php @@ -0,0 +1,29 @@ + + +

+ {{ __('Tags') }} +

+
+
+
+
+
+
+ @csrf + @method('POST') +
+ + + +
+
+ + {{ __('Create') }} + +
+
+
+
+
+
+
diff --git a/resources/views/tags/edit.blade.php b/resources/views/tags/edit.blade.php new file mode 100644 index 00000000..616e1f94 --- /dev/null +++ b/resources/views/tags/edit.blade.php @@ -0,0 +1,30 @@ + + +

+ {{ __('Tags') }} +

+
+
+
+
+
+
+ @method("PUT") + @csrf + +
+ + + +
+
+ + {{ __('Update') }} + +
+
+
+
+
+
+
diff --git a/resources/views/tags/index.blade.php b/resources/views/tags/index.blade.php new file mode 100644 index 00000000..b9e8b9fe --- /dev/null +++ b/resources/views/tags/index.blade.php @@ -0,0 +1,46 @@ + + +

+ {{ __('Tags') }} +

+
+
+
+
+ + {{ __('Add Tag') }} + +
+
+
+ + + + + + + + + + @foreach($tags as $tag) + + + + + + @endforeach + +
TagArticle CountActions
{{ $tag->name }}{{ count($tag->articles) }} + Edit +
+ @csrf + @method('DELETE') + Delete +
+
+
{{ $tags->links() }}
+
+
+
+
+
diff --git a/routes/auth.php b/routes/auth.php new file mode 100644 index 00000000..2f9dd88b --- /dev/null +++ b/routes/auth.php @@ -0,0 +1,59 @@ +group(function () { + /*Route::get('register', [RegisteredUserController::class, 'create']) + ->name('register');*/ + + Route::post('register', [RegisteredUserController::class, 'store']); + + Route::get('login', [AuthenticatedSessionController::class, 'create']) + ->name('login'); + + Route::post('login', [AuthenticatedSessionController::class, 'store']); + + Route::get('forgot-password', [PasswordResetLinkController::class, 'create']) + ->name('password.request'); + + Route::post('forgot-password', [PasswordResetLinkController::class, 'store']) + ->name('password.email'); + + Route::get('reset-password/{token}', [NewPasswordController::class, 'create']) + ->name('password.reset'); + + Route::post('reset-password', [NewPasswordController::class, 'store']) + ->name('password.store'); +}); + +Route::middleware('auth')->group(function () { + Route::get('verify-email', EmailVerificationPromptController::class) + ->name('verification.notice'); + + Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); + + Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store']) + ->middleware('throttle:6,1') + ->name('verification.send'); + + Route::get('confirm-password', [ConfirmablePasswordController::class, 'show']) + ->name('password.confirm'); + + Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']); + + Route::put('password', [PasswordController::class, 'update'])->name('password.update'); + + Route::post('logout', [AuthenticatedSessionController::class, 'destroy']) + ->name('logout'); +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 00000000..3c9adf1a --- /dev/null +++ b/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 00000000..ccead4da --- /dev/null +++ b/routes/web.php @@ -0,0 +1,40 @@ +name('dashboard'); +Route::get('/article/{article}', [DashboardController::class, 'article'])->name('dashboard.article'); + +// Static about-us page route with callback function and route name +Route::get('/about-us', function () { + return view('about-us'); +})->name('about-us'); + +// Route grouping and routes with parameters, resource routes +Route::middleware(['auth', 'verified'])->group(function() { + + Route::get('/tags', [TagController::class, 'index'])->name('tags.index'); + Route::get('/tags/{tag}/edit', [TagController::class, 'edit'])->name('tags.edit'); + Route::get('/tags/create', [TagController::class, 'create'])->name('tags.create'); + Route::post('/tags/', [TagController::class, 'store'])->name('tags.store'); + Route::put('/tags/{tag}/update', [TagController::class, 'update'])->name('tags.update'); + Route::delete('/tags/{tag}', [TagController::class, 'destroy'])->name('tags.destroy'); + + Route::resource('categories', CategoryController::class); + + Route::resource('articles', ArticleController::class); +}); + +Route::middleware('auth')->group(function () { + Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); + Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); + Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); +}); + +require __DIR__.'/auth.php'; diff --git a/storage/app/private/.gitignore b/storage/app/private/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/app/private/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/app/public/articles/1002-200x300.jpg b/storage/app/public/articles/1002-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5dfeed61eb5b52506defc42b5bdabf38346d1bd GIT binary patch literal 7602 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 literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/1027-200x300.jpg b/storage/app/public/articles/1027-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8861695e47d57da7d7c0cab69d08341001652bb9 GIT binary patch literal 7055 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 literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/290-200x300.jpg b/storage/app/public/articles/290-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e00503113472c0f91cfa3597246d89c8a4e5829c GIT binary patch literal 9617 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 &|r{A$1X(p4~!e390 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 RL?wxcPw-T1(WD+%{tMoYz_|bb literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/37-200x300.jpg b/storage/app/public/articles/37-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..857c2a5b040940af1a9747c054601bd75a3f4305 GIT binary patch literal 9189 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 apQsEsGBSQg_hllcrW}nv!gu;<^}hgM>MT(J literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/58-200x300.jpg b/storage/app/public/articles/58-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46ad586d419f05106672198ca4e586ebd5fe6a61 GIT binary patch literal 11045 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 PyuuI9K+S3H=av5t4Ih|{ literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/611-200x300.jpg b/storage/app/public/articles/611-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c5a75512b72ed6b13fa2c4fc0b4943b19ec985c GIT binary patch literal 10137 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 Kv9$8XrT+s7Q9}v< literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/727-200x300.jpg b/storage/app/public/articles/727-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c49d0374a810768659c3b4b2a28865e82f60fbed GIT binary patch literal 7151 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 C@=bF9 literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/73-200x300.jpg b/storage/app/public/articles/73-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b3cc40aee009b4ac39cab3f00e33af0da68c0aa GIT binary patch literal 6912 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 IYrp6I2hT^dK>z>% literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/819-200x300.jpg b/storage/app/public/articles/819-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..314deb0c04c19a58eb18409a8e291940fcaa1de4 GIT binary patch literal 12446 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�DW>33+MBLS?K)-oay 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 literal 0 HcmV?d00001 diff --git a/storage/app/public/articles/996-200x300.jpg b/storage/app/public/articles/996-200x300.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0247e3d3517335c67e9498df0c84a0dd208bc49e GIT binary patch literal 5561 zcmb7Gc{r5c+n+IG-)2zuWysE$u~W!c3Nx6p6K3qP3=*=082hefM1*WnDB1E&rm>DC zOJ!@1N(fm};T^vH-uL(K`?;>?oclWGzV7pUp6CAD_c@q8cn^4E66xm+0GOF609XJ3 z026=*2m%1<*5M-rWIUSf=(g}*+m&w1{q

+q?|_=kJ#SKJuprJi=M}co^qDGcy2? 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 literal 0 HcmV?d00001 diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/debugbar/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 00000000..05c4471f --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 00000000..01e4a6cd --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..c29eb1a1 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,21 @@ +import defaultTheme from 'tailwindcss/defaultTheme'; +import forms from '@tailwindcss/forms'; + +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', + './storage/framework/views/*.php', + './resources/views/**/*.blade.php', + ], + + theme: { + extend: { + fontFamily: { + sans: ['Figtree', ...defaultTheme.fontFamily.sans], + }, + }, + }, + + plugins: [forms], +}; diff --git a/tests/Feature/Auth/AuthenticationTest.php b/tests/Feature/Auth/AuthenticationTest.php new file mode 100644 index 00000000..a272b9d5 --- /dev/null +++ b/tests/Feature/Auth/AuthenticationTest.php @@ -0,0 +1,41 @@ +get('/login'); + + $response->assertStatus(200); +}); + +test('users can authenticate using the login screen', function () { + $user = User::factory()->create(); + + $response = $this->post('/login', [ + 'email' => $user->email, + 'password' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(route('dashboard', absolute: false)); +}); + +test('users can not authenticate with invalid password', function () { + $user = User::factory()->create(); + + $this->post('/login', [ + 'email' => $user->email, + 'password' => 'wrong-password', + ]); + + $this->assertGuest(); +}); + +test('users can logout', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/logout'); + + $this->assertGuest(); + $response->assertRedirect('/'); +}); diff --git a/tests/Feature/Auth/EmailVerificationTest.php b/tests/Feature/Auth/EmailVerificationTest.php new file mode 100644 index 00000000..f282dff0 --- /dev/null +++ b/tests/Feature/Auth/EmailVerificationTest.php @@ -0,0 +1,46 @@ +unverified()->create(); + + $response = $this->actingAs($user)->get('/verify-email'); + + $response->assertStatus(200); +}); + +test('email can be verified', function () { + $user = User::factory()->unverified()->create(); + + Event::fake(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1($user->email)] + ); + + $response = $this->actingAs($user)->get($verificationUrl); + + Event::assertDispatched(Verified::class); + expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); + $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); +}); + +test('email is not verified with invalid hash', function () { + $user = User::factory()->unverified()->create(); + + $verificationUrl = URL::temporarySignedRoute( + 'verification.verify', + now()->addMinutes(60), + ['id' => $user->id, 'hash' => sha1('wrong-email')] + ); + + $this->actingAs($user)->get($verificationUrl); + + expect($user->fresh()->hasVerifiedEmail())->toBeFalse(); +}); diff --git a/tests/Feature/Auth/PasswordConfirmationTest.php b/tests/Feature/Auth/PasswordConfirmationTest.php new file mode 100644 index 00000000..8a42902e --- /dev/null +++ b/tests/Feature/Auth/PasswordConfirmationTest.php @@ -0,0 +1,32 @@ +create(); + + $response = $this->actingAs($user)->get('/confirm-password'); + + $response->assertStatus(200); +}); + +test('password can be confirmed', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'password', + ]); + + $response->assertRedirect(); + $response->assertSessionHasNoErrors(); +}); + +test('password is not confirmed with invalid password', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'wrong-password', + ]); + + $response->assertSessionHasErrors(); +}); diff --git a/tests/Feature/Auth/PasswordResetTest.php b/tests/Feature/Auth/PasswordResetTest.php new file mode 100644 index 00000000..0504276a --- /dev/null +++ b/tests/Feature/Auth/PasswordResetTest.php @@ -0,0 +1,60 @@ +get('/forgot-password'); + + $response->assertStatus(200); +}); + +test('reset password link can be requested', function () { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class); +}); + +test('reset password screen can be rendered', function () { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) { + $response = $this->get('/reset-password/'.$notification->token); + + $response->assertStatus(200); + + return true; + }); +}); + +test('password can be reset with valid token', function () { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { + $response = $this->post('/reset-password', [ + 'token' => $notification->token, + 'email' => $user->email, + 'password' => 'password', + 'password_confirmation' => 'password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect(route('login')); + + return true; + }); +}); diff --git a/tests/Feature/Auth/PasswordUpdateTest.php b/tests/Feature/Auth/PasswordUpdateTest.php new file mode 100644 index 00000000..e3d12780 --- /dev/null +++ b/tests/Feature/Auth/PasswordUpdateTest.php @@ -0,0 +1,40 @@ +create(); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->put('/password', [ + 'current_password' => 'password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $this->assertTrue(Hash::check('new-password', $user->refresh()->password)); +}); + +test('correct password must be provided to update password', function () { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->put('/password', [ + 'current_password' => 'wrong-password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ]); + + $response + ->assertSessionHasErrorsIn('updatePassword', 'current_password') + ->assertRedirect('/profile'); +}); diff --git a/tests/Feature/Auth/RegistrationTest.php b/tests/Feature/Auth/RegistrationTest.php new file mode 100644 index 00000000..352ca787 --- /dev/null +++ b/tests/Feature/Auth/RegistrationTest.php @@ -0,0 +1,19 @@ +get('/register'); + + $response->assertStatus(200); +}); + +test('new users can register', function () { + $response = $this->post('/register', [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'password', + 'password_confirmation' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(route('dashboard', absolute: false)); +}); diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php new file mode 100644 index 00000000..8b5843f4 --- /dev/null +++ b/tests/Feature/ExampleTest.php @@ -0,0 +1,7 @@ +get('/'); + + $response->assertStatus(200); +}); diff --git a/tests/Feature/ProfileTest.php b/tests/Feature/ProfileTest.php new file mode 100644 index 00000000..15364580 --- /dev/null +++ b/tests/Feature/ProfileTest.php @@ -0,0 +1,85 @@ +create(); + + $response = $this + ->actingAs($user) + ->get('/profile'); + + $response->assertOk(); +}); + +test('profile information can be updated', function () { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->patch('/profile', [ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $user->refresh(); + + $this->assertSame('Test User', $user->name); + $this->assertSame('test@example.com', $user->email); + $this->assertNull($user->email_verified_at); +}); + +test('email verification status is unchanged when the email address is unchanged', function () { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->patch('/profile', [ + 'name' => 'Test User', + 'email' => $user->email, + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/profile'); + + $this->assertNotNull($user->refresh()->email_verified_at); +}); + +test('user can delete their account', function () { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->delete('/profile', [ + 'password' => 'password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/'); + + $this->assertGuest(); + $this->assertNull($user->fresh()); +}); + +test('correct password must be provided to delete account', function () { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->from('/profile') + ->delete('/profile', [ + 'password' => 'wrong-password', + ]); + + $response + ->assertSessionHasErrorsIn('userDeletion', 'password') + ->assertRedirect('/profile'); + + $this->assertNotNull($user->fresh()); +}); diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 00000000..40d096b5 --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,47 @@ +extend(Tests\TestCase::class) + ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) + ->in('Feature'); + +/* +|-------------------------------------------------------------------------- +| Expectations +|-------------------------------------------------------------------------- +| +| When you're writing tests, you often need to check that values meet certain conditions. The +| "expect()" function gives you access to a set of "expectations" methods that you can use +| to assert different things. Of course, you may extend the Expectation API at any time. +| +*/ + +expect()->extend('toBeOne', function () { + return $this->toBe(1); +}); + +/* +|-------------------------------------------------------------------------- +| Functions +|-------------------------------------------------------------------------- +| +| While Pest is very powerful out-of-the-box, you may have some testing code specific to your +| project that you don't want to repeat in every file. Here you can also expose helpers as +| global functions to help you to reduce the number of lines of code in your test files. +| +*/ + +function something() +{ + // .. +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 00000000..fe1ffc2f --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,10 @@ +toBeTrue(); +}); diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000..23d4aa0e --- /dev/null +++ b/vite.config.js @@ -0,0 +1,19 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import vue from '@vitejs/plugin-vue'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + vue(), + ], + resolve: { + alias: { + 'vue': 'vue/dist/vue.esm-bundler.js' + } + } + +});