From cfeaeb2835dbb0aa7235656e7070a8afc46948ad Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 13:35:40 +0330 Subject: [PATCH 01/16] Install Laravel and Breeze --- .idea/.gitignore | 8 + .idea/Laravel-Roadmap-Beginner-Challenge.iml | 124 + .idea/easycode.ignore | 13 + .idea/misc.xml | 10 + .idea/modules.xml | 8 + .idea/php.xml | 143 + .idea/phpunit.xml | 11 + .idea/vcs.xml | 6 + personal-blog/.editorconfig | 18 + personal-blog/.env.example | 64 + personal-blog/.gitattributes | 11 + personal-blog/.gitignore | 20 + personal-blog/README.md | 66 + .../Auth/AuthenticatedSessionController.php | 47 + .../Auth/ConfirmablePasswordController.php | 40 + ...mailVerificationNotificationController.php | 24 + .../EmailVerificationPromptController.php | 21 + .../Auth/NewPasswordController.php | 61 + .../Controllers/Auth/PasswordController.php | 29 + .../Auth/PasswordResetLinkController.php | 44 + .../Auth/RegisteredUserController.php | 50 + .../Auth/VerifyEmailController.php | 27 + .../app/Http/Controllers/Controller.php | 8 + .../Http/Controllers/ProfileController.php | 60 + .../app/Http/Requests/Auth/LoginRequest.php | 85 + .../Http/Requests/ProfileUpdateRequest.php | 23 + personal-blog/app/Models/User.php | 47 + .../app/Providers/AppServiceProvider.php | 24 + .../app/View/Components/AppLayout.php | 17 + .../app/View/Components/GuestLayout.php | 17 + personal-blog/artisan | 15 + personal-blog/bootstrap/app.php | 18 + personal-blog/bootstrap/cache/.gitignore | 2 + personal-blog/bootstrap/providers.php | 5 + personal-blog/composer.json | 66 + personal-blog/composer.lock | 7892 +++++++++++++++++ personal-blog/config/app.php | 126 + personal-blog/config/auth.php | 115 + personal-blog/config/cache.php | 108 + personal-blog/config/database.php | 173 + personal-blog/config/filesystems.php | 76 + personal-blog/config/logging.php | 132 + personal-blog/config/mail.php | 116 + personal-blog/config/queue.php | 112 + personal-blog/config/services.php | 38 + personal-blog/config/session.php | 217 + personal-blog/database/.gitignore | 1 + .../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 + .../database/seeders/DatabaseSeeder.php | 23 + personal-blog/package.json | 18 + personal-blog/phpunit.xml | 33 + personal-blog/postcss.config.js | 6 + personal-blog/public/.htaccess | 21 + personal-blog/public/favicon.ico | 0 personal-blog/public/index.php | 17 + personal-blog/public/robots.txt | 2 + personal-blog/resources/css/app.css | 3 + personal-blog/resources/js/app.js | 7 + personal-blog/resources/js/bootstrap.js | 4 + .../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 + .../views/auth/reset-password.blade.php | 39 + .../views/auth/verify-email.blade.php | 31 + .../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 + .../views/components/dropdown.blade.php | 35 + .../views/components/input-error.blade.php | 9 + .../views/components/input-label.blade.php | 5 + .../views/components/modal.blade.php | 78 + .../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/text-input.blade.php | 3 + .../resources/views/dashboard.blade.php | 17 + .../resources/views/layouts/app.blade.php | 36 + .../resources/views/layouts/guest.blade.php | 30 + .../views/layouts/navigation.blade.php | 100 + .../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/welcome.blade.php | 172 + personal-blog/routes/auth.php | 59 + personal-blog/routes/console.php | 8 + personal-blog/routes/web.php | 20 + personal-blog/storage/app/.gitignore | 3 + personal-blog/storage/app/public/.gitignore | 2 + personal-blog/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 + personal-blog/storage/logs/.gitignore | 2 + personal-blog/tailwind.config.js | 21 + .../tests/Feature/Auth/AuthenticationTest.php | 54 + .../Feature/Auth/EmailVerificationTest.php | 58 + .../Feature/Auth/PasswordConfirmationTest.php | 44 + .../tests/Feature/Auth/PasswordResetTest.php | 73 + .../tests/Feature/Auth/PasswordUpdateTest.php | 51 + .../tests/Feature/Auth/RegistrationTest.php | 31 + personal-blog/tests/Feature/ExampleTest.php | 19 + personal-blog/tests/Feature/ProfileTest.php | 99 + personal-blog/tests/TestCase.php | 10 + personal-blog/tests/Unit/ExampleTest.php | 16 + personal-blog/vite.config.js | 14 + 114 files changed, 12205 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/Laravel-Roadmap-Beginner-Challenge.iml create mode 100644 .idea/easycode.ignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/phpunit.xml create mode 100644 .idea/vcs.xml create mode 100644 personal-blog/.editorconfig create mode 100644 personal-blog/.env.example create mode 100644 personal-blog/.gitattributes create mode 100644 personal-blog/.gitignore create mode 100644 personal-blog/README.md create mode 100644 personal-blog/app/Http/Controllers/Auth/AuthenticatedSessionController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/ConfirmablePasswordController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/EmailVerificationNotificationController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/EmailVerificationPromptController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/NewPasswordController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/PasswordController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/PasswordResetLinkController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/RegisteredUserController.php create mode 100644 personal-blog/app/Http/Controllers/Auth/VerifyEmailController.php create mode 100644 personal-blog/app/Http/Controllers/Controller.php create mode 100644 personal-blog/app/Http/Controllers/ProfileController.php create mode 100644 personal-blog/app/Http/Requests/Auth/LoginRequest.php create mode 100644 personal-blog/app/Http/Requests/ProfileUpdateRequest.php create mode 100644 personal-blog/app/Models/User.php create mode 100644 personal-blog/app/Providers/AppServiceProvider.php create mode 100644 personal-blog/app/View/Components/AppLayout.php create mode 100644 personal-blog/app/View/Components/GuestLayout.php create mode 100644 personal-blog/artisan create mode 100644 personal-blog/bootstrap/app.php create mode 100644 personal-blog/bootstrap/cache/.gitignore create mode 100644 personal-blog/bootstrap/providers.php create mode 100644 personal-blog/composer.json create mode 100644 personal-blog/composer.lock create mode 100644 personal-blog/config/app.php create mode 100644 personal-blog/config/auth.php create mode 100644 personal-blog/config/cache.php create mode 100644 personal-blog/config/database.php create mode 100644 personal-blog/config/filesystems.php create mode 100644 personal-blog/config/logging.php create mode 100644 personal-blog/config/mail.php create mode 100644 personal-blog/config/queue.php create mode 100644 personal-blog/config/services.php create mode 100644 personal-blog/config/session.php create mode 100644 personal-blog/database/.gitignore create mode 100644 personal-blog/database/factories/UserFactory.php create mode 100644 personal-blog/database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 personal-blog/database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 personal-blog/database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 personal-blog/database/seeders/DatabaseSeeder.php create mode 100644 personal-blog/package.json create mode 100644 personal-blog/phpunit.xml create mode 100644 personal-blog/postcss.config.js create mode 100644 personal-blog/public/.htaccess create mode 100644 personal-blog/public/favicon.ico create mode 100644 personal-blog/public/index.php create mode 100644 personal-blog/public/robots.txt create mode 100644 personal-blog/resources/css/app.css create mode 100644 personal-blog/resources/js/app.js create mode 100644 personal-blog/resources/js/bootstrap.js create mode 100644 personal-blog/resources/views/auth/confirm-password.blade.php create mode 100644 personal-blog/resources/views/auth/forgot-password.blade.php create mode 100644 personal-blog/resources/views/auth/login.blade.php create mode 100644 personal-blog/resources/views/auth/register.blade.php create mode 100644 personal-blog/resources/views/auth/reset-password.blade.php create mode 100644 personal-blog/resources/views/auth/verify-email.blade.php create mode 100644 personal-blog/resources/views/components/application-logo.blade.php create mode 100644 personal-blog/resources/views/components/auth-session-status.blade.php create mode 100644 personal-blog/resources/views/components/danger-button.blade.php create mode 100644 personal-blog/resources/views/components/dropdown-link.blade.php create mode 100644 personal-blog/resources/views/components/dropdown.blade.php create mode 100644 personal-blog/resources/views/components/input-error.blade.php create mode 100644 personal-blog/resources/views/components/input-label.blade.php create mode 100644 personal-blog/resources/views/components/modal.blade.php create mode 100644 personal-blog/resources/views/components/nav-link.blade.php create mode 100644 personal-blog/resources/views/components/primary-button.blade.php create mode 100644 personal-blog/resources/views/components/responsive-nav-link.blade.php create mode 100644 personal-blog/resources/views/components/secondary-button.blade.php create mode 100644 personal-blog/resources/views/components/text-input.blade.php create mode 100644 personal-blog/resources/views/dashboard.blade.php create mode 100644 personal-blog/resources/views/layouts/app.blade.php create mode 100644 personal-blog/resources/views/layouts/guest.blade.php create mode 100644 personal-blog/resources/views/layouts/navigation.blade.php create mode 100644 personal-blog/resources/views/profile/edit.blade.php create mode 100644 personal-blog/resources/views/profile/partials/delete-user-form.blade.php create mode 100644 personal-blog/resources/views/profile/partials/update-password-form.blade.php create mode 100644 personal-blog/resources/views/profile/partials/update-profile-information-form.blade.php create mode 100644 personal-blog/resources/views/welcome.blade.php create mode 100644 personal-blog/routes/auth.php create mode 100644 personal-blog/routes/console.php create mode 100644 personal-blog/routes/web.php create mode 100644 personal-blog/storage/app/.gitignore create mode 100644 personal-blog/storage/app/public/.gitignore create mode 100644 personal-blog/storage/framework/.gitignore create mode 100644 personal-blog/storage/framework/cache/.gitignore create mode 100644 personal-blog/storage/framework/cache/data/.gitignore create mode 100644 personal-blog/storage/framework/sessions/.gitignore create mode 100644 personal-blog/storage/framework/testing/.gitignore create mode 100644 personal-blog/storage/framework/views/.gitignore create mode 100644 personal-blog/storage/logs/.gitignore create mode 100644 personal-blog/tailwind.config.js create mode 100644 personal-blog/tests/Feature/Auth/AuthenticationTest.php create mode 100644 personal-blog/tests/Feature/Auth/EmailVerificationTest.php create mode 100644 personal-blog/tests/Feature/Auth/PasswordConfirmationTest.php create mode 100644 personal-blog/tests/Feature/Auth/PasswordResetTest.php create mode 100644 personal-blog/tests/Feature/Auth/PasswordUpdateTest.php create mode 100644 personal-blog/tests/Feature/Auth/RegistrationTest.php create mode 100644 personal-blog/tests/Feature/ExampleTest.php create mode 100644 personal-blog/tests/Feature/ProfileTest.php create mode 100644 personal-blog/tests/TestCase.php create mode 100644 personal-blog/tests/Unit/ExampleTest.php create mode 100644 personal-blog/vite.config.js diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Laravel-Roadmap-Beginner-Challenge.iml b/.idea/Laravel-Roadmap-Beginner-Challenge.iml new file mode 100644 index 00000000..49afe83f --- /dev/null +++ b/.idea/Laravel-Roadmap-Beginner-Challenge.iml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/easycode.ignore b/.idea/easycode.ignore new file mode 100644 index 00000000..be585df4 --- /dev/null +++ b/.idea/easycode.ignore @@ -0,0 +1,13 @@ +node_modules/ +dist/ +vendor/ +cache/ +.*/ +*.min.* +*.test.* +*.spec.* +*.bundle.* +*.bundle-min.* +*.*.js +*.*.ts +*.log diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..94a6555c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..395b933f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 00000000..fd71879c --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml new file mode 100644 index 00000000..7eacb7b9 --- /dev/null +++ b/.idea/phpunit.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/personal-blog/.editorconfig b/personal-blog/.editorconfig new file mode 100644 index 00000000..8f0de65c --- /dev/null +++ b/personal-blog/.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/personal-blog/.env.example b/personal-blog/.env.example new file mode 100644 index 00000000..64a3c213 --- /dev/null +++ b/personal-blog/.env.example @@ -0,0 +1,64 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_TIMEZONE=UTC +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +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=personal_blog +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_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=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/personal-blog/.gitattributes b/personal-blog/.gitattributes new file mode 100644 index 00000000..fcb21d39 --- /dev/null +++ b/personal-blog/.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/personal-blog/.gitignore b/personal-blog/.gitignore new file mode 100644 index 00000000..46340a60 --- /dev/null +++ b/personal-blog/.gitignore @@ -0,0 +1,20 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/personal-blog/README.md b/personal-blog/README.md new file mode 100644 index 00000000..1a4c26ba --- /dev/null +++ b/personal-blog/README.md @@ -0,0 +1,66 @@ +

Laravel Logo

+ +

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

+ +## About Laravel + +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: + +- [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). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +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. + +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. + +## Laravel Sponsors + +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)** +- **[WebReinvent](https://webreinvent.com/)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Jump24](https://jump24.co.uk)** +- **[Redberry](https://redberry.international/laravel/)** +- **[Active Logic](https://activelogic.com)** +- **[byte5](https://byte5.de)** +- **[OP.GG](https://op.gg)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +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 + +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. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/personal-blog/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/personal-blog/app/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 00000000..613bcd9d --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/personal-blog/app/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 00000000..712394a5 --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/personal-blog/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 00000000..f64fa9ba --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/personal-blog/app/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 00000000..ee3cb6fa --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/NewPasswordController.php b/personal-blog/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 00000000..f1e2814f --- /dev/null +++ b/personal-blog/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,61 @@ + $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) 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/personal-blog/app/Http/Controllers/Auth/PasswordController.php b/personal-blog/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 00000000..69164091 --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/PasswordResetLinkController.php b/personal-blog/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 00000000..ce813a62 --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/RegisteredUserController.php b/personal-blog/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 00000000..0739e2e8 --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Auth/VerifyEmailController.php b/personal-blog/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 00000000..784765e3 --- /dev/null +++ b/personal-blog/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/personal-blog/app/Http/Controllers/Controller.php b/personal-blog/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..8677cd5c --- /dev/null +++ b/personal-blog/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ + $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/personal-blog/app/Http/Requests/Auth/LoginRequest.php b/personal-blog/app/Http/Requests/Auth/LoginRequest.php new file mode 100644 index 00000000..2b92f651 --- /dev/null +++ b/personal-blog/app/Http/Requests/Auth/LoginRequest.php @@ -0,0 +1,85 @@ + + */ + 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/personal-blog/app/Http/Requests/ProfileUpdateRequest.php b/personal-blog/app/Http/Requests/ProfileUpdateRequest.php new file mode 100644 index 00000000..93b0022e --- /dev/null +++ b/personal-blog/app/Http/Requests/ProfileUpdateRequest.php @@ -0,0 +1,23 @@ + + */ + 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/personal-blog/app/Models/User.php b/personal-blog/app/Models/User.php new file mode 100644 index 00000000..def621f4 --- /dev/null +++ b/personal-blog/app/Models/User.php @@ -0,0 +1,47 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + 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/personal-blog/app/Providers/AppServiceProvider.php b/personal-blog/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..452e6b65 --- /dev/null +++ b/personal-blog/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +handleCommand(new ArgvInput); + +exit($status); diff --git a/personal-blog/bootstrap/app.php b/personal-blog/bootstrap/app.php new file mode 100644 index 00000000..7b162dac --- /dev/null +++ b/personal-blog/bootstrap/app.php @@ -0,0 +1,18 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware) { + // + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); diff --git a/personal-blog/bootstrap/cache/.gitignore b/personal-blog/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/bootstrap/providers.php b/personal-blog/bootstrap/providers.php new file mode 100644 index 00000000..38b258d1 --- /dev/null +++ b/personal-blog/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.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-07-18T10:29:17+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "laravel/framework", + "version": "v11.19.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "5e103d499e9ee5bcfc184412d034c4e516b87085" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/5e103d499e9ee5bcfc184412d034c4e516b87085", + "reference": "5e103d499e9ee5bcfc184412d034c4e516b87085", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.18", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.2|^3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/finder": "^7.0", + "symfony/http-foundation": "^7.0", + "symfony/http-kernel": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^7.0", + "symfony/routing": "^7.0", + "symfony/uid": "^7.0", + "symfony/var-dumper": "^7.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "mockery/mockery": "1.6.8", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "ext-gmp": "*", + "fakerphp/faker": "^1.23", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.6", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^9.1.5", + "pda/pheanstalk": "^5.0", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "^10.5|^11.0", + "predis/predis": "^2.0.2", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0", + "symfony/http-client": "^7.0", + "symfony/psr-http-message-bridge": "^7.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.6).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-07-30T15:22:41+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.24", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "409b0b4305273472f3754826e68f4edbd0150149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", + "reference": "409b0b4305273472f3754826e68f4edbd0150149", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.24" + }, + "time": "2024-06-17T13:58:22+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-11-08T14:08:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.9.0" + }, + "time": "2024-01-04T16:10:04+00:00" + }, + { + "name": "league/commonmark", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/ac815920de0eff6de947eac0a6a94e5ed0fb147c", + "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c", + "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.0", + "commonmark/commonmark.js": "0.31.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-07-24T12:52:09+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.28.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" + }, + "time": "2024-05-22T10:09:12+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.28.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "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.28.0" + }, + "time": "2024-05-06T20:05:52+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-06-28T09:40:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cb4374784c87d0a0294e8513a52eb63c0aff3139", + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-07-16T22:29:20+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "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.1.0" + }, + "time": "2024-07-01T20:03:41+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.0.4" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^2.2.0", + "illuminate/console": "^11.0.0", + "laravel/pint": "^1.14.0", + "mockery/mockery": "^1.6.7", + "pestphp/pest": "^2.34.1", + "phpstan/phpstan": "^1.10.59", + "phpstan/phpstan-strict-rules": "^1.5.2", + "symfony/var-dumper": "^7.0.4", + "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.0.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": "2024-03-06T16:17:14+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.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.4", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + }, + "time": "2024-06-10T01:18:23+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", + "reference": "cb1dcb30ebc7005c29864ee78adb47b5fb7c3cd9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:41:01+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T13:02:51+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "717c6329886f32dc65e27461f80f2a465412fdca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/717c6329886f32dc65e27461f80f2a465412fdca", + "reference": "717c6329886f32dc65e27461f80f2a465412fdca", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-24T07:08:44+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "reference": "f602d5c17d1fa02f8019ace2687d9d136b7f4a1a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:41:01+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db9702f3a04cc471ec8c70e881825db26ac5f186", + "reference": "db9702f3a04cc471ec8c70e881825db26ac5f186", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T14:58:15+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8fcff0af9043c8f8a8e229437cea363e282f9aee", + "reference": "8fcff0af9043c8f8a8e229437cea363e282f9aee", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.1.2" + }, + "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-06-28T08:00:31+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "reference": "26a00b85477e69a4bab63b66c5dce64f18b0cbfc", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.1.2" + }, + "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-06-28T10:03:55+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.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-06-19T12:30:46+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "10112722600777e02d2745716b70c5db4ca70442" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.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-06-19T12:30:46+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.30.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-06-19T12:35:24+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.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-05-31T15:07:36+00:00" + }, + { + "name": "symfony/process", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "reference": "7f2f542c668ad6c313dc4a5e9c3321f733197eca", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:44:47+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", + "reference": "8a908a3f22d5a1b5d297578c2ceb41b02fa916d0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-17T06:10:24+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ea272a882be7f20cad58d5d78c215001617b7f07", + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-22T10:25:37+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:41:01+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/bb59febeecc81528ff672fad5dab7f06db8c8277", + "reference": "bb59febeecc81528ff672fad5dab7f06db8c8277", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:41:01+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^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.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/breeze", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/breeze.git", + "reference": "1446994ea5042e0b340e39f1e4629656de843058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/breeze/zipball/1446994ea5042e0b340e39f1e4629656de843058", + "reference": "1446994ea5042e0b340e39f1e4629656de843058", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0", + "illuminate/filesystem": "^11.0", + "illuminate/support": "^11.0", + "illuminate/validation": "^11.0", + "php": "^8.2.0", + "symfony/console": "^7.0" + }, + "require-dev": { + "orchestra/testbench": "^9.0", + "phpstan/phpstan": "^1.10" + }, + "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": "2024-07-17T13:05:17+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "b5b6f716db298671c1dfea5b1082ec2c0ae7064f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/b5b6f716db298671c1dfea5b1082ec2c0ae7064f", + "reference": "b5b6f716db298671c1dfea5b1082ec2c0ae7064f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.59.3", + "illuminate/view": "^10.48.12", + "larastan/larastan": "^2.9.7", + "laravel-zero/framework": "^10.4.0", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.34.8" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-08-01T09:06:33+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "48d89608a3bb5be763c9bb87121d31e7da27c1cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/48d89608a3bb5be763c9bb87121d31e7da27c1cb", + "reference": "48d89608a3bb5be763c9bb87121d31e7da27c1cb", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0", + "illuminate/support": "^9.52.16|^10.0|^11.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", + "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": "2024-07-22T14:36:50+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a", + "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.4", + "nunomaduro/termwind": "^2.0.1", + "php": "^8.2.0", + "symfony/console": "^7.1.3" + }, + "conflict": { + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" + }, + "require-dev": { + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.19.0", + "laravel/pint": "^1.17.1", + "laravel/sail": "^1.31.0", + "laravel/sanctum": "^4.0.2", + "laravel/tinker": "^2.9.0", + "orchestra/testbench-core": "^9.2.3", + "pestphp/pest": "^2.35.0 || ^3.0.0", + "sebastian/environment": "^6.1.0 || ^7.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-08-03T15:32:23+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": "phpunit/php-code-coverage", + "version": "11.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/19b6365ab8b59a64438c0c3f4241feeb480c9861", + "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-text-template": "^4.0", + "sebastian/code-unit-reverse-lookup": "^4.0", + "sebastian/complexity": "^4.0", + "sebastian/environment": "^7.0", + "sebastian/lines-of-code": "^3.0", + "sebastian/version": "^5.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "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-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/11.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:05:37+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6ed896bf50bbbfe4d504a33ed5886278c78e4a26", + "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26", + "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.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:06:37+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.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a8dce73a8938dfec7ac0daa91bdbcaae7d7188a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a8dce73a8938dfec7ac0daa91bdbcaae7d7188a3", + "reference": "a8dce73a8938dfec7ac0daa91bdbcaae7d7188a3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.5", + "phpunit/php-file-iterator": "^5.0.1", + "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.1", + "sebastian/comparator": "^6.0.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.1.3", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.0.1", + "sebastian/version": "^5.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.3-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.3.0" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-08-02T03:56:43+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.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "6bb7d09d6623567178cf54126afa9c2310114268" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6bb7d09d6623567178cf54126afa9c2310114268", + "reference": "6bb7d09d6623567178cf54126afa9c2310114268", + "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": "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.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:44:28+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.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "131942b86d3587291067a94f295498ab6ac79c20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/131942b86d3587291067a94f295498ab6ac79c20", + "reference": "131942b86d3587291067a94f295498ab6ac79c20", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^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" + }, + { + "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.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:48:07+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.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "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.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:54:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.2" + }, + "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.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:56:19+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.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb6a6566f9589e86661291d13eba708cce5eb4aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb6a6566f9589e86661291d13eba708cce5eb4aa", + "reference": "fb6a6566f9589e86661291d13eba708cce5eb4aa", + "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": "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.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:11:49+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/45c9debb7d039ce9b97de2f749c2cf5832a06ac4", + "reference": "45c9debb7d039ce9b97de2f749c2cf5832a06ac4", + "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.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:13:08+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "fa34c77015aa6720469db7003567b9f772492bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", + "reference": "fa34c77015aa6720469db7003567b9f772492bf2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "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/personal-blog/config/app.php b/personal-blog/config/app.php new file mode 100644 index 00000000..f4672673 --- /dev/null +++ b/personal-blog/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' => env('APP_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(',', 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/personal-blog/config/auth.php b/personal-blog/config/auth.php new file mode 100644 index 00000000..0ba5d5d8 --- /dev/null +++ b/personal-blog/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 amount 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/personal-blog/config/cache.php b/personal-blog/config/cache.php new file mode 100644 index 00000000..925f7d2e --- /dev/null +++ b/personal-blog/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(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/personal-blog/config/database.php b/personal-blog/config/database.php new file mode 100644 index 00000000..125949ed --- /dev/null +++ b/personal-blog/config/database.php @@ -0,0 +1,173 @@ + 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(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + '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/personal-blog/config/filesystems.php b/personal-blog/config/filesystems.php new file mode 100644 index 00000000..c5f244d7 --- /dev/null +++ b/personal-blog/config/filesystems.php @@ -0,0 +1,76 @@ + 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'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + '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, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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/personal-blog/config/logging.php b/personal-blog/config/logging.php new file mode 100644 index 00000000..8d94292b --- /dev/null +++ b/personal-blog/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(',', 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, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + '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/personal-blog/config/mail.php b/personal-blog/config/mail.php new file mode 100644 index 00000000..df13d3df --- /dev/null +++ b/personal-blog/config/mail.php @@ -0,0 +1,116 @@ + 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', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(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', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | 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/personal-blog/config/queue.php b/personal-blog/config/queue.php new file mode 100644 index 00000000..116bd8d0 --- /dev/null +++ b/personal-blog/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/personal-blog/config/services.php b/personal-blog/config/services.php new file mode 100644 index 00000000..27a36175 --- /dev/null +++ b/personal-blog/config/services.php @@ -0,0 +1,38 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/personal-blog/config/session.php b/personal-blog/config/session.php new file mode 100644 index 00000000..f0b6541e --- /dev/null +++ b/personal-blog/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' => 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: "apc", "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/personal-blog/database/.gitignore b/personal-blog/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/personal-blog/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/personal-blog/database/factories/UserFactory.php b/personal-blog/database/factories/UserFactory.php new file mode 100644 index 00000000..584104c9 --- /dev/null +++ b/personal-blog/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/personal-blog/database/migrations/0001_01_01_000000_create_users_table.php b/personal-blog/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 00000000..05fb5d9e --- /dev/null +++ b/personal-blog/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/personal-blog/database/migrations/0001_01_01_000001_create_cache_table.php b/personal-blog/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 00000000..b9c106be --- /dev/null +++ b/personal-blog/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/personal-blog/database/migrations/0001_01_01_000002_create_jobs_table.php b/personal-blog/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 00000000..425e7058 --- /dev/null +++ b/personal-blog/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/personal-blog/database/seeders/DatabaseSeeder.php b/personal-blog/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000..d01a0ef2 --- /dev/null +++ b/personal-blog/database/seeders/DatabaseSeeder.php @@ -0,0 +1,23 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/personal-blog/package.json b/personal-blog/package.json new file mode 100644 index 00000000..e158669d --- /dev/null +++ b/personal-blog/package.json @@ -0,0 +1,18 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.2", + "alpinejs": "^3.4.2", + "autoprefixer": "^10.4.2", + "axios": "^1.6.4", + "laravel-vite-plugin": "^1.0", + "postcss": "^8.4.31", + "tailwindcss": "^3.1.0", + "vite": "^5.0" + } +} diff --git a/personal-blog/phpunit.xml b/personal-blog/phpunit.xml new file mode 100644 index 00000000..506b9a38 --- /dev/null +++ b/personal-blog/phpunit.xml @@ -0,0 +1,33 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + diff --git a/personal-blog/postcss.config.js b/personal-blog/postcss.config.js new file mode 100644 index 00000000..49c0612d --- /dev/null +++ b/personal-blog/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/personal-blog/public/.htaccess b/personal-blog/public/.htaccess new file mode 100644 index 00000000..3aec5e27 --- /dev/null +++ b/personal-blog/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # 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/personal-blog/public/favicon.ico b/personal-blog/public/favicon.ico new file mode 100644 index 00000000..e69de29b diff --git a/personal-blog/public/index.php b/personal-blog/public/index.php new file mode 100644 index 00000000..947d9896 --- /dev/null +++ b/personal-blog/public/index.php @@ -0,0 +1,17 @@ +handleRequest(Request::capture()); diff --git a/personal-blog/public/robots.txt b/personal-blog/public/robots.txt new file mode 100644 index 00000000..eb053628 --- /dev/null +++ b/personal-blog/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/personal-blog/resources/css/app.css b/personal-blog/resources/css/app.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/personal-blog/resources/css/app.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/personal-blog/resources/js/app.js b/personal-blog/resources/js/app.js new file mode 100644 index 00000000..a8093bee --- /dev/null +++ b/personal-blog/resources/js/app.js @@ -0,0 +1,7 @@ +import './bootstrap'; + +import Alpine from 'alpinejs'; + +window.Alpine = Alpine; + +Alpine.start(); diff --git a/personal-blog/resources/js/bootstrap.js b/personal-blog/resources/js/bootstrap.js new file mode 100644 index 00000000..5f1390b0 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/auth/confirm-password.blade.php b/personal-blog/resources/views/auth/confirm-password.blade.php new file mode 100644 index 00000000..3cbbe083 --- /dev/null +++ b/personal-blog/resources/views/auth/confirm-password.blade.php @@ -0,0 +1,27 @@ + +
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} +
+ +
+ @csrf + + +
+ + + + + +
+ +
+ + {{ __('Confirm') }} + +
+
+
diff --git a/personal-blog/resources/views/auth/forgot-password.blade.php b/personal-blog/resources/views/auth/forgot-password.blade.php new file mode 100644 index 00000000..3c707887 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/auth/login.blade.php b/personal-blog/resources/views/auth/login.blade.php new file mode 100644 index 00000000..80e1b392 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/auth/register.blade.php b/personal-blog/resources/views/auth/register.blade.php new file mode 100644 index 00000000..d4b3d589 --- /dev/null +++ b/personal-blog/resources/views/auth/register.blade.php @@ -0,0 +1,52 @@ + +
+ @csrf + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Already registered?') }} + + + + {{ __('Register') }} + +
+
+
diff --git a/personal-blog/resources/views/auth/reset-password.blade.php b/personal-blog/resources/views/auth/reset-password.blade.php new file mode 100644 index 00000000..a6494cca --- /dev/null +++ b/personal-blog/resources/views/auth/reset-password.blade.php @@ -0,0 +1,39 @@ + +
+ @csrf + + + + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
diff --git a/personal-blog/resources/views/auth/verify-email.blade.php b/personal-blog/resources/views/auth/verify-email.blade.php new file mode 100644 index 00000000..4e4222f4 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/application-logo.blade.php b/personal-blog/resources/views/components/application-logo.blade.php new file mode 100644 index 00000000..46579cf0 --- /dev/null +++ b/personal-blog/resources/views/components/application-logo.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/personal-blog/resources/views/components/auth-session-status.blade.php b/personal-blog/resources/views/components/auth-session-status.blade.php new file mode 100644 index 00000000..a39bc7d2 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/danger-button.blade.php b/personal-blog/resources/views/components/danger-button.blade.php new file mode 100644 index 00000000..d7417b21 --- /dev/null +++ b/personal-blog/resources/views/components/danger-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/personal-blog/resources/views/components/dropdown-link.blade.php b/personal-blog/resources/views/components/dropdown-link.blade.php new file mode 100644 index 00000000..6d5279d8 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/dropdown.blade.php b/personal-blog/resources/views/components/dropdown.blade.php new file mode 100644 index 00000000..e4106a4e --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/input-error.blade.php b/personal-blog/resources/views/components/input-error.blade.php new file mode 100644 index 00000000..ad95f6b5 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/input-label.blade.php b/personal-blog/resources/views/components/input-label.blade.php new file mode 100644 index 00000000..e93b059a --- /dev/null +++ b/personal-blog/resources/views/components/input-label.blade.php @@ -0,0 +1,5 @@ +@props(['value']) + + diff --git a/personal-blog/resources/views/components/modal.blade.php b/personal-blog/resources/views/components/modal.blade.php new file mode 100644 index 00000000..384662a1 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/nav-link.blade.php b/personal-blog/resources/views/components/nav-link.blade.php new file mode 100644 index 00000000..37bad554 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/primary-button.blade.php b/personal-blog/resources/views/components/primary-button.blade.php new file mode 100644 index 00000000..99bf3890 --- /dev/null +++ b/personal-blog/resources/views/components/primary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/personal-blog/resources/views/components/responsive-nav-link.blade.php b/personal-blog/resources/views/components/responsive-nav-link.blade.php new file mode 100644 index 00000000..98b55d19 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/components/secondary-button.blade.php b/personal-blog/resources/views/components/secondary-button.blade.php new file mode 100644 index 00000000..fa1c5491 --- /dev/null +++ b/personal-blog/resources/views/components/secondary-button.blade.php @@ -0,0 +1,3 @@ + diff --git a/personal-blog/resources/views/components/text-input.blade.php b/personal-blog/resources/views/components/text-input.blade.php new file mode 100644 index 00000000..7779a13a --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/dashboard.blade.php b/personal-blog/resources/views/dashboard.blade.php new file mode 100644 index 00000000..4024c64a --- /dev/null +++ b/personal-blog/resources/views/dashboard.blade.php @@ -0,0 +1,17 @@ + + +

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

+
+ +
+
+
+
+ {{ __("You're logged in!") }} +
+
+
+
+
diff --git a/personal-blog/resources/views/layouts/app.blade.php b/personal-blog/resources/views/layouts/app.blade.php new file mode 100644 index 00000000..0a471a4d --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/layouts/guest.blade.php b/personal-blog/resources/views/layouts/guest.blade.php new file mode 100644 index 00000000..4b369b63 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/layouts/navigation.blade.php b/personal-blog/resources/views/layouts/navigation.blade.php new file mode 100644 index 00000000..c64bf646 --- /dev/null +++ b/personal-blog/resources/views/layouts/navigation.blade.php @@ -0,0 +1,100 @@ + diff --git a/personal-blog/resources/views/profile/edit.blade.php b/personal-blog/resources/views/profile/edit.blade.php new file mode 100644 index 00000000..ef699107 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/profile/partials/delete-user-form.blade.php b/personal-blog/resources/views/profile/partials/delete-user-form.blade.php new file mode 100644 index 00000000..b3a63820 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/profile/partials/update-password-form.blade.php b/personal-blog/resources/views/profile/partials/update-password-form.blade.php new file mode 100644 index 00000000..acd200d7 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/profile/partials/update-profile-information-form.blade.php b/personal-blog/resources/views/profile/partials/update-profile-information-form.blade.php new file mode 100644 index 00000000..7273fff3 --- /dev/null +++ b/personal-blog/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/personal-blog/resources/views/welcome.blade.php b/personal-blog/resources/views/welcome.blade.php new file mode 100644 index 00000000..a9898e33 --- /dev/null +++ b/personal-blog/resources/views/welcome.blade.php @@ -0,0 +1,172 @@ + + + + + + + Laravel + + + + + + + + + + + + diff --git a/personal-blog/routes/auth.php b/personal-blog/routes/auth.php new file mode 100644 index 00000000..1040b517 --- /dev/null +++ b/personal-blog/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/personal-blog/routes/console.php b/personal-blog/routes/console.php new file mode 100644 index 00000000..eff2ed24 --- /dev/null +++ b/personal-blog/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote')->hourly(); diff --git a/personal-blog/routes/web.php b/personal-blog/routes/web.php new file mode 100644 index 00000000..74bb7cac --- /dev/null +++ b/personal-blog/routes/web.php @@ -0,0 +1,20 @@ +middleware(['auth', 'verified'])->name('dashboard'); + +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/personal-blog/storage/app/.gitignore b/personal-blog/storage/app/.gitignore new file mode 100644 index 00000000..8f4803c0 --- /dev/null +++ b/personal-blog/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/personal-blog/storage/app/public/.gitignore b/personal-blog/storage/app/public/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/storage/framework/.gitignore b/personal-blog/storage/framework/.gitignore new file mode 100644 index 00000000..05c4471f --- /dev/null +++ b/personal-blog/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/personal-blog/storage/framework/cache/.gitignore b/personal-blog/storage/framework/cache/.gitignore new file mode 100644 index 00000000..01e4a6cd --- /dev/null +++ b/personal-blog/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/personal-blog/storage/framework/cache/data/.gitignore b/personal-blog/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/storage/framework/sessions/.gitignore b/personal-blog/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/storage/framework/testing/.gitignore b/personal-blog/storage/framework/testing/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/storage/framework/views/.gitignore b/personal-blog/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/storage/logs/.gitignore b/personal-blog/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/personal-blog/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/personal-blog/tailwind.config.js b/personal-blog/tailwind.config.js new file mode 100644 index 00000000..c29eb1a1 --- /dev/null +++ b/personal-blog/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/personal-blog/tests/Feature/Auth/AuthenticationTest.php b/personal-blog/tests/Feature/Auth/AuthenticationTest.php new file mode 100644 index 00000000..13dcb7ce --- /dev/null +++ b/personal-blog/tests/Feature/Auth/AuthenticationTest.php @@ -0,0 +1,54 @@ +get('/login'); + + $response->assertStatus(200); + } + + public function test_users_can_authenticate_using_the_login_screen(): void + { + $user = User::factory()->create(); + + $response = $this->post('/login', [ + 'email' => $user->email, + 'password' => 'password', + ]); + + $this->assertAuthenticated(); + $response->assertRedirect(route('dashboard', absolute: false)); + } + + public function test_users_can_not_authenticate_with_invalid_password(): void + { + $user = User::factory()->create(); + + $this->post('/login', [ + 'email' => $user->email, + 'password' => 'wrong-password', + ]); + + $this->assertGuest(); + } + + public function test_users_can_logout(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/logout'); + + $this->assertGuest(); + $response->assertRedirect('/'); + } +} diff --git a/personal-blog/tests/Feature/Auth/EmailVerificationTest.php b/personal-blog/tests/Feature/Auth/EmailVerificationTest.php new file mode 100644 index 00000000..705570b4 --- /dev/null +++ b/personal-blog/tests/Feature/Auth/EmailVerificationTest.php @@ -0,0 +1,58 @@ +unverified()->create(); + + $response = $this->actingAs($user)->get('/verify-email'); + + $response->assertStatus(200); + } + + public function test_email_can_be_verified(): void + { + $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); + $this->assertTrue($user->fresh()->hasVerifiedEmail()); + $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); + } + + public function test_email_is_not_verified_with_invalid_hash(): void + { + $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); + + $this->assertFalse($user->fresh()->hasVerifiedEmail()); + } +} diff --git a/personal-blog/tests/Feature/Auth/PasswordConfirmationTest.php b/personal-blog/tests/Feature/Auth/PasswordConfirmationTest.php new file mode 100644 index 00000000..ff85721e --- /dev/null +++ b/personal-blog/tests/Feature/Auth/PasswordConfirmationTest.php @@ -0,0 +1,44 @@ +create(); + + $response = $this->actingAs($user)->get('/confirm-password'); + + $response->assertStatus(200); + } + + public function test_password_can_be_confirmed(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'password', + ]); + + $response->assertRedirect(); + $response->assertSessionHasNoErrors(); + } + + public function test_password_is_not_confirmed_with_invalid_password(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->post('/confirm-password', [ + 'password' => 'wrong-password', + ]); + + $response->assertSessionHasErrors(); + } +} diff --git a/personal-blog/tests/Feature/Auth/PasswordResetTest.php b/personal-blog/tests/Feature/Auth/PasswordResetTest.php new file mode 100644 index 00000000..aa503505 --- /dev/null +++ b/personal-blog/tests/Feature/Auth/PasswordResetTest.php @@ -0,0 +1,73 @@ +get('/forgot-password'); + + $response->assertStatus(200); + } + + public function test_reset_password_link_can_be_requested(): void + { + Notification::fake(); + + $user = User::factory()->create(); + + $this->post('/forgot-password', ['email' => $user->email]); + + Notification::assertSentTo($user, ResetPassword::class); + } + + public function test_reset_password_screen_can_be_rendered(): void + { + 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; + }); + } + + public function test_password_can_be_reset_with_valid_token(): void + { + 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/personal-blog/tests/Feature/Auth/PasswordUpdateTest.php b/personal-blog/tests/Feature/Auth/PasswordUpdateTest.php new file mode 100644 index 00000000..ca28c6c6 --- /dev/null +++ b/personal-blog/tests/Feature/Auth/PasswordUpdateTest.php @@ -0,0 +1,51 @@ +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)); + } + + public function test_correct_password_must_be_provided_to_update_password(): void + { + $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/personal-blog/tests/Feature/Auth/RegistrationTest.php b/personal-blog/tests/Feature/Auth/RegistrationTest.php new file mode 100644 index 00000000..1489d0e0 --- /dev/null +++ b/personal-blog/tests/Feature/Auth/RegistrationTest.php @@ -0,0 +1,31 @@ +get('/register'); + + $response->assertStatus(200); + } + + public function test_new_users_can_register(): void + { + $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/personal-blog/tests/Feature/ExampleTest.php b/personal-blog/tests/Feature/ExampleTest.php new file mode 100644 index 00000000..8364a84e --- /dev/null +++ b/personal-blog/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/personal-blog/tests/Feature/ProfileTest.php b/personal-blog/tests/Feature/ProfileTest.php new file mode 100644 index 00000000..252fdcc5 --- /dev/null +++ b/personal-blog/tests/Feature/ProfileTest.php @@ -0,0 +1,99 @@ +create(); + + $response = $this + ->actingAs($user) + ->get('/profile'); + + $response->assertOk(); + } + + public function test_profile_information_can_be_updated(): void + { + $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); + } + + public function test_email_verification_status_is_unchanged_when_the_email_address_is_unchanged(): void + { + $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); + } + + public function test_user_can_delete_their_account(): void + { + $user = User::factory()->create(); + + $response = $this + ->actingAs($user) + ->delete('/profile', [ + 'password' => 'password', + ]); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect('/'); + + $this->assertGuest(); + $this->assertNull($user->fresh()); + } + + public function test_correct_password_must_be_provided_to_delete_account(): void + { + $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/personal-blog/tests/TestCase.php b/personal-blog/tests/TestCase.php new file mode 100644 index 00000000..fe1ffc2f --- /dev/null +++ b/personal-blog/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/personal-blog/vite.config.js b/personal-blog/vite.config.js new file mode 100644 index 00000000..89f26f5d --- /dev/null +++ b/personal-blog/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: [ + 'resources/css/app.css', + 'resources/js/app.js', + ], + refresh: true, + }), + ], +}); From 14bc669fedbe13c6cb3db31412973aada6af67b3 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 19:07:51 +0330 Subject: [PATCH 02/16] Initialize Models and Migrations --- personal-blog/app/Models/Article.php | 11 ++++++++ personal-blog/app/Models/Category.php | 11 ++++++++ personal-blog/app/Models/Tag.php | 11 ++++++++ ...024_08_05_153308_create_articles_table.php | 27 +++++++++++++++++++ ...4_08_05_153337_create_categories_table.php | 27 +++++++++++++++++++ .../2024_08_05_153345_create_tags_table.php | 27 +++++++++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 personal-blog/app/Models/Article.php create mode 100644 personal-blog/app/Models/Category.php create mode 100644 personal-blog/app/Models/Tag.php create mode 100644 personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php create mode 100644 personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php create mode 100644 personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php diff --git a/personal-blog/app/Models/Article.php b/personal-blog/app/Models/Article.php new file mode 100644 index 00000000..c1255f57 --- /dev/null +++ b/personal-blog/app/Models/Article.php @@ -0,0 +1,11 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('articles'); + } +}; diff --git a/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php b/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php new file mode 100644 index 00000000..24c15326 --- /dev/null +++ b/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php b/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php new file mode 100644 index 00000000..85f6a529 --- /dev/null +++ b/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tags'); + } +}; From 29f9b9391363dd4585b49f4ba478d738e232295d Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 19:15:04 +0330 Subject: [PATCH 03/16] Setup Migrations --- .idea/inspectionProfiles/Project_Default.xml | 13 +++++++++++++ .../2024_08_05_153308_create_articles_table.php | 4 ++++ .../2024_08_05_153337_create_categories_table.php | 1 + .../2024_08_05_153345_create_tags_table.php | 4 ++-- 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..a95673a2 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php b/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php index a08eb852..8868791b 100644 --- a/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php +++ b/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php @@ -13,6 +13,10 @@ public function up(): void { Schema::create('articles', function (Blueprint $table) { $table->id(); + $table->string('title'); + $table->string('body'); + $table->string('image')->nullable(); + $table->softDeletes(); $table->timestamps(); }); } diff --git a/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php b/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php index 24c15326..d18e4b9a 100644 --- a/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php +++ b/personal-blog/database/migrations/2024_08_05_153337_create_categories_table.php @@ -13,6 +13,7 @@ public function up(): void { Schema::create('categories', function (Blueprint $table) { $table->id(); + $table->string('name')->unique(); $table->timestamps(); }); } diff --git a/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php b/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php index 85f6a529..ffb6a404 100644 --- a/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php +++ b/personal-blog/database/migrations/2024_08_05_153345_create_tags_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { /** * Run the migrations. */ @@ -13,6 +12,7 @@ public function up(): void { Schema::create('tags', function (Blueprint $table) { $table->id(); + $table->string('name')->unique(); $table->timestamps(); }); } From ab7d402027eb1114e64cf93f8be4ba4c5ffc8131 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 19:53:49 +0330 Subject: [PATCH 04/16] Setup Relations in Models --- .idea/easycode/codebase-v2.xml | 6 ++++ personal-blog/app/Models/Article.php | 17 ++++++++++ personal-blog/app/Models/Category.php | 6 ++++ personal-blog/app/Models/Tag.php | 6 ++++ personal-blog/app/Models/User.php | 6 ++++ ...024_08_05_153308_create_articles_table.php | 2 ++ .../2024_08_05_162125_article_tag.php | 31 +++++++++++++++++++ 7 files changed, 74 insertions(+) create mode 100644 .idea/easycode/codebase-v2.xml create mode 100644 personal-blog/database/migrations/2024_08_05_162125_article_tag.php diff --git a/.idea/easycode/codebase-v2.xml b/.idea/easycode/codebase-v2.xml new file mode 100644 index 00000000..2604433f --- /dev/null +++ b/.idea/easycode/codebase-v2.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/personal-blog/app/Models/Article.php b/personal-blog/app/Models/Article.php index c1255f57..fb594ef9 100644 --- a/personal-blog/app/Models/Article.php +++ b/personal-blog/app/Models/Article.php @@ -4,8 +4,25 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; class Article extends Model { use HasFactory; + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + public function category(): BelongsTo + { + return $this->belongsTo(Category::class); + } + + public function tags(): HasMany + { + return $this->hasMany(Tag::class); + } } diff --git a/personal-blog/app/Models/Category.php b/personal-blog/app/Models/Category.php index c9d62223..66a209d4 100644 --- a/personal-blog/app/Models/Category.php +++ b/personal-blog/app/Models/Category.php @@ -4,8 +4,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; class Category extends Model { use HasFactory; + + public function articles(): HasMany + { + return $this->hasMany(Article::class); + } } diff --git a/personal-blog/app/Models/Tag.php b/personal-blog/app/Models/Tag.php index 6b7af87c..55ddf228 100644 --- a/personal-blog/app/Models/Tag.php +++ b/personal-blog/app/Models/Tag.php @@ -4,8 +4,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Tag extends Model { use HasFactory; + + public function articles(): BelongsToMany + { + return $this->belongsToMany(Article::class,'article_tag'); + } } diff --git a/personal-blog/app/Models/User.php b/personal-blog/app/Models/User.php index def621f4..9e2ac3cf 100644 --- a/personal-blog/app/Models/User.php +++ b/personal-blog/app/Models/User.php @@ -4,6 +4,7 @@ // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -44,4 +45,9 @@ protected function casts(): array 'password' => 'hashed', ]; } + + public function articles(): HasMany + { + return $this->hasMany(Article::class); + } } diff --git a/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php b/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php index 8868791b..9d03dd80 100644 --- a/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php +++ b/personal-blog/database/migrations/2024_08_05_153308_create_articles_table.php @@ -13,6 +13,8 @@ public function up(): void { Schema::create('articles', function (Blueprint $table) { $table->id(); + $table->foreignId('user_id'); + $table->foreignId('category_id'); $table->string('title'); $table->string('body'); $table->string('image')->nullable(); diff --git a/personal-blog/database/migrations/2024_08_05_162125_article_tag.php b/personal-blog/database/migrations/2024_08_05_162125_article_tag.php new file mode 100644 index 00000000..c6ebb29d --- /dev/null +++ b/personal-blog/database/migrations/2024_08_05_162125_article_tag.php @@ -0,0 +1,31 @@ +primary(['article_id','tag_id']); + $table->foreignId('article_id'); + $table->foreignId('tag_id'); + $table->timestamps(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('article_tag'); + + } +}; From 7ee4ffe9d4366452c2285a4753ec1066eaf60087 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 21:02:14 +0330 Subject: [PATCH 05/16] fix some issues about tag relationship --- personal-blog/app/Models/Article.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/personal-blog/app/Models/Article.php b/personal-blog/app/Models/Article.php index fb594ef9..da923233 100644 --- a/personal-blog/app/Models/Article.php +++ b/personal-blog/app/Models/Article.php @@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Article extends Model { @@ -21,8 +21,8 @@ public function category(): BelongsTo return $this->belongsTo(Category::class); } - public function tags(): HasMany + public function tags(): BelongsToMany { - return $this->hasMany(Tag::class); + return $this->belongsToMany(Tag::class,'article_tag'); } } From d2ee1f882f83f1eec2b12a4a52e96167f0e46862 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 21:04:01 +0330 Subject: [PATCH 06/16] create test for relationships --- .../database/factories/ArticleFactory.php | 28 ++++++++++ .../database/factories/CategoryFactory.php | 23 ++++++++ .../database/factories/TagFactory.php | 23 ++++++++ ... 2024_08_05_162125_create_article_tag.php} | 0 .../tests/Feature/RelationshipTest.php | 52 +++++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 personal-blog/database/factories/ArticleFactory.php create mode 100644 personal-blog/database/factories/CategoryFactory.php create mode 100644 personal-blog/database/factories/TagFactory.php rename personal-blog/database/migrations/{2024_08_05_162125_article_tag.php => 2024_08_05_162125_create_article_tag.php} (100%) create mode 100644 personal-blog/tests/Feature/RelationshipTest.php diff --git a/personal-blog/database/factories/ArticleFactory.php b/personal-blog/database/factories/ArticleFactory.php new file mode 100644 index 00000000..69127e2a --- /dev/null +++ b/personal-blog/database/factories/ArticleFactory.php @@ -0,0 +1,28 @@ + + */ +class ArticleFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'title' => fake()->title, + 'body' => fake()->text, + 'user_id' => User::factory(), + 'category_id' => Category::factory(), + ]; + } +} diff --git a/personal-blog/database/factories/CategoryFactory.php b/personal-blog/database/factories/CategoryFactory.php new file mode 100644 index 00000000..f7e44fad --- /dev/null +++ b/personal-blog/database/factories/CategoryFactory.php @@ -0,0 +1,23 @@ + + */ +class CategoryFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->unique()->name, + ]; + } +} diff --git a/personal-blog/database/factories/TagFactory.php b/personal-blog/database/factories/TagFactory.php new file mode 100644 index 00000000..d455b934 --- /dev/null +++ b/personal-blog/database/factories/TagFactory.php @@ -0,0 +1,23 @@ + + */ +class TagFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->unique()->name, + ]; + } +} diff --git a/personal-blog/database/migrations/2024_08_05_162125_article_tag.php b/personal-blog/database/migrations/2024_08_05_162125_create_article_tag.php similarity index 100% rename from personal-blog/database/migrations/2024_08_05_162125_article_tag.php rename to personal-blog/database/migrations/2024_08_05_162125_create_article_tag.php diff --git a/personal-blog/tests/Feature/RelationshipTest.php b/personal-blog/tests/Feature/RelationshipTest.php new file mode 100644 index 00000000..ce5007c9 --- /dev/null +++ b/personal-blog/tests/Feature/RelationshipTest.php @@ -0,0 +1,52 @@ +create()[0]; + $article = Article::factory(1)->create([ + 'user_id' => $user->id, + ]); + + $this->assertInstanceOf(Article::class, $user->articles()->get()->first()); + + $this->assertCount(1, $user->articles()->get()); + } + + public function test_a_article_has_a_category(): void + { + $category = Category::factory()->create(); + $article = Article::factory()->create([ + 'category_id' => $category->id, + ]); + + $this->assertInstanceOf(Category::class, $article->category); + + $this->assertTrue($article->category->is($category)); + } + + public function test_a_article_has_a_tag(): void + { + $article = Article::factory()->create(); + $tag = Tag::factory()->create(); + $article->tags()->attach($tag->id); + + + $this->assertTrue($article->tags()->first()->is($tag)); + $this->assertTrue($tag->articles()->first()->is($article)); + } +} From 00b8b0cd6e58675a48380d5a139e0a22c7b8acb2 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Mon, 5 Aug 2024 21:06:49 +0330 Subject: [PATCH 07/16] add property fillable to models --- personal-blog/app/Models/Article.php | 2 ++ personal-blog/app/Models/Category.php | 2 ++ personal-blog/app/Models/Tag.php | 1 + 3 files changed, 5 insertions(+) diff --git a/personal-blog/app/Models/Article.php b/personal-blog/app/Models/Article.php index da923233..2406577b 100644 --- a/personal-blog/app/Models/Article.php +++ b/personal-blog/app/Models/Article.php @@ -10,6 +10,8 @@ class Article extends Model { use HasFactory; + protected $fillable = ['title','body','image']; + public function user(): BelongsTo { diff --git a/personal-blog/app/Models/Category.php b/personal-blog/app/Models/Category.php index 66a209d4..45c187f2 100644 --- a/personal-blog/app/Models/Category.php +++ b/personal-blog/app/Models/Category.php @@ -9,6 +9,8 @@ class Category extends Model { use HasFactory; + protected $fillable = ['name']; + public function articles(): HasMany { diff --git a/personal-blog/app/Models/Tag.php b/personal-blog/app/Models/Tag.php index 55ddf228..310b7106 100644 --- a/personal-blog/app/Models/Tag.php +++ b/personal-blog/app/Models/Tag.php @@ -9,6 +9,7 @@ class Tag extends Model { use HasFactory; + protected $fillable = ['name']; public function articles(): BelongsToMany { From 529c53927cb50516e3bfe246b0a39f2bdd5f1c96 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Tue, 6 Aug 2024 13:52:07 +0330 Subject: [PATCH 08/16] setup routes & controllers & views and Complete HomePage --- .idea/laravel-idea.xml | 18 + .../Http/Controllers/ArticleController.php | 69 + .../Http/Controllers/CategoryController.php | 65 + .../app/Http/Controllers/TagController.php | 65 + personal-blog/package-lock.json | 2438 +++++++++++++++++ personal-blog/package.json | 6 +- .../resources/views/aboutMe.blade.php | 3 + .../resources/views/article/index.blade.php | 7 + .../views/components/card-article.blade.php | 15 + .../resources/views/layouts/main.blade.php | 56 + personal-blog/routes/auth.php | 29 +- personal-blog/routes/web.php | 29 +- personal-blog/tailwind.config.js | 6 +- 13 files changed, 2779 insertions(+), 27 deletions(-) create mode 100644 .idea/laravel-idea.xml create mode 100644 personal-blog/app/Http/Controllers/ArticleController.php create mode 100644 personal-blog/app/Http/Controllers/CategoryController.php create mode 100644 personal-blog/app/Http/Controllers/TagController.php create mode 100644 personal-blog/package-lock.json create mode 100644 personal-blog/resources/views/aboutMe.blade.php create mode 100644 personal-blog/resources/views/article/index.blade.php create mode 100644 personal-blog/resources/views/components/card-article.blade.php create mode 100644 personal-blog/resources/views/layouts/main.blade.php diff --git a/.idea/laravel-idea.xml b/.idea/laravel-idea.xml new file mode 100644 index 00000000..56caaeab --- /dev/null +++ b/.idea/laravel-idea.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/personal-blog/app/Http/Controllers/ArticleController.php b/personal-blog/app/Http/Controllers/ArticleController.php new file mode 100644 index 00000000..b7056962 --- /dev/null +++ b/personal-blog/app/Http/Controllers/ArticleController.php @@ -0,0 +1,69 @@ +paginate(5); + + return view('article.index',[ + 'articles' => $articles, + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/personal-blog/app/Http/Controllers/CategoryController.php b/personal-blog/app/Http/Controllers/CategoryController.php new file mode 100644 index 00000000..8fdbe565 --- /dev/null +++ b/personal-blog/app/Http/Controllers/CategoryController.php @@ -0,0 +1,65 @@ +=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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, + "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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "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, + "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, + "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, + "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, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "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 + }, + "node_modules/alpinejs": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.1.tgz", + "integrity": "sha512-ICar8UsnRZAYvv/fCNfNeKMXNoXGUfwHrjx7LqXd08zIP95G2d9bAOuaL97re+1mgt/HojqHsfdOLo/A5LuWgQ==", + "dev": true, + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/alpinejs/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, + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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, + "engines": { + "node": ">=12" + }, + "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 + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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 + }, + "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 + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "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" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.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.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "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 + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "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, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "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" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "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" + } + ] + }, + "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, + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "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 + }, + "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, + "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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "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, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=0.4.0" + } + }, + "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 + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "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 + }, + "node_modules/electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "dev": true + }, + "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 + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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.4" + }, + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "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, + "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==", + "dev": true, + "hasInstallScript": true, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "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, + "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, + "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, + "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, + "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 + }, + "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, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.5.tgz", + "integrity": "sha512-Zv+to82YLBknDCZ6g3iwOv9wZ7f6EWStb9pjSm7MGe9Mfoy5ynT2ssZbGsMr1udU6rDg9HOoYEVGw5Qf+p9zbw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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 + }, + "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 + }, + "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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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, + "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, + "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, + "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, + "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, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "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, + "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, + "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, + "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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "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, + "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 + }, + "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, + "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.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "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, + "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, + "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" + } + ], + "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-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "dev": true, + "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 + }, + "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 + }, + "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" + } + ] + }, + "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, + "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, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "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/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, + "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/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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 + }, + "node_modules/string-width-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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, + "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, + "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-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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", + "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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, + "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, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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 + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "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" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.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 + }, + "node_modules/vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "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, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "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/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, + "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/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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 + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/personal-blog/package.json b/personal-blog/package.json index e158669d..9d2bd22e 100644 --- a/personal-blog/package.json +++ b/personal-blog/package.json @@ -8,11 +8,11 @@ "devDependencies": { "@tailwindcss/forms": "^0.5.2", "alpinejs": "^3.4.2", - "autoprefixer": "^10.4.2", + "autoprefixer": "^10.4.20", "axios": "^1.6.4", "laravel-vite-plugin": "^1.0", - "postcss": "^8.4.31", - "tailwindcss": "^3.1.0", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.7", "vite": "^5.0" } } diff --git a/personal-blog/resources/views/aboutMe.blade.php b/personal-blog/resources/views/aboutMe.blade.php new file mode 100644 index 00000000..77a4286e --- /dev/null +++ b/personal-blog/resources/views/aboutMe.blade.php @@ -0,0 +1,3 @@ +
+ +
diff --git a/personal-blog/resources/views/article/index.blade.php b/personal-blog/resources/views/article/index.blade.php new file mode 100644 index 00000000..803569b2 --- /dev/null +++ b/personal-blog/resources/views/article/index.blade.php @@ -0,0 +1,7 @@ +@component('layouts.main') +
+ @foreach($articles as $article) + + @endforeach +
+@endcomponent diff --git a/personal-blog/resources/views/components/card-article.blade.php b/personal-blog/resources/views/components/card-article.blade.php new file mode 100644 index 00000000..aa242a7b --- /dev/null +++ b/personal-blog/resources/views/components/card-article.blade.php @@ -0,0 +1,15 @@ +
+ @isset($article->image) + {{ $article->title }} + @endisset + +
{{ $article->title }}
+
+

{{ $article->body }}

+ + Read more + + +
diff --git a/personal-blog/resources/views/layouts/main.blade.php b/personal-blog/resources/views/layouts/main.blade.php new file mode 100644 index 00000000..f3eaaa0c --- /dev/null +++ b/personal-blog/resources/views/layouts/main.blade.php @@ -0,0 +1,56 @@ + + + + + + + Personal Blog + + + + + + + + + + + @vite('resources/css/app.css') + + + +
+

+ Personal Blog +

+ + @if (Route::has('login')) + + @endif +
+{{ $slot }} + + diff --git a/personal-blog/routes/auth.php b/personal-blog/routes/auth.php index 1040b517..eba74dbe 100644 --- a/personal-blog/routes/auth.php +++ b/personal-blog/routes/auth.php @@ -12,48 +12,43 @@ use Illuminate\Support\Facades\Route; Route::middleware('guest')->group(function () { - Route::get('register', [RegisteredUserController::class, 'create']) - ->name('register'); - - Route::post('register', [RegisteredUserController::class, 'store']); - Route::get('login', [AuthenticatedSessionController::class, 'create']) - ->name('login'); + ->name('login'); Route::post('login', [AuthenticatedSessionController::class, 'store']); Route::get('forgot-password', [PasswordResetLinkController::class, 'create']) - ->name('password.request'); + ->name('password.request'); Route::post('forgot-password', [PasswordResetLinkController::class, 'store']) - ->name('password.email'); + ->name('password.email'); Route::get('reset-password/{token}', [NewPasswordController::class, 'create']) - ->name('password.reset'); + ->name('password.reset'); Route::post('reset-password', [NewPasswordController::class, 'store']) - ->name('password.store'); + ->name('password.store'); }); Route::middleware('auth')->group(function () { Route::get('verify-email', EmailVerificationPromptController::class) - ->name('verification.notice'); + ->name('verification.notice'); Route::get('verify-email/{id}/{hash}', VerifyEmailController::class) - ->middleware(['signed', 'throttle:6,1']) - ->name('verification.verify'); + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store']) - ->middleware('throttle:6,1') - ->name('verification.send'); + ->middleware('throttle:6,1') + ->name('verification.send'); Route::get('confirm-password', [ConfirmablePasswordController::class, 'show']) - ->name('password.confirm'); + ->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'); + ->name('logout'); }); diff --git a/personal-blog/routes/web.php b/personal-blog/routes/web.php index 74bb7cac..66d1e2e4 100644 --- a/personal-blog/routes/web.php +++ b/personal-blog/routes/web.php @@ -1,11 +1,11 @@ name('profile.destroy'); }); -require __DIR__.'/auth.php'; +// Routes Article for show article to all users +Route::get('/', 'App\Http\Controllers\ArticleController@index'); + +Route::resource('/article', ArticleController::class) + ->only(['show']); + +// Routes group for middleware auth user +Route::middleware('auth')->group(function () { + Route::resources([ + 'article' => ArticleController::class, + 'tag' => TagController::class, + 'category' => CategoryController::class, + ], + [ + 'except' => ['index', 'show'] + ]); +}); +// Route single page view about me +Route::view('/aboutme', 'aboutMe') + ->name('aboutme'); + +require __DIR__ . '/auth.php'; diff --git a/personal-blog/tailwind.config.js b/personal-blog/tailwind.config.js index c29eb1a1..8315f152 100644 --- a/personal-blog/tailwind.config.js +++ b/personal-blog/tailwind.config.js @@ -4,9 +4,9 @@ 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', + "./resources/**/*.blade.php", + "./resources/**/*.js", + "./resources/**/*.vue", ], theme: { From 37db4e72c5432236379f97973f68f73f1c2ba3a1 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Tue, 6 Aug 2024 14:35:22 +0330 Subject: [PATCH 09/16] Complete About Me --- .idea/Laravel-Roadmap-Beginner-Challenge.iml | 1 + .idea/blade.xml | 119 ++++++++++++++++++ .idea/laravel-idea.xml | 2 + .idea/php.xml | 1 + personal-blog/public/img/profile.jpg | Bin 0 -> 154054 bytes .../resources/views/aboutMe.blade.php | 24 +++- 6 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 .idea/blade.xml create mode 100644 personal-blog/public/img/profile.jpg diff --git a/.idea/Laravel-Roadmap-Beginner-Challenge.iml b/.idea/Laravel-Roadmap-Beginner-Challenge.iml index 49afe83f..cefb0183 100644 --- a/.idea/Laravel-Roadmap-Beginner-Challenge.iml +++ b/.idea/Laravel-Roadmap-Beginner-Challenge.iml @@ -117,6 +117,7 @@ + diff --git a/.idea/blade.xml b/.idea/blade.xml new file mode 100644 index 00000000..30358560 --- /dev/null +++ b/.idea/blade.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/laravel-idea.xml b/.idea/laravel-idea.xml index 56caaeab..4bad7e21 100644 --- a/.idea/laravel-idea.xml +++ b/.idea/laravel-idea.xml @@ -5,7 +5,9 @@ diff --git a/.idea/php.xml b/.idea/php.xml index fd71879c..4861760e 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -126,6 +126,7 @@ + diff --git a/personal-blog/public/img/profile.jpg b/personal-blog/public/img/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b70cbc105f590856ecd7ddd2167b809632ced6c GIT binary patch literal 154054 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
  • yl%D@}7EBf!|lI{{T(1_I=Lj;*HvlIBM2mo~5Qk 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 - - +@component('layouts.main') +
    +
    +
    +
    +

    Hi, I'm Back-End Developer

    +

    + My name is Teon, and I'm 20 years old. I've been passionate about programming since I was a child. My interest in coding started early, and I've been exploring it ever since. Currently, I'm focused on learning Laravel and PHP, diving into the world of web development. My goal is to improve my skills and become a professional developer. For me, programming is not just a career but an art form, and I enjoy creating new things. +

    +
    +
    +
    + Profile Picture + Profile Picture +
    + +
    +
    +
    +
    +@endcomponent From b63775e0478e9fc55b7183a0c6a9737d1abb1f46 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Tue, 6 Aug 2024 15:36:22 +0330 Subject: [PATCH 10/16] edit some little things --- .../views/components/card-article.blade.php | 30 +++++++++++-------- .../resources/views/layouts/main.blade.php | 4 ++- personal-blog/routes/web.php | 3 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/personal-blog/resources/views/components/card-article.blade.php b/personal-blog/resources/views/components/card-article.blade.php index aa242a7b..df3f3d3d 100644 --- a/personal-blog/resources/views/components/card-article.blade.php +++ b/personal-blog/resources/views/components/card-article.blade.php @@ -1,15 +1,21 @@ -
    +
    @isset($article->image) - {{ $article->title }} + + {{ $article->title }} + @endisset - -
    {{ $article->title }}
    -
    -

    {{ $article->body }}

    - - Read more - - +
    + +
    {{ $article->title }}
    +
    +

    + {{ $article->body }} +

    + + Read more + + +
    diff --git a/personal-blog/resources/views/layouts/main.blade.php b/personal-blog/resources/views/layouts/main.blade.php index f3eaaa0c..f5500da5 100644 --- a/personal-blog/resources/views/layouts/main.blade.php +++ b/personal-blog/resources/views/layouts/main.blade.php @@ -25,7 +25,9 @@

    - Personal Blog + + Personal Blog +

    @isset($article->image) - Image Cover + Image Cover @endisset -

    +

    {{ $article->body }}

    +
    +

    + Category: +

    + {{ $article->category->name }} + + @if($article->tags->count() > 0) +

    + Tags: +

    + @foreach($article->tags as $tag) + {{ $tag->name }} + @endforeach + @endif
    @endcomponent diff --git a/personal-blog/resources/views/components/card-article.blade.php b/personal-blog/resources/views/components/card-article.blade.php index df3f3d3d..15140371 100644 --- a/personal-blog/resources/views/components/card-article.blade.php +++ b/personal-blog/resources/views/components/card-article.blade.php @@ -1,21 +1,26 @@ -
    +
    @isset($article->image) - {{ $article->title }} + {{ $article->title }} @endisset
    - -
    {{ $article->title }}
    -
    -

    - {{ $article->body }} -

    - - Read more - - +
    + +
    {{ $article->title }}
    +
    +

    + {{ $article->body }} +

    +
    +
    + + Read more + + + {{ $article->category->name }} +
    diff --git a/personal-blog/resources/views/components/checkbox-option.blade.php b/personal-blog/resources/views/components/checkbox-option.blade.php index 1a1e3578..52f4f5b3 100644 --- a/personal-blog/resources/views/components/checkbox-option.blade.php +++ b/personal-blog/resources/views/components/checkbox-option.blade.php @@ -1,6 +1,8 @@ +
  • - + merge(['checked' => $attributes->get('checked') ? 'checked' : null]) }}>
  • diff --git a/personal-blog/resources/views/components/image-input.blade.php b/personal-blog/resources/views/components/image-input.blade.php index 4cafde62..e0d29437 100644 --- a/personal-blog/resources/views/components/image-input.blade.php +++ b/personal-blog/resources/views/components/image-input.blade.php @@ -1,3 +1,3 @@ - +

    {{ $slot }}

    diff --git a/personal-blog/resources/views/components/input-text.blade.php b/personal-blog/resources/views/components/input-text.blade.php index 8e4c4126..6a9c2120 100644 --- a/personal-blog/resources/views/components/input-text.blade.php +++ b/personal-blog/resources/views/components/input-text.blade.php @@ -1,4 +1,5 @@
    - + merge(['value' => $attributes->get('value') ]) }}>
    diff --git a/personal-blog/resources/views/components/option.blade.php b/personal-blog/resources/views/components/option.blade.php index 79db19c7..bd7a291b 100644 --- a/personal-blog/resources/views/components/option.blade.php +++ b/personal-blog/resources/views/components/option.blade.php @@ -1 +1 @@ - + diff --git a/personal-blog/resources/views/components/select-option-input.blade.php b/personal-blog/resources/views/components/select-option-input.blade.php index c8c0bd35..2b654176 100644 --- a/personal-blog/resources/views/components/select-option-input.blade.php +++ b/personal-blog/resources/views/components/select-option-input.blade.php @@ -1,6 +1,6 @@
    - {{ $slot }}
    diff --git a/personal-blog/resources/views/components/text-area-input.blade.php b/personal-blog/resources/views/components/text-area-input.blade.php index 5462b12a..a66337fd 100644 --- a/personal-blog/resources/views/components/text-area-input.blade.php +++ b/personal-blog/resources/views/components/text-area-input.blade.php @@ -1,4 +1,6 @@
    - +
    diff --git a/personal-blog/resources/views/layouts/navigation.blade.php b/personal-blog/resources/views/layouts/navigation.blade.php index ed10d416..2f4ac451 100644 --- a/personal-blog/resources/views/layouts/navigation.blade.php +++ b/personal-blog/resources/views/layouts/navigation.blade.php @@ -15,6 +15,9 @@ {{ __('Dashboard') }} + + {{ __('Articles') }} + diff --git a/personal-blog/resources/views/list/article.blade.php b/personal-blog/resources/views/list/article.blade.php new file mode 100644 index 00000000..2efae6c4 --- /dev/null +++ b/personal-blog/resources/views/list/article.blade.php @@ -0,0 +1,104 @@ + + +

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

    +
    + +
    +
    + +
    +
    +
    + +
    +
    + Articles +
    + +
    +
    + + + + + + + + + + + @foreach($articles as $article) + + + + + + + @endforeach + +
    TitleCategoryAuthorActions
    +
    + {{ $article->title }} +
    +
    + {{ $article->category->name }} + +
    + {{ $article->user->name }} +
    +
    +
    + + + + + + + +
    + @csrf + @method('DELETE') + +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    diff --git a/personal-blog/routes/web.php b/personal-blog/routes/web.php index 07839b12..9e6c56da 100644 --- a/personal-blog/routes/web.php +++ b/personal-blog/routes/web.php @@ -2,6 +2,7 @@ use App\Http\Controllers\ArticleController; use App\Http\Controllers\CategoryController; +use App\Http\Controllers\ListArticleController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\TagController; use Illuminate\Support\Facades\Route; @@ -11,6 +12,11 @@ return view('dashboard'); })->middleware(['auth', 'verified'])->name('dashboard'); +// Route for list of article to edit in dashboard with middleware +Route::get('/list/article', ListArticleController::class) + ->name('list.article') + ->middleware('auth'); + // Profile routes with auth middleware Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); diff --git a/personal-blog/tailwind.config.js b/personal-blog/tailwind.config.js index 8315f152..9ac7af59 100644 --- a/personal-blog/tailwind.config.js +++ b/personal-blog/tailwind.config.js @@ -17,5 +17,7 @@ export default { }, }, - plugins: [forms], + plugins: [ + forms, + ], }; From e38ca6152248cec949d03117b8d7100006ce5300 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Fri, 9 Aug 2024 12:02:37 +0330 Subject: [PATCH 15/16] Category crud complete --- .../Http/Controllers/CategoryController.php | 43 +++++----- .../Controllers/ListCategoryController.php | 21 +++++ .../Http/Controllers/ListTagController.php | 16 ++++ .../views/categories/create.blade.php | 21 +++++ .../resources/views/categories/edit.blade.php | 22 +++++ .../views/layouts/navigation.blade.php | 6 ++ .../resources/views/list/category.blade.php | 85 +++++++++++++++++++ personal-blog/routes/web.php | 10 +++ 8 files changed, 204 insertions(+), 20 deletions(-) create mode 100644 personal-blog/app/Http/Controllers/ListCategoryController.php create mode 100644 personal-blog/app/Http/Controllers/ListTagController.php create mode 100644 personal-blog/resources/views/categories/create.blade.php create mode 100644 personal-blog/resources/views/categories/edit.blade.php create mode 100644 personal-blog/resources/views/list/category.blade.php diff --git a/personal-blog/app/Http/Controllers/CategoryController.php b/personal-blog/app/Http/Controllers/CategoryController.php index 8fdbe565..cb6fb134 100644 --- a/personal-blog/app/Http/Controllers/CategoryController.php +++ b/personal-blog/app/Http/Controllers/CategoryController.php @@ -7,20 +7,12 @@ class CategoryController extends Controller { - /** - * Display a listing of the resource. - */ - public function index() - { - // - } - /** * Show the form for creating a new resource. */ public function create() { - // + return view('categories.create'); } /** @@ -28,23 +20,24 @@ public function create() */ public function store(Request $request) { - // - } + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:categories,name', + ]); - /** - * Display the specified resource. - */ - public function show(Category $category) - { - // + $category = Category::create([ + 'name' => $validated['name'], + ]); + + return redirect()->route('list.category')->with('success', 'Category successfully added!'); } + /** * Show the form for editing the specified resource. */ public function edit(Category $category) { - // + return view('categories.edit', compact('category')); } /** @@ -52,7 +45,15 @@ public function edit(Category $category) */ public function update(Request $request, Category $category) { - // + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:categories,name,' . $category->id, + ]); + + $category->update([ + 'name' => $validated['name'], + ]); + + return redirect()->route('list.category')->with('success', 'Category successfully updated!'); } /** @@ -60,6 +61,8 @@ public function update(Request $request, Category $category) */ public function destroy(Category $category) { - // + $category->delete(); + + return redirect()->route('list.category')->with('success', 'Category successfully deleted!'); } } diff --git a/personal-blog/app/Http/Controllers/ListCategoryController.php b/personal-blog/app/Http/Controllers/ListCategoryController.php new file mode 100644 index 00000000..d84bad33 --- /dev/null +++ b/personal-blog/app/Http/Controllers/ListCategoryController.php @@ -0,0 +1,21 @@ +paginate(5); + + return view('list.category', [ + 'categories' => $categories, + ]); + } +} diff --git a/personal-blog/app/Http/Controllers/ListTagController.php b/personal-blog/app/Http/Controllers/ListTagController.php new file mode 100644 index 00000000..60720b38 --- /dev/null +++ b/personal-blog/app/Http/Controllers/ListTagController.php @@ -0,0 +1,16 @@ + +
    +

    Add a new Category

    +
    + @csrf +
    + +
    + + Add Category + +
    +
    + @if($errors->any()) + {!! implode('', $errors->all('
  • :message
  • ')) !!} + @endif +
    +
    + +@endcomponent diff --git a/personal-blog/resources/views/categories/edit.blade.php b/personal-blog/resources/views/categories/edit.blade.php new file mode 100644 index 00000000..f8d7c5bb --- /dev/null +++ b/personal-blog/resources/views/categories/edit.blade.php @@ -0,0 +1,22 @@ +@component('layouts.main') +
    +
    +

    Add a new Category

    +
    + @csrf + @method('PUT') +
    + +
    + + Add Category + +
    +
    + @if($errors->any()) + {!! implode('', $errors->all('
  • :message
  • ')) !!} + @endif +
    +
    +
    +@endcomponent diff --git a/personal-blog/resources/views/layouts/navigation.blade.php b/personal-blog/resources/views/layouts/navigation.blade.php index 2f4ac451..f9fb27e1 100644 --- a/personal-blog/resources/views/layouts/navigation.blade.php +++ b/personal-blog/resources/views/layouts/navigation.blade.php @@ -18,6 +18,12 @@ {{ __('Articles') }} + + {{ __('Category') }} + + + {{ __('Tag') }} + diff --git a/personal-blog/resources/views/list/category.blade.php b/personal-blog/resources/views/list/category.blade.php new file mode 100644 index 00000000..b7717b5e --- /dev/null +++ b/personal-blog/resources/views/list/category.blade.php @@ -0,0 +1,85 @@ + + +

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

    +
    + +
    +
    + +
    +
    +
    + +
    +
    + Categories +
    + +
    +
    + + + + + + + + + @foreach($categories as $category) + + + + + @endforeach + +
    NameActions
    +
    + {{ $category->name }} +
    +
    +
    + + + + +
    + @csrf + @method('DELETE') + +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    diff --git a/personal-blog/routes/web.php b/personal-blog/routes/web.php index 9e6c56da..c95f0601 100644 --- a/personal-blog/routes/web.php +++ b/personal-blog/routes/web.php @@ -3,6 +3,8 @@ use App\Http\Controllers\ArticleController; use App\Http\Controllers\CategoryController; use App\Http\Controllers\ListArticleController; +use App\Http\Controllers\ListCategoryController; +use App\Http\Controllers\ListTagController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\TagController; use Illuminate\Support\Facades\Route; @@ -16,6 +18,14 @@ Route::get('/list/article', ListArticleController::class) ->name('list.article') ->middleware('auth'); +// Route for list of category to edit in dashboard with middleware +Route::get('/list/category', ListCategoryController::class) + ->name('list.category') + ->middleware('auth'); +// Route for list of tag to edit in dashboard with middleware +Route::get('/list/tag', ListTagController::class) + ->name('list.tag') + ->middleware('auth'); // Profile routes with auth middleware Route::middleware('auth')->group(function () { From 3141b31e65e95e60225dfee41fe376095e46e335 Mon Sep 17 00:00:00 2001 From: Teon54 Date: Fri, 9 Aug 2024 12:10:16 +0330 Subject: [PATCH 16/16] Tag crud complete --- .../Http/Controllers/ListTagController.php | 7 +- .../app/Http/Controllers/TagController.php | 43 +++++----- .../resources/views/list/tag.blade.php | 85 +++++++++++++++++++ .../resources/views/tag/create.blade.php | 24 +++++- .../resources/views/tag/edit.blade.php | 25 +++++- 5 files changed, 157 insertions(+), 27 deletions(-) create mode 100644 personal-blog/resources/views/list/tag.blade.php diff --git a/personal-blog/app/Http/Controllers/ListTagController.php b/personal-blog/app/Http/Controllers/ListTagController.php index 60720b38..e219dd0c 100644 --- a/personal-blog/app/Http/Controllers/ListTagController.php +++ b/personal-blog/app/Http/Controllers/ListTagController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Tag; use Illuminate\Http\Request; class ListTagController extends Controller @@ -11,6 +12,10 @@ class ListTagController extends Controller */ public function __invoke(Request $request) { - // + $tags = Tag::orderByDesc('id')->paginate(5); + + return view('list.tag', [ + 'tags' => $tags, + ]); } } diff --git a/personal-blog/app/Http/Controllers/TagController.php b/personal-blog/app/Http/Controllers/TagController.php index 754c75a3..b7f085b7 100644 --- a/personal-blog/app/Http/Controllers/TagController.php +++ b/personal-blog/app/Http/Controllers/TagController.php @@ -7,20 +7,12 @@ class TagController extends Controller { - /** - * Display a listing of the resource. - */ - public function index() - { - // - } - /** * Show the form for creating a new resource. */ public function create() { - // + return view('tag.create'); } /** @@ -28,23 +20,24 @@ public function create() */ public function store(Request $request) { - // - } + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:tags,name', + ]); - /** - * Display the specified resource. - */ - public function show(Tag $tag) - { - // + $tag = Tag::create([ + 'name' => $validated['name'], + ]); + + return redirect()->route('list.tag')->with('success', 'Tag successfully added!'); } + /** * Show the form for editing the specified resource. */ public function edit(Tag $tag) { - // + return view('tag.edit', compact('tag')); } /** @@ -52,7 +45,15 @@ public function edit(Tag $tag) */ public function update(Request $request, Tag $tag) { - // + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:tags,name,' . $tag->id, + ]); + + $tag->update([ + 'name' => $validated['name'], + ]); + + return redirect()->route('list.tag')->with('success', 'Tag successfully updated!'); } /** @@ -60,6 +61,8 @@ public function update(Request $request, Tag $tag) */ public function destroy(Tag $tag) { - // + $tag->delete(); + + return redirect()->route('list.tag')->with('success', 'Tag successfully deleted!'); } } diff --git a/personal-blog/resources/views/list/tag.blade.php b/personal-blog/resources/views/list/tag.blade.php new file mode 100644 index 00000000..bd14c046 --- /dev/null +++ b/personal-blog/resources/views/list/tag.blade.php @@ -0,0 +1,85 @@ + + +

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

    +
    + +
    +
    + +
    +
    +
    + +
    +
    + Tags +
    + +
    +
    + + + + + + + + + @foreach($tags as $tag) + + + + + @endforeach + +
    NameActions
    +
    + {{ $tag->name }} +
    +
    +
    + + + + +
    + @csrf + @method('DELETE') + +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    diff --git a/personal-blog/resources/views/tag/create.blade.php b/personal-blog/resources/views/tag/create.blade.php index f11d3697..432219c7 100644 --- a/personal-blog/resources/views/tag/create.blade.php +++ b/personal-blog/resources/views/tag/create.blade.php @@ -1,3 +1,21 @@ -
    - -
    +@component('layouts.main') +
    +
    +

    Add a new Category

    +
    + @csrf +
    + +
    + + Add Tag + +
    +
    + @if($errors->any()) + {!! implode('', $errors->all('
  • :message
  • ')) !!} + @endif +
    +
    +
    +@endcomponent diff --git a/personal-blog/resources/views/tag/edit.blade.php b/personal-blog/resources/views/tag/edit.blade.php index 237547d2..b218c80f 100644 --- a/personal-blog/resources/views/tag/edit.blade.php +++ b/personal-blog/resources/views/tag/edit.blade.php @@ -1,3 +1,22 @@ -
    - -
    +@component('layouts.main') +
    +
    +

    Add a new Category

    +
    + @csrf + @method('PUT') +
    + +
    + + Add Tag + +
    +
    + @if($errors->any()) + {!! implode('', $errors->all('
  • :message
  • ')) !!} + @endif +
    +
    +
    +@endcomponent