From 566275348c9aa974c4ee54144c4594439a657953 Mon Sep 17 00:00:00 2001 From: ahmadafriadi Date: Mon, 28 Sep 2026 13:52:25 +0700 Subject: [PATCH] first commit --- .claude/skills/fortify-development/SKILL.md | 151 + .../skills/inertia-react-development/SKILL.md | 524 + .claude/skills/infer-conventions/SKILL.md | 104 + .../infer-conventions/references/checklist.md | 137 + .../skills/laravel-best-practices/SKILL.md | 59 + .../rules/advanced-queries.md | 106 + .../rules/architecture.md | 219 + .../rules/blade-views.md | 36 + .../laravel-best-practices/rules/caching.md | 100 + .../rules/collections.md | 72 + .../laravel-best-practices/rules/config.md | 87 + .../rules/db-performance.md | 189 + .../laravel-best-practices/rules/eloquent.md | 158 + .../rules/error-handling.md | 77 + .../rules/events-notifications.md | 52 + .../rules/http-client.md | 157 + .../laravel-best-practices/rules/mail.md | 54 + .../rules/migrations.md | 67 + .../rules/queue-jobs.md | 117 + .../laravel-best-practices/rules/routing.md | 106 + .../rules/scheduling.md | 61 + .../laravel-best-practices/rules/security.md | 156 + .../laravel-best-practices/rules/style.md | 110 + .../rules/validation.md | 89 + .../skills/tailwindcss-development/SKILL.md | 96 + .../skills/testing-best-practices/SKILL.md | 58 + .../rules/assertions.md | 60 + .../rules/endpoint-tests.md | 47 + .../rules/finding-features.md | 34 + .../testing-best-practices/rules/isolation.md | 52 + .../testing-best-practices/rules/naming.md | 45 + .../rules/performance.md | 46 + .../testing-best-practices/rules/review.md | 44 + .../testing-best-practices/rules/security.md | 27 + .../testing-best-practices/rules/test-data.md | 56 + .claude/skills/wayfinder-development/SKILL.md | 80 + .editorconfig | 12 + .env.example | 65 + .gitattributes | 11 + .github/dependabot.yml | 12 + .github/workflows/tests.yml | 38 + .gitignore | 30 + .mcp.json | 11 + .npmrc | 1 + README.md | 168 + app/Actions/Fortify/CreateNewUser.php | 33 + app/Actions/Fortify/ResetUserPassword.php | 29 + app/Concerns/PasswordValidationRules.php | 29 + app/Concerns/ProfileValidationRules.php | 51 + app/Http/Controllers/Controller.php | 8 + .../Settings/ProfileController.php | 62 + .../Settings/SecurityController.php | 66 + app/Http/Middleware/HandleAppearance.php | 23 + app/Http/Middleware/HandleInertiaRequests.php | 47 + .../Settings/PasswordUpdateRequest.php | 25 + .../Settings/ProfileDeleteRequest.php | 24 + .../Settings/ProfileUpdateRequest.php | 22 + .../TwoFactorAuthenticationRequest.php | 22 + app/Models/User.php | 50 + app/Providers/AppServiceProvider.php | 50 + app/Providers/FortifyServiceProvider.php | 100 + artisan | 18 + boost.json | 19 + bootstrap/app.php | 30 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 9 + components.json | 21 + composer.json | 118 + composer.lock | 11421 ++++++++++++++++ config/app.php | 126 + config/auth.php | 117 + config/cache.php | 136 + config/database.php | 184 + config/filesystems.php | 80 + config/fortify.php | 177 + config/inertia.php | 70 + config/logging.php | 140 + config/mail.php | 118 + config/queue.php | 129 + config/services.php | 38 + config/session.php | 233 + database/.gitignore | 1 + database/factories/UserFactory.php | 60 + .../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 | 59 + ...024_01_01_000000_create_passkeys_table.php | 34 + ..._add_two_factor_columns_to_users_table.php | 34 + database/seeders/DatabaseSeeder.php | 25 + package-lock.json | 6550 +++++++++ package.json | 66 + phpstan.neon | 13 + phpunit.xml | 36 + pint.json | 3 + pnpm-workspace.yaml | 5 + public/.htaccess | 25 + public/apple-touch-icon.png | Bin 0 -> 1662 bytes public/favicon.ico | Bin 0 -> 4286 bytes public/favicon.svg | 3 + public/images/probindo/about-team.jpg | Bin 0 -> 40003 bytes .../images/probindo/clients-erp-dashboard.jpg | Bin 0 -> 42315 bytes public/images/probindo/clients-hero-bg.jpg | Bin 0 -> 38899 bytes .../probindo/clients-operations-center.jpg | Bin 0 -> 39292 bytes public/images/probindo/industry-corporate.jpg | Bin 0 -> 55369 bytes public/images/probindo/industry-logistics.jpg | Bin 0 -> 70416 bytes public/images/probindo/industry-oil-gas.jpg | Bin 0 -> 51195 bytes public/images/probindo/industry-steel.jpg | Bin 0 -> 64118 bytes public/images/probindo/logo-paj.png | Bin 0 -> 12907 bytes public/images/probindo/map-jakarta.png | Bin 0 -> 121671 bytes public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 269 + resources/js/app.tsx | 41 + resources/js/components/alert-error.tsx | 24 + resources/js/components/app-content.tsx | 22 + resources/js/components/app-header.tsx | 248 + resources/js/components/app-logo-icon.tsx | 13 + resources/js/components/app-logo.tsx | 20 + resources/js/components/app-shell.tsx | 21 + .../js/components/app-sidebar-header.tsx | 18 + resources/js/components/app-sidebar.tsx | 65 + resources/js/components/appearance-tabs.tsx | 45 + resources/js/components/breadcrumbs.tsx | 50 + resources/js/components/delete-user.tsx | 120 + resources/js/components/heading.tsx | 26 + resources/js/components/input-error.tsx | 17 + resources/js/components/manage-passkeys.tsx | 71 + resources/js/components/manage-two-factor.tsx | 126 + resources/js/components/nav-footer.tsx | 49 + resources/js/components/nav-main.tsx | 36 + resources/js/components/nav-user.tsx | 58 + resources/js/components/passkey-item.tsx | 93 + resources/js/components/passkey-register.tsx | 108 + resources/js/components/passkey-verify.tsx | 74 + resources/js/components/password-input.tsx | 37 + resources/js/components/site/brand.tsx | 33 + resources/js/components/site/button.tsx | 131 + resources/js/components/site/card.tsx | 38 + .../js/components/site/consultation-form.tsx | 109 + resources/js/components/site/container.tsx | 31 + resources/js/components/site/eyebrow.tsx | 28 + resources/js/components/site/feature-card.tsx | 57 + resources/js/components/site/form-field.tsx | 104 + resources/js/components/site/glow.tsx | 30 + resources/js/components/site/icon-tile.tsx | 47 + resources/js/components/site/icon.tsx | 36 + resources/js/components/site/image-card.tsx | 53 + resources/js/components/site/page-hero.tsx | 80 + resources/js/components/site/pill.tsx | 45 + .../js/components/site/section-header.tsx | 77 + resources/js/components/site/section.tsx | 47 + .../site/sections/consultation-section.tsx | 91 + .../components/site/sections/cta-banner.tsx | 72 + .../components/site/sections/service-grid.tsx | 38 + resources/js/components/site/site-footer.tsx | 137 + resources/js/components/site/site-header.tsx | 120 + resources/js/components/site/stat-card.tsx | 51 + resources/js/components/site/step-card.tsx | 56 + resources/js/components/site/theme-toggle.tsx | 28 + resources/js/components/text-link.tsx | 23 + .../components/two-factor-recovery-codes.tsx | 164 + .../js/components/two-factor-setup-modal.tsx | 355 + resources/js/components/ui/alert.tsx | 66 + resources/js/components/ui/avatar.tsx | 51 + resources/js/components/ui/badge.tsx | 46 + resources/js/components/ui/breadcrumb.tsx | 109 + resources/js/components/ui/button.tsx | 58 + resources/js/components/ui/card.tsx | 68 + resources/js/components/ui/checkbox.tsx | 30 + resources/js/components/ui/collapsible.tsx | 31 + resources/js/components/ui/dialog.tsx | 133 + resources/js/components/ui/dropdown-menu.tsx | 255 + resources/js/components/ui/icon.tsx | 14 + resources/js/components/ui/input-otp.tsx | 69 + resources/js/components/ui/input.tsx | 21 + resources/js/components/ui/label.tsx | 22 + .../js/components/ui/navigation-menu.tsx | 168 + .../js/components/ui/placeholder-pattern.tsx | 20 + resources/js/components/ui/select.tsx | 193 + resources/js/components/ui/separator.tsx | 26 + resources/js/components/ui/sheet.tsx | 137 + resources/js/components/ui/sidebar.tsx | 719 + resources/js/components/ui/skeleton.tsx | 13 + resources/js/components/ui/sonner.tsx | 27 + resources/js/components/ui/spinner.tsx | 16 + resources/js/components/ui/toggle-group.tsx | 71 + resources/js/components/ui/toggle.tsx | 45 + resources/js/components/ui/tooltip.tsx | 55 + resources/js/components/user-info.tsx | 32 + resources/js/components/user-menu-content.tsx | 63 + resources/js/data/site.ts | 175 + resources/js/hooks/use-appearance.tsx | 119 + resources/js/hooks/use-clipboard.ts | 32 + resources/js/hooks/use-current-url.ts | 83 + resources/js/hooks/use-flash-toast.ts | 19 + resources/js/hooks/use-initials.tsx | 26 + resources/js/hooks/use-mobile-navigation.ts | 10 + resources/js/hooks/use-mobile.tsx | 36 + resources/js/hooks/use-two-factor-auth.ts | 111 + resources/js/layouts/app-layout.tsx | 16 + .../js/layouts/app/app-header-layout.tsx | 16 + .../js/layouts/app/app-sidebar-layout.tsx | 20 + resources/js/layouts/auth-layout.tsx | 17 + .../js/layouts/auth/auth-card-layout.tsx | 48 + .../js/layouts/auth/auth-simple-layout.tsx | 38 + .../js/layouts/auth/auth-split-layout.tsx | 44 + resources/js/layouts/settings/layout.tsx | 78 + resources/js/layouts/site-layout.tsx | 13 + resources/js/lib/utils.ts | 12 + resources/js/pages/auth/confirm-password.tsx | 66 + resources/js/pages/auth/forgot-password.tsx | 69 + resources/js/pages/auth/login.tsx | 117 + resources/js/pages/auth/register.tsx | 120 + resources/js/pages/auth/reset-password.tsx | 96 + .../js/pages/auth/two-factor-challenge.tsx | 133 + resources/js/pages/auth/verify-email.tsx | 46 + resources/js/pages/dashboard.tsx | 36 + resources/js/pages/settings/appearance.tsx | 32 + resources/js/pages/settings/profile.tsx | 138 + resources/js/pages/settings/security.tsx | 148 + resources/js/pages/site/about.tsx | 391 + resources/js/pages/site/clients.tsx | 787 ++ resources/js/pages/site/contact.tsx | 784 ++ resources/js/pages/site/home.tsx | 485 + resources/js/pages/site/services.tsx | 293 + resources/js/types/auth.ts | 32 + resources/js/types/global.d.ts | 18 + resources/js/types/index.ts | 3 + resources/js/types/navigation.ts | 14 + resources/js/types/ui.ts | 21 + resources/js/types/vite-env.d.ts | 1 + resources/views/app.blade.php | 52 + routes/console.php | 8 + routes/settings.php | 34 + routes/web.php | 15 + storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 10 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/Auth/AuthenticationTest.php | 92 + tests/Feature/Auth/EmailVerificationTest.php | 119 + .../Feature/Auth/PasswordConfirmationTest.php | 33 + tests/Feature/Auth/PasswordResetTest.php | 95 + tests/Feature/Auth/RegistrationTest.php | 39 + tests/Feature/Auth/TwoFactorChallengeTest.php | 49 + .../Auth/VerificationNotificationTest.php | 48 + tests/Feature/DashboardTest.php | 27 + tests/Feature/ExampleTest.php | 18 + tests/Feature/Settings/ProfileUpdateTest.php | 99 + tests/Feature/Settings/SecurityTest.php | 118 + tests/Feature/SitePagesTest.php | 32 + tests/Pest.php | 0 tests/TestCase.php | 16 + tests/Unit/ExampleTest.php | 16 + tsconfig.json | 120 + vite.config.ts | 86 + 262 files changed, 37008 insertions(+) create mode 100644 .claude/skills/fortify-development/SKILL.md create mode 100644 .claude/skills/inertia-react-development/SKILL.md create mode 100644 .claude/skills/infer-conventions/SKILL.md create mode 100644 .claude/skills/infer-conventions/references/checklist.md create mode 100644 .claude/skills/laravel-best-practices/SKILL.md create mode 100644 .claude/skills/laravel-best-practices/rules/advanced-queries.md create mode 100644 .claude/skills/laravel-best-practices/rules/architecture.md create mode 100644 .claude/skills/laravel-best-practices/rules/blade-views.md create mode 100644 .claude/skills/laravel-best-practices/rules/caching.md create mode 100644 .claude/skills/laravel-best-practices/rules/collections.md create mode 100644 .claude/skills/laravel-best-practices/rules/config.md create mode 100644 .claude/skills/laravel-best-practices/rules/db-performance.md create mode 100644 .claude/skills/laravel-best-practices/rules/eloquent.md create mode 100644 .claude/skills/laravel-best-practices/rules/error-handling.md create mode 100644 .claude/skills/laravel-best-practices/rules/events-notifications.md create mode 100644 .claude/skills/laravel-best-practices/rules/http-client.md create mode 100644 .claude/skills/laravel-best-practices/rules/mail.md create mode 100644 .claude/skills/laravel-best-practices/rules/migrations.md create mode 100644 .claude/skills/laravel-best-practices/rules/queue-jobs.md create mode 100644 .claude/skills/laravel-best-practices/rules/routing.md create mode 100644 .claude/skills/laravel-best-practices/rules/scheduling.md create mode 100644 .claude/skills/laravel-best-practices/rules/security.md create mode 100644 .claude/skills/laravel-best-practices/rules/style.md create mode 100644 .claude/skills/laravel-best-practices/rules/validation.md create mode 100644 .claude/skills/tailwindcss-development/SKILL.md create mode 100644 .claude/skills/testing-best-practices/SKILL.md create mode 100644 .claude/skills/testing-best-practices/rules/assertions.md create mode 100644 .claude/skills/testing-best-practices/rules/endpoint-tests.md create mode 100644 .claude/skills/testing-best-practices/rules/finding-features.md create mode 100644 .claude/skills/testing-best-practices/rules/isolation.md create mode 100644 .claude/skills/testing-best-practices/rules/naming.md create mode 100644 .claude/skills/testing-best-practices/rules/performance.md create mode 100644 .claude/skills/testing-best-practices/rules/review.md create mode 100644 .claude/skills/testing-best-practices/rules/security.md create mode 100644 .claude/skills/testing-best-practices/rules/test-data.md create mode 100644 .claude/skills/wayfinder-development/SKILL.md create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .mcp.json create mode 100644 .npmrc create mode 100644 README.md create mode 100644 app/Actions/Fortify/CreateNewUser.php create mode 100644 app/Actions/Fortify/ResetUserPassword.php create mode 100644 app/Concerns/PasswordValidationRules.php create mode 100644 app/Concerns/ProfileValidationRules.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/Settings/ProfileController.php create mode 100644 app/Http/Controllers/Settings/SecurityController.php create mode 100644 app/Http/Middleware/HandleAppearance.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 app/Http/Requests/Settings/PasswordUpdateRequest.php create mode 100644 app/Http/Requests/Settings/ProfileDeleteRequest.php create mode 100644 app/Http/Requests/Settings/ProfileUpdateRequest.php create mode 100644 app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/FortifyServiceProvider.php create mode 100644 artisan create mode 100644 boost.json create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 components.json create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/fortify.php create mode 100644 config/inertia.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2024_01_01_000000_create_passkeys_table.php create mode 100644 database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpstan.neon create mode 100644 phpunit.xml create mode 100644 pint.json create mode 100644 pnpm-workspace.yaml create mode 100644 public/.htaccess create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/images/probindo/about-team.jpg create mode 100644 public/images/probindo/clients-erp-dashboard.jpg create mode 100644 public/images/probindo/clients-hero-bg.jpg create mode 100644 public/images/probindo/clients-operations-center.jpg create mode 100644 public/images/probindo/industry-corporate.jpg create mode 100644 public/images/probindo/industry-logistics.jpg create mode 100644 public/images/probindo/industry-oil-gas.jpg create mode 100644 public/images/probindo/industry-steel.jpg create mode 100644 public/images/probindo/logo-paj.png create mode 100644 public/images/probindo/map-jakarta.png create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.tsx create mode 100644 resources/js/components/alert-error.tsx create mode 100644 resources/js/components/app-content.tsx create mode 100644 resources/js/components/app-header.tsx create mode 100644 resources/js/components/app-logo-icon.tsx create mode 100644 resources/js/components/app-logo.tsx create mode 100644 resources/js/components/app-shell.tsx create mode 100644 resources/js/components/app-sidebar-header.tsx create mode 100644 resources/js/components/app-sidebar.tsx create mode 100644 resources/js/components/appearance-tabs.tsx create mode 100644 resources/js/components/breadcrumbs.tsx create mode 100644 resources/js/components/delete-user.tsx create mode 100644 resources/js/components/heading.tsx create mode 100644 resources/js/components/input-error.tsx create mode 100644 resources/js/components/manage-passkeys.tsx create mode 100644 resources/js/components/manage-two-factor.tsx create mode 100644 resources/js/components/nav-footer.tsx create mode 100644 resources/js/components/nav-main.tsx create mode 100644 resources/js/components/nav-user.tsx create mode 100644 resources/js/components/passkey-item.tsx create mode 100644 resources/js/components/passkey-register.tsx create mode 100644 resources/js/components/passkey-verify.tsx create mode 100644 resources/js/components/password-input.tsx create mode 100644 resources/js/components/site/brand.tsx create mode 100644 resources/js/components/site/button.tsx create mode 100644 resources/js/components/site/card.tsx create mode 100644 resources/js/components/site/consultation-form.tsx create mode 100644 resources/js/components/site/container.tsx create mode 100644 resources/js/components/site/eyebrow.tsx create mode 100644 resources/js/components/site/feature-card.tsx create mode 100644 resources/js/components/site/form-field.tsx create mode 100644 resources/js/components/site/glow.tsx create mode 100644 resources/js/components/site/icon-tile.tsx create mode 100644 resources/js/components/site/icon.tsx create mode 100644 resources/js/components/site/image-card.tsx create mode 100644 resources/js/components/site/page-hero.tsx create mode 100644 resources/js/components/site/pill.tsx create mode 100644 resources/js/components/site/section-header.tsx create mode 100644 resources/js/components/site/section.tsx create mode 100644 resources/js/components/site/sections/consultation-section.tsx create mode 100644 resources/js/components/site/sections/cta-banner.tsx create mode 100644 resources/js/components/site/sections/service-grid.tsx create mode 100644 resources/js/components/site/site-footer.tsx create mode 100644 resources/js/components/site/site-header.tsx create mode 100644 resources/js/components/site/stat-card.tsx create mode 100644 resources/js/components/site/step-card.tsx create mode 100644 resources/js/components/site/theme-toggle.tsx create mode 100644 resources/js/components/text-link.tsx create mode 100644 resources/js/components/two-factor-recovery-codes.tsx create mode 100644 resources/js/components/two-factor-setup-modal.tsx create mode 100644 resources/js/components/ui/alert.tsx create mode 100644 resources/js/components/ui/avatar.tsx create mode 100644 resources/js/components/ui/badge.tsx create mode 100644 resources/js/components/ui/breadcrumb.tsx create mode 100644 resources/js/components/ui/button.tsx create mode 100644 resources/js/components/ui/card.tsx create mode 100644 resources/js/components/ui/checkbox.tsx create mode 100644 resources/js/components/ui/collapsible.tsx create mode 100644 resources/js/components/ui/dialog.tsx create mode 100644 resources/js/components/ui/dropdown-menu.tsx create mode 100644 resources/js/components/ui/icon.tsx create mode 100644 resources/js/components/ui/input-otp.tsx create mode 100644 resources/js/components/ui/input.tsx create mode 100644 resources/js/components/ui/label.tsx create mode 100644 resources/js/components/ui/navigation-menu.tsx create mode 100644 resources/js/components/ui/placeholder-pattern.tsx create mode 100644 resources/js/components/ui/select.tsx create mode 100644 resources/js/components/ui/separator.tsx create mode 100644 resources/js/components/ui/sheet.tsx create mode 100644 resources/js/components/ui/sidebar.tsx create mode 100644 resources/js/components/ui/skeleton.tsx create mode 100644 resources/js/components/ui/sonner.tsx create mode 100644 resources/js/components/ui/spinner.tsx create mode 100644 resources/js/components/ui/toggle-group.tsx create mode 100644 resources/js/components/ui/toggle.tsx create mode 100644 resources/js/components/ui/tooltip.tsx create mode 100644 resources/js/components/user-info.tsx create mode 100644 resources/js/components/user-menu-content.tsx create mode 100644 resources/js/data/site.ts create mode 100644 resources/js/hooks/use-appearance.tsx create mode 100644 resources/js/hooks/use-clipboard.ts create mode 100644 resources/js/hooks/use-current-url.ts create mode 100644 resources/js/hooks/use-flash-toast.ts create mode 100644 resources/js/hooks/use-initials.tsx create mode 100644 resources/js/hooks/use-mobile-navigation.ts create mode 100644 resources/js/hooks/use-mobile.tsx create mode 100644 resources/js/hooks/use-two-factor-auth.ts create mode 100644 resources/js/layouts/app-layout.tsx create mode 100644 resources/js/layouts/app/app-header-layout.tsx create mode 100644 resources/js/layouts/app/app-sidebar-layout.tsx create mode 100644 resources/js/layouts/auth-layout.tsx create mode 100644 resources/js/layouts/auth/auth-card-layout.tsx create mode 100644 resources/js/layouts/auth/auth-simple-layout.tsx create mode 100644 resources/js/layouts/auth/auth-split-layout.tsx create mode 100644 resources/js/layouts/settings/layout.tsx create mode 100644 resources/js/layouts/site-layout.tsx create mode 100644 resources/js/lib/utils.ts create mode 100644 resources/js/pages/auth/confirm-password.tsx create mode 100644 resources/js/pages/auth/forgot-password.tsx create mode 100644 resources/js/pages/auth/login.tsx create mode 100644 resources/js/pages/auth/register.tsx create mode 100644 resources/js/pages/auth/reset-password.tsx create mode 100644 resources/js/pages/auth/two-factor-challenge.tsx create mode 100644 resources/js/pages/auth/verify-email.tsx create mode 100644 resources/js/pages/dashboard.tsx create mode 100644 resources/js/pages/settings/appearance.tsx create mode 100644 resources/js/pages/settings/profile.tsx create mode 100644 resources/js/pages/settings/security.tsx create mode 100644 resources/js/pages/site/about.tsx create mode 100644 resources/js/pages/site/clients.tsx create mode 100644 resources/js/pages/site/contact.tsx create mode 100644 resources/js/pages/site/home.tsx create mode 100644 resources/js/pages/site/services.tsx create mode 100644 resources/js/types/auth.ts create mode 100644 resources/js/types/global.d.ts create mode 100644 resources/js/types/index.ts create mode 100644 resources/js/types/navigation.ts create mode 100644 resources/js/types/ui.ts create mode 100644 resources/js/types/vite-env.d.ts create mode 100644 resources/views/app.blade.php create mode 100644 routes/console.php create mode 100644 routes/settings.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/Auth/AuthenticationTest.php create mode 100644 tests/Feature/Auth/EmailVerificationTest.php create mode 100644 tests/Feature/Auth/PasswordConfirmationTest.php create mode 100644 tests/Feature/Auth/PasswordResetTest.php create mode 100644 tests/Feature/Auth/RegistrationTest.php create mode 100644 tests/Feature/Auth/TwoFactorChallengeTest.php create mode 100644 tests/Feature/Auth/VerificationNotificationTest.php create mode 100644 tests/Feature/DashboardTest.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/Feature/Settings/ProfileUpdateTest.php create mode 100644 tests/Feature/Settings/SecurityTest.php create mode 100644 tests/Feature/SitePagesTest.php create mode 100644 tests/Pest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.claude/skills/fortify-development/SKILL.md b/.claude/skills/fortify-development/SKILL.md new file mode 100644 index 0000000..2c4e84f --- /dev/null +++ b/.claude/skills/fortify-development/SKILL.md @@ -0,0 +1,151 @@ +--- +name: fortify-development +description: 'ACTIVATE when the user works on authentication in Laravel. This includes login, registration, password reset, email verification, two-factor authentication (2FA/TOTP/QR codes/recovery codes), passkeys, profile updates, password confirmation, or any auth-related routes and controllers. Activate when the user mentions Fortify, auth, authentication, login, register, signup, forgot password, verify email, 2FA, passkeys, WebAuthn, or references app/Actions/Fortify/, CreateNewUser, UpdateUserProfileInformation, FortifyServiceProvider, config/fortify.php, or auth guards. Fortify is the frontend-agnostic authentication backend for Laravel that registers all auth routes and controllers. Also activate when building SPA or headless authentication, customizing login redirects, overriding response contracts like LoginResponse, or configuring login throttling. Do NOT activate for Laravel Passport (OAuth2 API tokens), Socialite (OAuth social login), or non-auth Laravel features.' +license: MIT +metadata: + author: laravel +--- + +# Laravel Fortify Development + +Fortify is a headless authentication backend that provides authentication routes and controllers for Laravel applications. + +## Documentation + +Use `search-docs` for detailed Laravel Fortify patterns and documentation. + +## Usage + +- **Routes**: Use `list-routes` with `only_vendor: true` and `action: "Fortify"` to see all registered endpoints +- **Actions**: Check `app/Actions/Fortify/` for customizable business logic (user creation, password validation, etc.) +- **Config**: See `config/fortify.php` for all options including features, guards, rate limiters, and username field +- **Contracts**: Look in `Laravel\Fortify\Contracts\` for overridable response classes (`LoginResponse`, `LogoutResponse`, etc.) +- **Views**: All view callbacks are set in `FortifyServiceProvider::boot()` using `Fortify::loginView()`, `Fortify::registerView()`, etc. + +## Available Features + +Enable in `config/fortify.php` features array: + +- `Features::registration()` - User registration +- `Features::resetPasswords()` - Password reset via email +- `Features::emailVerification()` - Requires User to implement `MustVerifyEmail` +- `Features::updateProfileInformation()` - Profile updates +- `Features::updatePasswords()` - Password changes +- `Features::twoFactorAuthentication()` - 2FA with QR codes and recovery codes +- `Features::passkeys()` - Passwordless authentication with WebAuthn passkeys + +> Use `search-docs` for feature configuration options and customization patterns. + +## Setup Workflows + +### Two-Factor Authentication Setup + +``` +- [ ] Add TwoFactorAuthenticatable trait to User model +- [ ] Enable feature in config/fortify.php +- [ ] If the `*_add_two_factor_columns_to_users_table.php` migration is missing, publish via `php artisan vendor:publish --tag=fortify-migrations` and migrate +- [ ] Set up view callbacks in FortifyServiceProvider +- [ ] Create 2FA management UI +- [ ] Test QR code and recovery codes +``` + +> Use `search-docs` for TOTP implementation and recovery code handling patterns. + +### Passkeys Setup + +``` +- [ ] Add PasskeyAuthenticatable trait to User model and implement PasskeyUser +- [ ] Enable passkeys feature in config/fortify.php +- [ ] If the passkeys table migration is missing, publish via `php artisan vendor:publish --tag=fortify-migrations` and migrate +- [ ] Configure passkeys relying_party_id, allowed_origins, user_handle_secret, and timeout if defaults are not suitable +- [ ] Build UI with @laravel/passkeys for registration, login, confirmation, and deletion +``` + +> Use `search-docs` for passkey configuration options. For `@laravel/passkeys` frontend usage, refer to the package's README on npm. + +### Email Verification Setup + +``` +- [ ] Enable emailVerification feature in config +- [ ] Implement MustVerifyEmail interface on User model +- [ ] Set up verifyEmailView callback +- [ ] Add verified middleware to protected routes +- [ ] Test verification email flow +``` + +> Use `search-docs` for MustVerifyEmail implementation patterns. + +### Password Reset Setup + +``` +- [ ] Enable resetPasswords feature in config +- [ ] Set up requestPasswordResetLinkView callback +- [ ] Set up resetPasswordView callback +- [ ] Define password.reset named route (if views disabled) +- [ ] Test reset email and link flow +``` + +> Use `search-docs` for custom password reset flow patterns. + +### SPA Authentication Setup + +``` +- [ ] Set 'views' => false in config/fortify.php +- [ ] Install and configure Laravel Sanctum for session-based SPA authentication +- [ ] Use the 'web' guard in config/fortify.php (required for session-based authentication) +- [ ] Set up CSRF token handling +- [ ] Test XHR authentication flows +``` + +> Use `search-docs` for integration and SPA authentication patterns. + +#### Two-Factor Authentication in SPA Mode + +When `views` is set to `false`, Fortify returns JSON responses instead of redirects. + +If a user attempts to log in and two-factor authentication is enabled, the login request will return a JSON response indicating that a two-factor challenge is required: + +```json +{ + "two_factor": true +} +``` + +## Best Practices + +### Custom Authentication Logic + +Override authentication behavior using `Fortify::authenticateUsing()` for custom user retrieval or `Fortify::authenticateThrough()` to customize the authentication pipeline. Override response contracts in `AppServiceProvider` for custom redirects. + +### Registration Customization + +Modify `app/Actions/Fortify/CreateNewUser.php` to customize user creation logic, validation rules, and additional fields. + +### Rate Limiting + +Configure via `fortify.limiters.login` in config. Default configuration throttles by username + IP combination. + +## Key Endpoints + +| Feature | Method | Endpoint | +|------------------------|----------|---------------------------------------------| +| Login | POST | `/login` | +| Logout | POST | `/logout` | +| Register | POST | `/register` | +| Password Reset Request | POST | `/forgot-password` | +| Password Reset | POST | `/reset-password` | +| Email Verify Notice | GET | `/email/verify` | +| Resend Verification | POST | `/email/verification-notification` | +| Password Confirm | POST | `/user/confirm-password` | +| Enable 2FA | POST | `/user/two-factor-authentication` | +| Confirm 2FA | POST | `/user/confirmed-two-factor-authentication` | +| 2FA Challenge | POST | `/two-factor-challenge` | +| Get QR Code | GET | `/user/two-factor-qr-code` | +| Recovery Codes | GET/POST | `/user/two-factor-recovery-codes` | +| Passkey Login Options | GET | `/passkeys/login/options` | +| Passkey Login | POST | `/passkeys/login` | +| Passkey Confirm Options| GET | `/passkeys/confirm/options` | +| Passkey Confirm | POST | `/passkeys/confirm` | +| Passkey Options | GET | `/user/passkeys/options` | +| Register Passkey | POST | `/user/passkeys` | +| Delete Passkey | DELETE | `/user/passkeys/{passkey}` | diff --git a/.claude/skills/inertia-react-development/SKILL.md b/.claude/skills/inertia-react-development/SKILL.md new file mode 100644 index 0000000..813e62f --- /dev/null +++ b/.claude/skills/inertia-react-development/SKILL.md @@ -0,0 +1,524 @@ +--- +name: inertia-react-development +description: "Develops Inertia.js v3 React client-side applications. Activates when creating React pages, forms, or navigation; using ,
, useForm, useHttp, setLayoutProps, or router; working with deferred props, prefetching, optimistic updates, instant visits, or polling; or when user mentions React with Inertia, React pages, React forms, or React navigation." +license: MIT +metadata: + author: laravel +--- + +# Inertia React Development + +## When to Apply + +Activate this skill when: + +- Creating or modifying React page components for Inertia +- Working with forms in React (using ``, `useForm`, or `useHttp`) +- Implementing client-side navigation with `` or `router` +- Using v3 features: deferred props, prefetching, optimistic updates, instant visits, layout props, HTTP requests, WhenVisible, InfiniteScroll, once props, flash data, or polling +- Building React-specific features with the Inertia protocol + +## Documentation + +Use `search-docs` for detailed Inertia v3 React patterns and documentation. + +## Basic Usage + +### Page Components Location + +React page components should be placed in the `resources/js/pages` directory. + +### Page Component Structure + + +```react +export default function UsersIndex({ users }) { + return ( +
+

Users

+
    + {users.map(user =>
  • {user.name}
  • )} +
+
+ ) +} +``` + +## Client-Side Navigation + +### Basic Link Component + +Use `` for client-side navigation instead of traditional `` tags: + + +```react +import { Link, router } from '@inertiajs/react' + +Home +Users +View User +``` + +### Link with Method + + +```react +import { Link } from '@inertiajs/react' + + + Logout + +``` + +### Prefetching + +Prefetch pages to improve perceived performance: + + +```react +import { Link } from '@inertiajs/react' + + + Users + +``` + +### Programmatic Navigation + + +```react +import { router } from '@inertiajs/react' + +function handleClick() { + router.visit('/users') +} + +// Or with options +router.visit('/users', { + method: 'post', + data: { name: 'John' }, + onSuccess: () => console.log('Success!'), +}) +``` + +## Form Handling + +### Form Component (Recommended) + +The recommended way to build forms is with the `` component: + + +```react +import { Form } from '@inertiajs/react' + +export default function CreateUser() { + return ( + + {({ errors, processing, wasSuccessful }) => ( + <> + + {errors.name &&
{errors.name}
} + + + {errors.email &&
{errors.email}
} + + + + {wasSuccessful &&
User created!
} + + )} + + ) +} +``` + +### Form Component With All Props + + +```react +import { Form } from '@inertiajs/react' + +
+ {({ + errors, + hasErrors, + processing, + progress, + wasSuccessful, + recentlySuccessful, + clearErrors, + resetAndClearErrors, + defaults, + isDirty, + reset, + submit + }) => ( + <> + + {errors.name &&
{errors.name}
} + + + + {progress && ( + + {progress.percentage}% + + )} + + {wasSuccessful &&
Saved!
} + + )} +
+``` + +### Form Component Reset Props + +The `
` component supports automatic resetting: + +- `resetOnError` - Reset form data when the request fails +- `resetOnSuccess` - Reset form data when the request succeeds +- `setDefaultsOnSuccess` - Update default values on success + +Use the `search-docs` tool with a query of `form component resetting` for detailed guidance. + + +```react +import { Form } from '@inertiajs/react' + + + {({ errors, processing, wasSuccessful }) => ( + <> + + {errors.name &&
{errors.name}
} + + + + )} +
+``` + +Forms can also be built using the `useForm` helper for more programmatic control. Use the `search-docs` tool with a query of `useForm helper` for guidance. + +### `useForm` Hook + +For more programmatic control or to follow existing conventions, use the `useForm` hook: + + +```react +import { useForm } from '@inertiajs/react' + +export default function CreateUser() { + const { data, setData, post, processing, errors, reset } = useForm({ + name: '', + email: '', + password: '', + }) + + function submit(e) { + e.preventDefault() + post('/users', { + onSuccess: () => reset('password'), + }) + } + + return ( +
+ setData('name', e.target.value)} + /> + {errors.name &&
{errors.name}
} + + setData('email', e.target.value)} + /> + {errors.email &&
{errors.email}
} + + setData('password', e.target.value)} + /> + {errors.password &&
{errors.password}
} + + +
+ ) +} +``` + +## Inertia v3 Features + +### HTTP Requests + +Use the `useHttp` hook for standalone HTTP requests that do not trigger Inertia page visits. It provides the same developer experience as `useForm`, but for plain JSON endpoints. + + +```react +import { useHttp } from '@inertiajs/react' + +export default function Search() { + const { data, setData, get, processing } = useHttp({ + query: '', + }) + + function search(e) { + setData('query', e.target.value) + get('/api/search', { + onSuccess: (response) => { + console.log(response) + }, + }) + } + + return ( + <> + + {processing &&
Searching...
} + + ) +} +``` + +### Optimistic Updates + +Apply data changes instantly before the server responds, with automatic rollback on failure: + + +```react +import { router } from '@inertiajs/react' + +function like(post) { + router.optimistic((props) => ({ + post: { + ...props.post, + likes: props.post.likes + 1, + }, + })).post(`/posts/${post.id}/like`) +} +``` + +Optimistic updates also work with `useForm` and the `
` component: + + +```react +import { Form } from '@inertiajs/react' + + ({ + todos: [...props.todos, { id: Date.now(), name: data.name, done: false }], + })} +> + + +
+``` + +### Instant Visits + +Navigate to a new page immediately without waiting for the server response. The target component renders right away with shared props, while page-specific props load in the background. + + +```react +import { Link } from '@inertiajs/react' + +Dashboard + + + View Post + +``` + +### Layout Props + +Share dynamic data between pages and persistent layouts: + + +```react +export default function Layout({ title = 'My App', showSidebar = true, children }) { + return ( + <> +
{title}
+ {showSidebar && } +
{children}
+ + ) +} +``` + + +```react +import { setLayoutProps } from '@inertiajs/react' + +export default function Dashboard() { + setLayoutProps({ + title: 'Dashboard', + showSidebar: false, + }) + + return

Dashboard

+} +``` + +### Deferred Props + +Use deferred props to load data after initial page render: + + +```react +export default function UsersIndex({ users }) { + return ( +
+

Users

+ {!users ? ( +
+
+
+
+ ) : ( +
    + {users.map(user => ( +
  • {user.name}
  • + ))} +
+ )} +
+ ) +} +``` + +### Polling + +Use the `usePoll` hook to automatically refresh data at intervals. It handles cleanup on unmount and throttles polling when the tab is inactive. + + +```react +import { usePoll } from '@inertiajs/react' + +export default function Dashboard({ stats }) { + usePoll(5000) + + return ( +
+

Dashboard

+
Active Users: {stats.activeUsers}
+
+ ) +} +``` + + +```react +import { usePoll } from '@inertiajs/react' + +export default function Dashboard({ stats }) { + const { start, stop } = usePoll(5000, { + only: ['stats'], + onStart() { + console.log('Polling request started') + }, + onFinish() { + console.log('Polling request finished') + }, + }, { + autoStart: false, + keepAlive: true, + }) + + return ( +
+

Dashboard

+
Active Users: {stats.activeUsers}
+ + +
+ ) +} +``` + +- `autoStart` (default `true`) - set to `false` to start polling manually via the returned `start()` function +- `keepAlive` (default `false`) - set to `true` to prevent throttling when the browser tab is inactive + +### WhenVisible + +Lazy-load a prop when an element scrolls into view. Useful for deferring expensive data that sits below the fold: + + +```react +import { WhenVisible } from '@inertiajs/react' + +export default function Dashboard({ stats }) { + return ( +
+

Dashboard

+ + Loading stats...
}> + {({ fetching }) => ( +
+

Total Users: {stats.total_users}

+

Revenue: {stats.revenue}

+ {fetching && Refreshing...} +
+ )} + + + ) +} +``` + +### InfiniteScroll + +Automatically load additional pages of paginated data as users scroll: + + +```react +import { InfiniteScroll } from '@inertiajs/react' + +export default function Users({ users }) { + return ( + + {users.data.map(user => ( +
{user.name}
+ ))} +
+ ) +} +``` + +The server must use `Inertia::scroll()` to configure the paginated data. Use the `search-docs` tool with a query of `infinite scroll` for detailed guidance on buffers, manual loading, reverse mode, and custom trigger elements. + +## Server-Side Patterns + +Server-side patterns (Inertia::render, props, middleware) are covered in inertia-laravel guidelines. + +## Common Pitfalls + +- Using traditional `
` links instead of Inertia's `` component (breaks SPA behavior) +- Forgetting to add loading states (skeleton screens) when using deferred props +- Not handling the `undefined` state of deferred props before data loads +- Using `
` without preventing default submission (use `` component or `e.preventDefault()`) +- Forgetting to check if `` component is available in your Inertia version +- Using `router.cancel()` instead of `router.cancelAll()` (v3 breaking change) +- Using `router.on('invalid', ...)` or `router.on('exception', ...)` instead of the renamed `httpException` and `networkError` events diff --git a/.claude/skills/infer-conventions/SKILL.md b/.claude/skills/infer-conventions/SKILL.md new file mode 100644 index 0000000..11a9327 --- /dev/null +++ b/.claude/skills/infer-conventions/SKILL.md @@ -0,0 +1,104 @@ +--- +name: infer-conventions +description: "Use this skill to analyze how a Laravel application is actually written and record its conventions as shared rules. Trigger when the user wants to detect, infer, document, or standardize project conventions or coding style, set up or grow `.ai/rules`, resolve mixed or conflicting patterns (e.g. \"are we using Form Requests or inline validation?\"), or onboard agents and teammates to \"how we do things here\". Covers: a systematic sweep of ~49 Laravel convention dimensions (validation, models, architecture, testing, frontend, database, console), open-ended house-pattern discovery, conflict reporting, and recording rules scoped to the right paths via the Boost `record-rule` MCP tool. Do not use for one-off code review, enforcing formatting a linter already handles, or editing `.ai/rules` files by hand." +license: MIT +metadata: + author: laravel +--- + +# Infer Conventions + +Learn how this application writes Laravel, then record what you learn as durable, path-scoped rules other agents will read. You are documenting reality, not improving it. + +## Ground Rules (read before you start) + +- Consistency first. The codebase's majority style is the convention. Never judge it, never propose a "better" pattern, never record what the code should do. If the app validates inline everywhere, that is the rule, even if Form Requests would be nicer. +- Skip what an active tool produces, keep what a tool would fight. Inspect the project's Pint and Rector configuration first; a Rector transformation is tooling-owned only when its package and relevant rule or set are installed and enabled. Active tools may rewrite code toward one canonical form: `$casts` to `casts()`, `$fillable` to attributes, magic accessors to the `Attribute` class, pipe-string rules to arrays, `$signature` to `#[Signature]`, named migrations to anonymous, and many more. When the app already sits at an active tool's target form, the tool owns it, so record nothing. But when the app deliberately holds a form an active tool would refactor away, such as legacy `getXxxAttribute()` accessors the `Attribute` class would replace, no tool can reproduce that choice and an agent defaults the other way. That against-the-grain hold is exactly what to record. +- Record decisions, not defaults. A consistent pattern earns a rule only when it reflects a choice: the app took one valid option where the framework or common practice offered others, or the pattern would surprise a competent agent. Framework defaults steer nothing, so skip them: anonymous migrations, `$signature` commands, `ShouldQueue` jobs, `casts()` on Laravel 11+, named routes, Rule objects in `app/Rules`, and `Mail::fake()` or `Bus::fake()` to isolate framework services. A real fork is not enough on its own. Weigh the side the app took, and record only the side an agent would not reach for by itself: inline closures everywhere, legacy accessors, a bespoke query layer. Watch for the false fork too. "No Mockery" next to facade fakes is not a choice against Mockery, because they double different things. The test for every candidate: without this rule, would the next agent plausibly write it differently? Only "yes" earns a rule. +- Architecture choices are the gold. Record presence and deliberate absence. The structural pattern the app commits to is the highest-signal convention and the one no tool can decide: Action classes and how they are invoked (`handle` / `execute` / `__invoke`), service objects, dedicated query objects exposing `builder()`, DTOs (spatie/laravel-data vs readonly classes), Form Request validation vs inline, an events and listeners spine vs direct calls, and domain or module folders. Also record a consistent non-pattern, such as "query Eloquent directly in controllers, no repository layer", so the next agent matches the app's altitude instead of over-engineering. +- Never duplicate `.ai/rules`. Read `.ai/rules/index.md` and the area files before the sweep. A dimension already covered there is marked done and skipped. +- Evidence or silence. A convention needs at least 3 consistent examples and no meaningful rival to become a candidate. Every Step 1 verdict applies this bar. +- The recorded rule states the convention, nothing else. One or two imperative lines: this project does X, so do X here. Keep detection evidence out. No counts, ratios, current usage, file lists, or example paths, because that is proof for the confirm step, not part of the rule. One short syntax fragment at most, and point to `search-docs` for API details. + +## Process + +Each step ends on a checkable completion criterion. Do not advance until it holds. + +Fan out when you can. The sweep is embarrassingly parallel. If your environment can spawn subagents (a Task, dispatch, or equivalent tool), do Step 0 yourself, then hand each checklist group (A to J) and the architecture map to its own subagent. Each subagent runs the greps, reads a few representative files, and returns structured verdicts (dimension, verdict, evidence, proposed glob / title / note). You aggregate, dedupe, then run Steps 3 to 5. It is far faster on a real app. No subagents available? Run the steps in sequence, with the same bar and the same output. + +### Step 0: Orient + +Read `composer.json` (installed packages tell you which checklist groups apply), the `pint.json` / PHPStan / Rector config, `.ai/rules/index.md` if present, and most important, map the `app/` tree. List every directory under `app/` (and any `Modules/`, `src/`, `packages/`, or domain root). Every folder beyond Laravel's default skeleton (`Http`, `Models`, `Providers`, `Console`, `Exceptions`) is a structural pattern the app committed to and a high-value rule waiting to be written: `Actions`, `Services`, `Data` or DTOs, `Queries`, `Repositories`, `ViewModels`, `Pipelines`, `Support`, `Enums`, `Contracts`, `Observers`, or `Domain` and module roots. Note each one. You will confirm how it is used in Step 2. + +This app ships a frontend stack, so the frontend checklist group applies. Sweep it. + +Done when: you have the applicable checklist groups, the dimensions already recorded in `.ai/rules`, and a list of every non-default `app/` directory mapped to the pattern it represents. + +### Step 1: Predefined sweep + +Open `references/checklist.md` and work every applicable dimension using its search hints. Give each exactly one verdict: + +- Pattern. Clears the bar, rival under ~20% of sites, and reflects a real choice (passes the decisions-not-defaults test). A recording candidate. Cite 2 to 3 example files. +- Conflict. Both styles present in meaningful numbers. Report the split with counts and example files. Never record a preferred winner while the code remains mixed, even in yolo, because that would describe an aspiration rather than reality. Record only if the user identifies a stable path or context boundary that explains both styles; otherwise defer until the code is reconciled. +- Default. Consistent, but a framework or common-practice default the agent already writes unprompted. Skip it as a no-op, not a convention. +- No signal. Under the bar: feature unused, or too few examples. Skip silently (one summary line at most). +- Tooling-owned or Already-recorded. Skip per the ground rules. + +Done when: every applicable dimension carries exactly one of those verdicts. + +### Step 2: Open-ended pass + +First, close out the architecture map from Step 0. For every non-default `app/` directory you listed, confirm how the pattern is used and apply the same evidence and decisions-not-defaults tests as Step 1. Generator-standard or sparsely used directories such as `Rules`, `Observers`, `Mail`, and `Notifications` are signals to inspect, not automatic conventions. Make genuine structural patterns candidates: Action classes invoked via `handle` / `execute` / `__invoke`, Services constructor-injected, `Queries` objects exposing `builder(): Builder`, DTOs as readonly classes or spatie/laravel-data, module or domain folders as the unit of organization. Scope each qualifying pattern to its own directory glob. Also record a consistent deliberate absence, such as "no repository layer, controllers query Eloquent directly", so the next agent matches the app's altitude. + +Then find what else makes this codebase itself: base or abstract classes most code extends, traits used everywhere, tenancy or authorization scoping woven through queries, naming schemes, and custom helpers. Same evidence bar, cite files. Record every genuine structural pattern, and cap the other house findings at ~5 so the pass stays high-signal. + +Done when: every non-default `app/` directory from Step 0 has a verdict, and the pass has produced its cited house findings (or concluded there are none). + +### Step 3: Confirm + +Present every candidate in one batch. Per item: dimension, verdict, evidence (counts and files), and the exact proposed `glob` or `globs` / `title` / `note`. Conflicts are presented as questions about an existing context boundary or deferred cleanup, not as a choice of future style. + +Default mode is confirm: record only what the user approves. Switch to yolo only when the invocation said so ("yolo", "don't ask", "just record them"), then record all pattern candidates without asking. Conflicts still go to the user in yolo. + +Done when: every candidate is approved, rejected, or (conflicts) decided. + +### Step 4: Record + +Make one `record-rule` call for each glob an approved convention applies to. Choose the most specific globs that cover the cited evidence from the mapping table below; if a convention spans models and migrations, record it under both domains so agents discover it from either path. The `note` is the bare convention: strip every trace of detection (see the ground rule). If `record-rule` is unavailable (rules disabled), report the full rule text so the user can enable `BOOST_RULES_ENABLED` or add it by hand. + +Record this: + +> Accessors and mutators: use the legacy magic-method style (`getXxxAttribute()` / `setXxxAttribute()`), not the `Attribute` class. Match it in models. + +Not this: + +> Accessors/mutators use the legacy magic-method style; the `Attribute`-class style is not used anywhere (13 legacy, 0 Attribute-class), e.g. `app/Models/Post.php`. Match the legacy style in existing models. + +Done when: every approved item has a successful tool response, and any failure is reported with its rule text. + +### Step 5: Summarize + +List recorded rules (file and title), conflicts the user deferred, notable no-signals, and remind the user to commit `.ai/rules` so their team and agents share the conventions. + +## Glob mapping + +Attach each rule to the most specific path that covers its evidence. Never a lazy `app/**` when a subtree fits. Match the glob to where the code actually lives, which is not the same in a default skeleton and in a modular or DDD layout. Use the Step 0 `app/` map to pick the real path. + +Examples: + +- Models: `app/Models/**` in a default app, or `app/Modules/Blog/Models/**` / `src/Domain/Blog/**` in a modular one. +- Controllers, routing, validation, responses: `app/Http/**`, or `app/Modules/*/Http/**` when each module owns its HTTP layer. +- Actions, Services, DTOs: `app/Actions/**`, `app/Services/**`, `app/Data/**`, or the module path the app actually uses. +- Tests: `tests/**`. +- Migrations and database: `database/migrations/**`. +- Truly app-wide (rare, e.g. auth retrieval): `app/**`. + +`record-rule` takes one glob. When a convention genuinely spans two domains (e.g. UUID keys touch models and migrations), call it once per domain with the same title and note; mentioning another path in the note does not make the rule discoverable there. + +## Edge cases + +- Rules disabled or `record-rule` missing: detection is read-only, so Steps 0 to 3 still run, and recording falls back to the manual path in Step 4. +- Tiny or fresh app: most dimensions land on no-signal. Say so honestly ("not enough code to infer conventions yet") and record nothing. +- Huge app: each dimension is a bounded grep plus a handful of file reads. Sample representative files, do not read everything. +- Re-runs: reading `.ai/rules` in Step 0 makes re-runs incremental, so only new or undecided dimensions surface. +- Non-standard layout (modules, DDD): the open-ended pass catches the layout itself as convention #1. Adapt the globs in the mapping table to the observed paths. diff --git a/.claude/skills/infer-conventions/references/checklist.md b/.claude/skills/infer-conventions/references/checklist.md new file mode 100644 index 0000000..f8d1b14 --- /dev/null +++ b/.claude/skills/infer-conventions/references/checklist.md @@ -0,0 +1,137 @@ +# Detection Checklist + +Every dimension here is a genuine fork: Laravel offers two or more valid approaches, the app's choice changes what the next agent writes, and no active project tool can pick for you. Left out on purpose: pure formatting (Pint owns it), any form an installed and enabled Rector rule rewrites to one canonical shape (`$casts` to `casts()`, `$fillable` to attributes, pipe-string rules to arrays, named to anonymous migrations, `$signature` to `#[Signature]`), and framework defaults any agent writes unprompted (`ShouldQueue` jobs, relation return types, `HasFactory`). + +Each item gives the fork, then a hint (a grep or dir to spot which side the app takes). Hints are only a start. Read the matched files, never record on a raw count. Apply the ground rules to every verdict: a consistent choice that is a default or a tool's target form is not a pattern. Rows tagged (architecture) are the highest-signal, so record presence and deliberate absence. + +--- + +## A. Validation & HTTP input + +1. Validation entry point: inline `$request->validate()` vs Form Request classes vs `Validator::make()`. + - Hint: `ls app/Http/Requests`; grep `->validate(` / `Validator::make(` in `app/Http/Controllers`. +2. Custom rule location: invokable rule objects in `app/Rules` vs inline closures vs `Validator::extend()` in a provider. Rule objects are the default `make:rule` path, so record only if the app leans on closures or `Validator::extend` instead. "No rule objects" alone is just no-signal. + - Hint: `ls app/Rules`; grep `Validator::extend` in `app/Providers`. +3. Typed input retrieval: typed getters (`$request->string()`, `->integer()`, `->enum()`, `->date()`) vs raw `$request->input()` / dynamic properties. + - Hint: grep `->string(` / `->integer(` / `->enum(` vs `->input(` in `app/Http`. +4. Custom messages/attributes: `lang/*/validation.php` vs Form Request `messages()` / `attributes()` methods. + - Hint: `ls lang`; grep `function messages`, `function attributes` in `app/Http/Requests`. + +## B. Controllers & routing + +5. Controller shape: invokable single-action (`__invoke`) vs resource controllers vs plain multi-method. + - Hint: grep `__invoke` in controllers; `Route::resource` / `apiResource` vs verb routes. +6. Business-logic location (architecture): fat controllers vs delegated to Actions / Services / Jobs. + - Hint: read a few controller methods; `ls app/Actions app/Services`. +7. Route handler style: closures in `routes/*.php` vs controller classes. + - Hint: count `function ()` vs `::class` in `routes/web.php`, `routes/api.php`. +8. Middleware assignment: route/group `->middleware()` vs controller `HasMiddleware::middleware()` vs `#[Middleware]` attribute. + - Hint: grep `implements HasMiddleware`, `#[Middleware(` in controllers vs `->middleware(` in routes. +9. Route model binding: implicit (type-hinted models) vs explicit `Route::bind` vs manual `findOrFail`. + - Hint: typed model params in signatures vs `findOrFail(` in controllers; grep `Route::bind`. +10. Rate limiting: named `RateLimiter::for()` + `throttle:name` vs inline `throttle:60,1`. + - Hint: grep `RateLimiter::for` in providers vs `throttle:` in route files. + +## C. Authorization + +11. Authorization home: Gates (`Gate::define`) vs Policy classes in `app/Policies`. + - Hint: `ls app/Policies`; grep `Gate::define` in `app/Providers`. +12. Authorization call site: `$this->authorize()` / `Gate::authorize()` vs `$user->can()` vs `can` middleware vs `#[Authorize]` vs `@can` in Blade. + - Hint: grep `authorize(`, `->can(`, `middleware('can:`, `#[Authorize(`, `@can(`. + +## D. Eloquent & models + +13. Mass assignment: `$fillable` allow-list vs `$guarded` block-list. + - Hint: grep `protected $fillable` / `protected $guarded` in `app/Models`. +14. Accessors/mutators: modern `Attribute` class vs legacy `getXxxAttribute()` / `setXxxAttribute()`. Record a legacy hold, it goes against the tool's grain. + - Hint: grep `: Attribute` / `Attribute::make` vs `function get[A-Z].*Attribute` in `app/Models`. +15. Primary keys: auto-increment vs `HasUuids` vs `HasUlids`. + - Hint: grep `HasUuids` / `HasUlids` in `app/Models`; migration `id()` vs `uuid('id')`. +16. Custom casts: dedicated `CastsAttributes` classes (`app/Casts`) vs inline `Attribute` vs built-in cast strings. + - Hint: `ls app/Casts`; grep `Cast::class`, `AsStringable::class` in models. +17. Data/query layer (architecture): Eloquent directly in controllers vs repositories vs dedicated query objects (e.g. classes exposing `builder(): Builder`). + - Hint: `ls app/Repositories app/Queries`; see where non-trivial queries are built. +18. Query scopes: local `scope`/`#[Scope]` methods vs dedicated builder classes. + - Hint: grep `function scope` / `#[Scope]` in models; `ls app/*/Builders`. +19. Model events: observers (`app/Observers`, `#[ObservedBy]`) vs `booted()` closures vs event classes. + - Hint: `ls app/Observers`; grep `booted`, `::observe`, `#[ObservedBy]`. +20. Eager-load posture: explicit per-query `->with()` vs model-level `$with` defaults. Treat `preventLazyLoading()` separately as a development guard because it can complement either posture. + - Hint: grep `protected $with`, `->with(`, and separately `preventLazyLoading` in `app/`. + +## E. Architecture & organization + +21. Action/Service structure (architecture): Action classes (invoked via `handle` / `execute` / `__invoke`) vs service objects vs neither. Cross-check the Step 0 `app/` map: any `Actions`/`Services`/`Pipelines`/`Jobs`-as-actions folder is this pattern, so record how it is invoked. + - Hint: `ls app/` (the whole tree, not just `Actions`/`Services`); grep the invocation method in the folder you find. +22. DTOs (architecture): spatie/laravel-data vs plain readonly classes vs arrays everywhere. + - Hint: `ls app/Data`; grep `extends Data`, `readonly class` in `app/`. +23. Dependency acquisition: constructor/method injection vs `app()` / `resolve()` / `App::make()` service location. + - Hint: grep `app(` / `resolve(` / `::make(` in `app/` vs promoted constructor deps. +24. Decoupling: events + listeners vs direct service calls. + - Hint: `ls app/Events app/Listeners`; grep `event(`, `::dispatch(`. +25. Helper vs facade idiom: global helpers (`config()`, `auth()`, `response()`) vs facades (`Config::`, `Auth::`, `Response::`). + - Hint: ratio of `config(` vs `Config::` (etc.) across `app/`. +26. Namespace layout (architecture): default `app/` skeleton vs domain/module folders (`app/Domain/**`, modules). + - Hint: `ls app/`, look for `Domain/`, `Modules/`, bounded-context folders. +27. Enums: backed vs pure; case naming; where they live. + - Hint: `ls app/Enums`; grep `enum .*: string`, `enum .*: int`. + +## F. Frontend & views + +This app ships a frontend stack, so the items below apply. + +28. Frontend stack: Blade+Livewire vs Inertia (Vue/React/Svelte) vs Blade-only / API + separate SPA. + - Hint: `composer.json` + `package.json`; `ls resources/js/pages`, `resources/views`. +29. Blade composition: class `` components vs anonymous components (`@props`) vs `@include` partials. + - Hint: `ls app/View/Components`; grep `constrained()` vs `foreignIdFor(Model::class)` vs manual `foreign()->references()->on()`. + - Hint: grep `foreignId(`, `foreignIdFor(`, `->foreign(` in `database/migrations`. +34. `down()` methods: real reverse logic vs omitted / one-way migrations. + - Hint: grep `function down` vs the migration count. +35. Enum storage: DB `enum()` column vs `string()` + PHP-enum cast on the model. + - Hint: grep `->enum(` in migrations vs string columns cast to enums. +36. Transactions: `DB::transaction(fn ...)` closure vs manual `beginTransaction` / `commit` / `rollBack`. + - Hint: grep `DB::transaction`, `beginTransaction` in `app/`. +37. Idempotent writes: `upsert` / `updateOrCreate` / `firstOrCreate` vs find-then-save. + - Hint: grep `upsert(`, `updateOrCreate(`, `firstOrCreate(` in `app/`. + +## H. Testing + +38. Framework: Pest (`it()` / `test()` / `expect()`) vs PHPUnit classes. + - Hint: `ls tests/Pest.php`; grep `it(` / `test(` vs `extends TestCase`. +39. DB reset: `RefreshDatabase` vs `DatabaseTruncation` vs `DatabaseMigrations`. + - Hint: grep those trait names in `tests/`. +40. Fixtures: compare how equivalent test-owned records are created, such as factories vs manual inserts. Track seeders separately for shared reference data because `$this->seed()` commonly and legitimately coexists with factories. + - Hint: grep `::factory(` and direct inserts in `tests/`; separately inspect `$this->seed(` calls and what those seeders provide. +41. Collaborator isolation: how the app doubles its own classes, Mockery `mock()` / `spy()` vs real integration. Ignore facade fakes like `Mail::fake()` here, they isolate framework services by default and are not a fork against Mockery. + - Hint: grep `->mock(`, `->spy(`, `Mockery::` in `tests/`. +42. Endpoint assertions: array `assertJson([...])` / `assertJsonFragment` vs fluent `AssertableJson`. + - Hint: grep `AssertableJson`, `assertJsonFragment` in `tests/`. + +## I. Responses & API resources + +43. Response shape: API Resource classes vs `response()->json()` vs returning models/arrays directly. + - Hint: `ls app/Http/Resources`; grep `JsonResource`, `->json(` in controllers. +44. Resource relationship inclusion: `whenLoaded()` guards vs unconditional relationship access. Do not count ordinary scalar attributes as rivals to conditional relationships, and evaluate general `when()` fields separately. + - Hint: compare relationship fields using `whenLoaded(` with unconditional relationship property access in `app/Http/Resources`. +45. Pagination contracts: within comparable endpoint categories, length-aware `paginate()` vs `simplePaginate()` vs `cursorPaginate()`. These have different totals, navigation, ordering, and performance contracts, so record only a stable path-scoped API policy, never a project-wide majority. + - Hint: grep those in `app/`, then group matches by endpoint type and client contract before comparing them. +46. Web redirects/URLs: `route('name')` vs `url('/path')` vs `action([...])`. + - Hint: grep `route('`, `url('/`, `action([` in `app/Http` and views. + +## J. Strings, collections & dates + +47. Iteration idiom: `collect()->map()->filter()` pipelines vs `array_map` / `foreach`. + - Hint: grep `collect(`, `->map(` vs `array_map`, `foreach` density in `app/`. +48. String API: fluent `Str::of()->...` (Stringable) vs static `Str::` vs native (`trim`, `strtoupper`). + - Hint: grep `Str::of(` vs `Str::` vs native string funcs. +49. Dates: compare equivalent construction call styles (`now()` / `today()` helpers vs `Carbon::`) separately from the application's mutable/immutable date policy. `Date::use(CarbonImmutable::class)` can make helpers return immutable dates, so those signals are complementary rather than conflicting. + - Hint: grep `now(` and `Carbon::` for call style; separately inspect `CarbonImmutable` and `Date::use` for mutability policy. + +--- + +Genuine forks only. Every row survived the "no tool can decide this, and it isn't the default" filter. Give each applicable dimension exactly one verdict: pattern, conflict, default, no-signal, tooling-owned, or already-recorded. The rows tagged (architecture) are where the highest-value rules come from. diff --git a/.claude/skills/laravel-best-practices/SKILL.md b/.claude/skills/laravel-best-practices/SKILL.md new file mode 100644 index 0000000..311ab84 --- /dev/null +++ b/.claude/skills/laravel-best-practices/SKILL.md @@ -0,0 +1,59 @@ +--- +name: laravel-best-practices +description: "Apply this skill whenever writing, reviewing, or refactoring Laravel PHP code. This includes creating or modifying controllers, models, migrations, form requests, policies, jobs, scheduled commands, service classes, and Eloquent queries. Triggers for N+1 and query performance issues, caching strategies, authorization and security patterns, validation, error handling, queue and job configuration, route definitions, and architectural decisions. Also use for Laravel code reviews and refactoring existing Laravel code to follow best practices. Covers any task involving Laravel backend PHP code patterns." +license: MIT +metadata: + author: laravel +--- + +# Laravel Best Practices + +Best practices for Laravel, organized as an index of rule files. Each rule file teaches what to do and why. For exact API syntax, verify with `search-docs`. + +## Consistency First + +Before applying any rule, check what the application already does. Laravel offers multiple valid approaches, and the best choice is the one the codebase already uses, even if another pattern would be theoretically better. Inconsistency is worse than a suboptimal pattern. + +Check sibling files, related controllers, models, or tests for established patterns. If one exists, follow it. Don't introduce a second way. These rules are defaults for when no pattern exists yet, not overrides. + +## How to Apply + +1. Check the changed files, nearby code, project configuration, and relevant tests for established patterns. Deviate only for a correctness or security defect, and call the deviation out. +2. Map every affected concern to the rule index below. Read each mapped rule file before editing. Skip unrelated rule files. +3. Make the smallest coherent change. Keep the application's architecture and naming instead of introducing a second pattern for the same job. +4. Verify version-sensitive Laravel APIs for the installed version with `search-docs`, or inspect the installed framework when it is unavailable. +5. Run the narrowest relevant tests first, then the project's formatting and static-analysis checks when the change warrants them. +6. Re-read the diff against every mapped rule before finishing. + +## Rule Index + +Cross-cutting changes often need more than one rule file. + +| Concern | Read | +| --- | --- | +| Query count, eager loading, indexes, large datasets | [`rules/db-performance.md`](rules/db-performance.md) | +| Subqueries, aggregates, complex ordering and query plans | [`rules/advanced-queries.md`](rules/advanced-queries.md) | +| Models, relationships, scopes, casts | [`rules/eloquent.md`](rules/eloquent.md) | +| Authentication, authorization, input safety, secrets, uploads | [`rules/security.md`](rules/security.md) | +| Form Requests and validation rules | [`rules/validation.md`](rules/validation.md) | +| Controllers, route binding, resources, middleware | [`rules/routing.md`](rules/routing.md) | +| Schema changes, columns, foreign keys, indexes | [`rules/migrations.md`](rules/migrations.md) | +| Jobs, retries, uniqueness, batches, Horizon | [`rules/queue-jobs.md`](rules/queue-jobs.md) | +| Cache lifetime, invalidation, locks, memoization | [`rules/caching.md`](rules/caching.md) | +| Outbound requests, retries, timeouts, fakes | [`rules/http-client.md`](rules/http-client.md) | +| Exceptions, reporting, rendering, log context | [`rules/error-handling.md`](rules/error-handling.md) | +| Events and notifications | [`rules/events-notifications.md`](rules/events-notifications.md) | +| Mailables and mail assertions | [`rules/mail.md`](rules/mail.md) | +| Scheduled tasks and overlap protection | [`rules/scheduling.md`](rules/scheduling.md) | +| Collections, lazy iteration, bulk operations | [`rules/collections.md`](rules/collections.md) | +| Blade components, attributes, composers | [`rules/blade-views.md`](rules/blade-views.md) | +| Environment values and application configuration | [`rules/config.md`](rules/config.md) | +| Tests: coverage, factories, fakes, and assertions | the `testing-best-practices` skill | +| Naming, helpers, file boundaries, PHP style | [`rules/style.md`](rules/style.md) | +| Actions, services, dependencies, application structure | [`rules/architecture.md`](rules/architecture.md) | + +## Decision Rules + +- Prefer framework features and existing application abstractions over new helpers or dependencies. +- Avoid speculative abstractions. Extract code when it creates a clear domain boundary, removes meaningful duplication, or makes behavior independently testable. +- Keep database access out of Blade views and prevent hidden N+1 queries across controllers, resources, jobs, and serialization. diff --git a/.claude/skills/laravel-best-practices/rules/advanced-queries.md b/.claude/skills/laravel-best-practices/rules/advanced-queries.md new file mode 100644 index 0000000..54dd783 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/advanced-queries.md @@ -0,0 +1,106 @@ +# Advanced Query Best Practices + +## Select Single Relationship Values with Subqueries + +When only one value from a has-many relationship is needed, consider a correlated subquery with `addSelect()` instead of loading the entire relationship. This selects the value as part of the main query without an additional relationship query. + +```php +public function scopeWithLastLoginAt($query): void +{ + $query->addSelect([ + 'last_login_at' => Login::select('created_at') + ->whereColumn('user_id', 'users.id') + ->latest() + ->take(1), + ])->withCasts(['last_login_at' => 'datetime']); +} +``` + +## Create Dynamic Relationships with a Subquery Foreign Key + +The same pattern can select a foreign key and expose the selected model through a `belongsTo` relationship. Eager loading that relationship still executes a separate query, but it avoids loading the full has-many collection. + +```php +public function lastLogin(): BelongsTo +{ + return $this->belongsTo(Login::class, 'last_login_id'); +} + +public function scopeWithLastLogin($query): void +{ + $query->addSelect([ + 'last_login_id' => Login::select('id') + ->whereColumn('user_id', 'users.id') + ->latest() + ->take(1), + ])->with('lastLogin'); +} +``` + +## Combine Related Counts with Conditional Aggregates + +Combine several counts over the same filtered data set into one query by using conditional aggregates. Use `toBase()` when only scalar values are needed and model hydration provides no benefit. Confirm the expression syntax against the application's database engine. + +```php +$statuses = Feature::toBase() + ->selectRaw("count(case when status = 'Requested' then 1 end) as requested") + ->selectRaw("count(case when status = 'Planned' then 1 end) as planned") + ->selectRaw("count(case when status = 'Completed' then 1 end) as completed") + ->first(); +``` + +## Reuse Loaded Parent Models with `setRelation()` + +When a parent and its children are already loaded and code also accesses `$child->parent`, set the inverse relationship to the existing parent instance. This avoids an additional lazy-loading query for each child. + +```php +$feature->load('comments.user'); +$feature->comments->each->setRelation('feature', $feature); +``` + +## Compare `whereHas()` with an `IN` Subquery + +`whereHas()` typically produces an `EXISTS` subquery, while `whereIn()` can express the same filter with an `IN` subquery. Either form may be faster depending on the database engine, indexes, cardinality, and query plan. Measure both forms with representative data; neither subquery loads its result set into PHP memory. + +Option using `EXISTS`: + +```php +$query->whereHas('company', fn ($q) => $q->where('name', 'like', $term)); +``` + +Option using `IN`: + +```php +$query->whereIn('company_id', Company::where('name', 'like', $term)->select('id')); +``` + +## Measure Two Simple Queries Against One Complex Query + +Two targeted queries can outperform one complex correlated subquery or join when the first query is highly selective. They also add a database round trip, can transfer a large identifier list, and do not provide a single-query consistency snapshot. Decide from query plans and production-like measurements. + +## Design Composite Indexes for the Query + +For common multi-column sorts, consider a composite index whose column order supports the query's filters and ordering. Database engines may combine indexes or choose an explicit sort, so matching the `ORDER BY` list alone does not guarantee that an index will be used. Verify the query plan. + +```php +// Migration +$table->index(['last_name', 'first_name']); + +// Query that this index may support +User::query()->orderBy('last_name')->orderBy('first_name')->paginate(); +``` + +## Consider a Correlated Subquery for Has-Many Ordering + +When sorting by one value from a has-many relationship, a direct join can duplicate parent rows unless it first reduces the related table to one row per parent. A correlated subquery in `orderBy()` is often simpler, but its performance depends on the query plan and supporting indexes. + +```php +public function scopeOrderByLastLogin($query): void +{ + $query->orderByDesc(Login::select('created_at') + ->whereColumn('user_id', 'users.id') + ->latest() + ->take(1) + ); +} +``` diff --git a/.claude/skills/laravel-best-practices/rules/architecture.md b/.claude/skills/laravel-best-practices/rules/architecture.md new file mode 100644 index 0000000..5e7af23 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/architecture.md @@ -0,0 +1,219 @@ +# Architecture Best Practices + +## Extract Focused Business Operations + +Extract a discrete business operation into an action class when doing so makes the operation easier to reuse or test. An action class has no special meaning to Laravel; follow the project's naming and invocation conventions. + +```php +class CreateOrderAction +{ + public function __construct(private InventoryService $inventory) {} + + public function handle(array $data): Order + { + $order = Order::create($data); + $this->inventory->reserve($order); + + return $order; + } +} +``` + +## Inject Required Dependencies + +Prefer constructor injection for dependencies required throughout an object's lifetime. Method injection is appropriate for dependencies needed by one controller action, listener, job handler, or other container-invoked method. Avoid `app()` and `resolve()` when normal injection can make a dependency explicit. + +Hidden dependency: + +```php +class OrderController extends Controller +{ + public function store(StoreOrderRequest $request) + { + $service = app(OrderService::class); + + return $service->create($request->validated()); + } +} +``` + +Injected dependency: + +```php +class OrderController extends Controller +{ + public function store(StoreOrderRequest $request, OrderService $service) + { + return $service->create($request->validated()); + } +} +``` + +## Depend on Contracts at Boundaries + +Depend on contracts at system boundaries, such as payment gateways, notification channels, and external services, when testability or interchangeable implementations justify the abstraction. + +Concrete boundary dependency: + +```php +class OrderService +{ + public function __construct(private StripeGateway $gateway) {} +} +``` + +Contract boundary dependency: + +```php +interface PaymentGateway +{ + public function charge(int $amount, string $customerId): PaymentResult; +} + +class OrderService +{ + public function __construct(private PaymentGateway $gateway) {} +} +``` + +Bind in a service provider: + +```php +$this->app->bind(PaymentGateway::class, StripeGateway::class); +``` + +## Specify a Deterministic Sort Order + +Without an explicit `ORDER BY`, row order is undefined. Choose an order that matches the feature, and add a unique tie-breaker when stable pagination matters. + +Unspecified order: + +```php +$posts = Post::paginate(); +``` + +Newest first with a stable tie-breaker: + +```php +$posts = Post::query() + ->orderByDesc('created_at') + ->orderByDesc('id') + ->paginate(); +``` + +## Use Atomic Locks for Race Conditions + +Use a lock when concurrent execution must be serialized. `Cache::lock()` provides an atomic lock when the configured cache store supports locks. `lockForUpdate()` locks selected database rows and must run inside a database transaction. These mechanisms solve different coordination problems. + +```php +Cache::lock('order-processing-'.$order->id, 10)->block(5, function () use ($order) { + $order->process(); +}); + +// Or at query level, inside a transaction +DB::transaction(function () use ($id) { + $product = Product::where('id', $id)->lockForUpdate()->first(); + + // Read and update the product while the database lock is held. +}); +``` + +## Use `mb_*` String Functions + +When no Laravel helper exists, prefer multibyte-aware functions such as `mb_strlen()` and `mb_strtolower()` for UTF-8 text. For example, `strlen()` counts bytes, while `strtolower()` is not multibyte-aware. + +Incorrect: + +```php +strlen('José'); // 5 bytes, not 4 characters +strtolower('MÜNCHEN'); // Does not lowercase Ü +``` + +Correct: + +```php +mb_strlen('José'); // 4 characters +mb_strtolower('MÜNCHEN'); // 'münchen' + +// Prefer Laravel's Str helpers when available +Str::length('José'); // 4 +Str::lower('MÜNCHEN'); // 'münchen' +``` + +## Use `defer()` for Post-Response Work + +For lightweight work that does not need retries or crash durability, consider `defer()` instead of dispatching a job. During an HTTP request, the callback normally runs after the response has been sent but remains in the same PHP process. + +Queued and durable: + +```php +dispatch(new LogPageView($page)); +``` + +Deferred in the current process: + +```php +defer(fn () => PageView::create(['page_id' => $page->id, 'user_id' => auth()->id()])); +``` + +Use a queued job when the work needs retries, queue controls, or durability across process failures. + +## Use `Context` for Request-Scoped Data + +The `Context` facade makes contextual data available across the current execution lifecycle without manually passing arguments through every layer. + +```php +// In middleware +Context::add('tenant_id', $request->header('X-Tenant-ID')); + +// Later in the same execution lifecycle +$tenantId = Context::get('tenant_id'); +``` + +Visible context is added to log context, and both visible and hidden context are captured and restored for queued jobs. Use `Context::addHidden()` for data that should propagate to queued jobs without appearing in logs. Do not place secrets in context unless that propagation is intended. + +## Use `Concurrency::run()` for Parallel Execution + +Run independent operations concurrently through Laravel's configured concurrency driver. + +```php +use Illuminate\Support\Facades\Concurrency; + +[$users, $orders] = Concurrency::run([ + fn () => User::count(), + fn () => Order::where('status', 'pending')->count(), +]); +``` + +With a process-based driver, each closure runs in a separate PHP process that boots the application. Use concurrency when independent database queries, HTTP client calls, or computations benefit enough to offset process and serialization overhead. The `sync` driver executes closures sequentially and is useful primarily during testing. + +## Follow Framework Conventions + +Follow Laravel conventions unless the domain or an existing schema requires an override. + +Customized schema: + +```php +class Customer extends Model +{ + protected $table = 'Customer'; + protected $primaryKey = 'customer_id'; + + public function roles(): BelongsToMany + { + return $this->belongsToMany(Role::class, 'role_customer', 'customer_id', 'role_id'); + } +} +``` + +Conventional schema: + +```php +class Customer extends Model +{ + public function roles(): BelongsToMany + { + return $this->belongsToMany(Role::class); + } +} +``` diff --git a/.claude/skills/laravel-best-practices/rules/blade-views.md b/.claude/skills/laravel-best-practices/rules/blade-views.md new file mode 100644 index 0000000..4ea2c6c --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/blade-views.md @@ -0,0 +1,36 @@ +# Blade and View Best Practices + +## Use `$attributes->merge()` in Component Templates + +Use the component attribute bag so callers can add attributes. `merge()` combines default attributes with caller-provided values; class values receive special merging behavior. + +```blade +
merge(['class' => 'alert alert-'.$type]) }}> + {{ $message }} +
+``` + +## Use `@pushOnce` for Per-Component Scripts + +If a component renders repeatedly, `@push` adds its script on every render. Use a consistently named `@pushOnce` block to add that content once per rendered response. + +## Prefer Components for Explicit Interfaces + +Use a Blade component when a reusable interface benefits from explicit props, an attribute bag, or slots. An include remains suitable for a small partial that intentionally uses the current view data; pass an explicit data array when implicit variable sharing would obscure its dependencies. + +## Share Compatible View Data with a View Composer + +Use a view composer to centralize data needed whenever one or more named Blade views are rendered. Keep the composer compatible with every view it targets, and avoid broad wildcards when views require different data shapes. A view composer runs when Laravel renders the matching view; it does not supply data to JSON, streamed, or other non-view responses. + +## Return Blade Fragments for Partial Rendering + +A route can return either a full view or a named fragment for clients such as htmx or Turbo. + +```php +return view('dashboard', compact('users')) + ->fragmentIf($request->hasHeader('HX-Request'), 'user-list'); +``` + +## Share Parent Component Props with `@aware` + +Use `@aware` when a nested component needs a prop explicitly passed to an ancestor component. It does not expose an ancestor's default prop value unless that value was passed through the attribute bag. diff --git a/.claude/skills/laravel-best-practices/rules/caching.md b/.claude/skills/laravel-best-practices/rules/caching.md new file mode 100644 index 0000000..cd2ffd6 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/caching.md @@ -0,0 +1,100 @@ +# Caching Best Practices + +## Use `Cache::remember()` for Cache-Aside Reads + +`Cache::remember()` implements a cache-aside read without a separate truthiness check. It does not prevent concurrent requests from computing the same missing value; use an atomic lock when duplicate computation must be prevented. + +The manual version below incorrectly treats valid falsy values, such as `false` or `0`, as cache misses. + +Incorrect: + +```php +$val = Cache::get('stats'); +if (! $val) { + $val = $this->computeStats(); + Cache::put('stats', $val, 60); +} +``` + +Correct: + +```php +$val = Cache::remember('stats', 60, fn () => $this->computeStats()); +``` + +## Consider `Cache::flexible()` for Stale-While-Revalidate + +For frequently read keys, `Cache::flexible()` can serve stale data during a defined stale period and register a deferred refresh. During an HTTP request, that refresh normally runs after the response; it is not a durable background job. Once the stale period has elapsed, the request recomputes the value synchronously. + +Synchronous expiration: + +```php +Cache::remember('users', 300, fn () => User::all()); +``` + +Stale-while-revalidate tradeoff: + +```php +Cache::flexible('users', [300, 600], fn () => User::all()); +``` + +This value is fresh for five minutes and may be served stale until ten minutes after it was cached. + +## Use `Cache::memo()` to Avoid Redundant Hits Within an Execution + +If the same cache key is read repeatedly during one request or job, `memo()` decorates a cache store and retains resolved values in memory for that execution. + +```php +$settings = Cache::memo()->get('settings'); +``` + +Repeated reads through the same memoized store avoid additional store lookups. Writes through the memoized store update or invalidate its in-memory values as appropriate. + +## Use Cache Tags to Invalidate Related Groups + +Tags group related entries for invalidation without tracking each key. Cache tags are not supported by the `file`, `dynamodb`, or `database` drivers; confirm support before choosing a store. + +```php +Cache::tags(['user-1'])->flush(); +``` + +## Use `Cache::add()` for Atomic Conditional Writes + +`add()` atomically writes a value only when the key does not already exist. + +Incorrect: + +```php +if (! Cache::has('lock')) { + Cache::put('lock', true, 10); +} +``` + +Correct: + +```php +Cache::add('lock', true, 10); +``` + +Use `Cache::lock()` rather than an ordinary cache key when lock ownership and safe release are required. + +## Use `once()` for In-Process Memoization + +`once()` memoizes a callback's return value for the current request or job. Calls made from an object instance are scoped to that instance. Unlike `Cache::memo()`, `once()` does not read from an external cache store. + +```php +public function roles(): Collection +{ + return once(fn () => $this->loadRoles()); +} +``` + +Repeated calls return the memoized result without rerunning the callback. Use `once()` for repeated computation within one execution. Use `Cache::memo()` to memoize access to an underlying store that can also persist values across executions. + +## Configure Failover Cache Stores in Production + +The failover driver tries each configured store in order when a store operation throws an exception. It does not consult later stores for an ordinary cache miss, and data is not replicated between stores. + +```php +'failover' => ['driver' => 'failover', 'stores' => ['redis', 'database']], +``` diff --git a/.claude/skills/laravel-best-practices/rules/collections.md b/.claude/skills/laravel-best-practices/rules/collections.md new file mode 100644 index 0000000..211fec1 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/collections.md @@ -0,0 +1,72 @@ +# Collection Best Practices + +## Use Higher-Order Messages for Simple Operations + +Explicit closure: + +```php +$users->each(function (User $user) { + $user->markAsVip(); +}); +``` + +Concise equivalent: + +```php +$users->each->markAsVip(); +``` + +Higher-order messages are available for supported collection methods such as `each`, `map`, `filter`, and `sum`. Use an explicit closure when arguments or nontrivial logic would be clearer. + +## Choose Between `cursor()` and `lazy()` + +`cursor()` executes one query and hydrates models individually, but it cannot eager load relationships. The database driver's result buffering can still consume substantial memory for very large results. Use it for low-memory, attribute-only iteration when one long-running query is acceptable. + +`lazy()` executes multiple chunked queries and returns a flat `LazyCollection`. It supports eager loading relationships for each chunk and avoids holding one database cursor open for the entire iteration. + +With relationships: + +```php +User::with('roles')->lazy()->each(function (User $user) { + // The roles for this chunk have been eager loaded. +}); +``` + +Without relationships: + +```php +User::cursor()->each(function (User $user) { + // Process model attributes. +}); +``` + +## Use `lazyById()` When Updating Records While Iterating + +`lazy()` uses offset pagination, so updates to columns that affect the query can shift rows and cause records to be skipped or processed twice. `lazyById()` paginates by a monotonic key and is safer when updating other columns during iteration. Do not change the pagination key itself while iterating. + +## Use `toQuery()` for Bulk Operations on Collections + +Use `toQuery()` to build a query from the models in an Eloquent collection instead of manually constructing a `whereIn` clause. + +Manual query: + +```php +User::whereIn('id', $users->modelKeys())->update(['active' => false]); +``` + +Collection query: + +```php +$users->toQuery()->update(['active' => false]); +``` + +`toQuery()` requires a non-empty Eloquent collection whose models are of the same type. Like other bulk Eloquent updates, it does not dispatch per-model update events, so use it only when those events are not required. + +## Use `#[CollectedBy]` for Custom Collection Classes + +The `#[CollectedBy]` attribute declares the custom collection class without requiring a `newCollection()` override. + +```php +#[CollectedBy(UserCollection::class)] +class User extends Model {} +``` diff --git a/.claude/skills/laravel-best-practices/rules/config.md b/.claude/skills/laravel-best-practices/rules/config.md new file mode 100644 index 0000000..5a34de1 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/config.md @@ -0,0 +1,87 @@ +# Configuration Best Practices + +## Read Environment Variables in Configuration Files + +Call `env()` only from configuration files. After configuration is cached, Laravel does not load the application's `.env` file, so application code should read configuration values through `config()`. + +Incorrect: + +```php +$key = env('API_KEY'); +``` + +Correct: + +```php +// config/services.php +return [ + 'key' => env('API_KEY'), +]; + +// Application code +$key = config('services.key'); +``` + +## Protect Production Secrets + +Do not commit plaintext production secrets. Laravel can encrypt an environment file so its encrypted form can be stored safely, while deployment platforms can supply secrets through their native secret stores. + +Incorrect: + +```bash + +# A plaintext .env file committed to the repository + +STRIPE_SECRET=sk_live_abc123 +AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI +``` + +Encrypted environment file: + +```bash +php artisan env:encrypt --env=production --readable +php artisan env:decrypt --env=production +``` + +For hosted deployments, consider the platform's native secret store, such as AWS Secrets Manager or Vault, and inject secrets at runtime. + +## Use `App::environment()` for Environment Checks + +Incorrect: + +```php +if (env('APP_ENV') === 'production') { + // ... +} +``` + +Correct: + +```php +if (app()->isProduction()) { + // ... +} + +if (App::environment('production')) { + // ... +} +``` + +## Name Repeated Domain Values + +Use an enum or class constant when a domain value is repeated or represents a constrained set. A one-off string literal does not always need a named constant. + +```php +// Repeated literal +return $this->type === 'normal'; + +// Named domain value +return $this->type === self::TYPE_NORMAL; +``` + +If the application supports localization, put user-facing strings in language files and retrieve them with `__()`. Simple literals are reasonable for applications that intentionally do not support multiple languages. + +```php +// In a localized application +return back()->with('message', __('app.article_added')); +``` diff --git a/.claude/skills/laravel-best-practices/rules/db-performance.md b/.claude/skills/laravel-best-practices/rules/db-performance.md new file mode 100644 index 0000000..3f33977 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/db-performance.md @@ -0,0 +1,189 @@ +# Database Performance Best Practices + +## Eager Load Relationships Before Iterating + +When a relationship will be accessed for many models, eager load it with `with()` to avoid running one initial query plus one relationship query per model, commonly called an N+1 query pattern. Lazy loading is reasonable when the relationship may not be needed or only one model is involved. + +Lazy-loaded version: + +```php +$posts = Post::all(); +foreach ($posts as $post) { + echo $post->author->name; +} +``` + +Eager-loaded version: + +```php +$posts = Post::with('author')->get(); +foreach ($posts as $post) { + echo $post->author->name; +} +``` + +Constrain eager loads when large columns are unnecessary. Include the related model's primary key and every column Eloquent needs to match the relationship. In this example, `users.id` and `posts.user_id` match posts to users, while selecting `posts.id` preserves each related model's primary key: + +```php +$users = User::with(['posts' => function ($query) { + $query->select('id', 'user_id', 'title') + ->where('published', true) + ->latest() + ->limit(10); +}])->get(); +``` + +## Prevent Lazy Loading in Development + +Enable this in `AppServiceProvider::boot()` to catch N+1 issues during development. + +```php +public function boot(): void +{ + Model::preventLazyLoading(! app()->isProduction()); +} +``` + +By default, accessing an unloaded relationship then throws a `LazyLoadingViolationException`. Applications can customize violation handling with `handleLazyLoadingViolationUsing()`. + +## Select Only Needed Columns + +Select only the columns the operation needs when omitting large text, binary, or JSON columns provides a meaningful benefit. + +All columns: + +```php +$posts = Post::with('author')->get(); +``` + +Selected columns: + +```php +$posts = Post::select('id', 'title', 'user_id', 'created_at') + ->with(['author:id,name,avatar']) + ->get(); +``` + +When limiting selected columns, retain every key Eloquent needs for matching. A `belongsTo` relationship needs its foreign key on the parent query and the owner's key on the related query. A `hasMany` relationship needs the parent's local key and the related model's foreign key. + +## Process Large Data Sets Incrementally + +Use chunking or lazy iteration when loading an entire result set would exceed the application's practical memory budget. + +Loads the complete result set: + +```php +$users = User::all(); +foreach ($users as $user) { + $user->notify(new WeeklyDigest); +} +``` + +Processes bounded chunks: + +```php +User::where('subscribed', true)->chunk(200, function ($users) { + foreach ($users as $user) { + $user->notify(new WeeklyDigest); + } +}); +``` + +Use `chunkById()` when updates can change which rows match the query. Standard `chunk()` uses offset pagination, whose result positions can shift as rows change: + +```php +User::where('active', false)->chunkById(200, function ($users) { + $users->each->delete(); +}); +``` + +For read-only, attribute-only iteration, `cursor()` hydrates models individually from one query, although some database drivers still buffer raw results. Use `lazy()` when relationships must be eager loaded in chunks, and use `lazyById()` or `chunkById()` when updates can affect query membership. See the collection rules for detailed tradeoffs. + +## Add Indexes for Measured Query Patterns + +Design indexes around frequent, performance-sensitive query patterns. A column's presence in `WHERE`, `ORDER BY`, `JOIN`, or `GROUP BY` does not by itself justify an index; selectivity, write cost, existing indexes, and the database query plan all matter. + +Schema without an application-specific query index: + +```php +Schema::create('orders', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id')->constrained(); + $table->string('status'); + $table->timestamps(); +}); +``` + +Schema optimized for `WHERE status = ? ORDER BY created_at`: + +```php +Schema::create('orders', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id')->constrained(); + $table->string('status'); + $table->timestamps(); + $table->index(['status', 'created_at']); +}); +``` + +Confirm composite index column order and effectiveness with production-like data and the database's query-plan tools. Also check whether the database already created an index to support a foreign key before adding another one. + +## Count Relationships Without Loading Them + +Use `withCount()` when only relationship counts are needed; loading and hydrating every related model wastes memory. + +Loads related models: + +```php +$posts = Post::all(); +foreach ($posts as $post) { + echo $post->comments->count(); +} +``` + +Selects relationship counts: + +```php +$posts = Post::withCount('comments')->get(); +foreach ($posts as $post) { + echo $post->comments_count; +} +``` + +Conditional counting: + +```php +$posts = Post::withCount([ + 'comments', + 'comments as approved_comments_count' => function ($query) { + $query->where('approved', true); + }, +])->get(); +``` + +## Keep Queries Out of Blade Templates + +Prepare data before rendering a Blade template, such as in a controller, query service, or view composer. This keeps query behavior visible and testable. + +Query in the template: + +```blade +@foreach (User::all() as $user) + {{ $user->profile->name }} +@endforeach +``` + +Data prepared before rendering: + +```php +// Controller +$users = User::with('profile')->get(); + +return view('users.index', compact('users')); +``` + +```blade +@foreach ($users as $user) + {{ $user->profile->name }} +@endforeach +``` diff --git a/.claude/skills/laravel-best-practices/rules/eloquent.md b/.claude/skills/laravel-best-practices/rules/eloquent.md new file mode 100644 index 0000000..5a89510 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/eloquent.md @@ -0,0 +1,158 @@ +# Eloquent Best Practices + +## Define Precise Relationship Types + +Define the relationship that matches the database association, and declare its concrete return type. + +```php +public function comments(): HasMany +{ + return $this->hasMany(Comment::class); +} + +public function author(): BelongsTo +{ + return $this->belongsTo(User::class, 'user_id'); +} +``` + +## Use Local Scopes for Reusable Queries + +Extract reusable query constraints into local scopes to avoid duplication. + +Duplicated constraints: + +```php +$active = User::where('verified', true)->whereNotNull('activated_at')->get(); +$articles = Article::whereHas('user', function ($q) { + $q->where('verified', true)->whereNotNull('activated_at'); +})->get(); +``` + +Reusable local scope: + +```php +#[Scope] +protected function active(Builder $query): Builder +{ + return $query->where('verified', true)->whereNotNull('activated_at'); +} + +// Usage +$active = User::active()->get(); +$articles = Article::whereHas('user', fn ($q) => $q->active())->get(); +``` + +## Apply Global Scopes Sparingly + +Global scopes silently modify every query on the model, making debugging difficult. Prefer local scopes and reserve global scopes for truly universal constraints like soft deletes or multi-tenancy. + +Global scope tradeoff: + +```php +class PublishedScope implements Scope +{ + public function apply(Builder $builder, Model $model): void + { + $builder->where('published', true); + } +} + +// Admin panels, reports, and jobs now omit drafts unless the scope is removed. +``` + +Explicit local scope: + +```php +#[Scope] +protected function published(Builder $query): Builder +{ + return $query->where('published', true); +} + +Post::published()->paginate(); // Explicit +Post::paginate(); // Admin sees all +``` + +## Define Attribute Casts + +Use the `casts()` method (or `$casts` property following project convention) for automatic type conversion. + +```php +protected function casts(): array +{ + return [ + 'is_active' => 'boolean', + 'metadata' => 'array', + 'total' => 'decimal:2', + ]; +} +``` + +## Cast Date and Time Attributes + +Cast a date or timestamp attribute when application code should treat it as a Carbon instance. Eloquent already casts the conventional `created_at` and `updated_at` timestamps. + +Manual parsing in the template: + +```blade +{{ Carbon::parse($order->ordered_at)->toDateString() }} +``` + +Model cast: + +```php +protected function casts(): array +{ + return [ + 'ordered_at' => 'datetime', + ]; +} +``` + +```blade +{{ $order->ordered_at->toDateString() }} +{{ $order->ordered_at->format('m-d') }} +``` + +## Use `whereBelongsTo()` for Relationship Queries + +`whereBelongsTo()` expresses the relationship constraint without manually specifying its foreign key. + +Foreign key constraint: + +```php +Post::where('user_id', $user->id)->get(); +``` + +Relationship-aware constraint: + +```php +Post::whereBelongsTo($user)->get(); +Post::whereBelongsTo($user, 'author')->get(); +``` + +## Keep Application Queries Model-Aware + +Prefer Eloquent models and relationships for model-backed application queries. They preserve casts, scopes, and model table configuration. The query builder and raw SQL legitimately require table names, so use them when their lower-level behavior is intentional. + +Lower-level alternatives: + +```php +DB::table('users')->where('active', true)->get(); + +$query->join('companies', 'companies.id', '=', 'users.company_id'); + +DB::select('SELECT * FROM orders WHERE status = ?', ['pending']); +``` + +Model-aware queries: + +```php +User::where('active', true)->get(); +Order::where('status', 'pending')->get(); +``` + +When a query builder operation should follow a model's configured table name, use `(new User)->getTable()`. For complex joins or raw SQL, explicit table names may be clearer; keep those references covered by tests when schema changes are possible. + +In migrations, use explicit table names rather than application models. Migrations are historical snapshots, while models and their scopes can change after a migration is deployed. diff --git a/.claude/skills/laravel-best-practices/rules/error-handling.md b/.claude/skills/laravel-best-practices/rules/error-handling.md new file mode 100644 index 0000000..afcdf4a --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/error-handling.md @@ -0,0 +1,77 @@ +# Error Handling Best Practices + +## Choose Where to Report and Render Exceptions + +Laravel supports exception-specific methods and centralized handler callbacks. Follow the pattern already established by the project. + +Exception methods keep behavior beside the exception definition: + +```php +class InvalidOrderException extends Exception +{ + public function report(): void + { + // Send the exception to a custom reporter. + } + + public function render(Request $request): Response + { + return response()->view('errors.invalid-order', status: 422); + } +} +``` + +Centralized callbacks in `bootstrap/app.php` keep the application's exception policy together: + +```php +->withExceptions(function (Exceptions $exceptions) { + $exceptions->report(function (InvalidOrderException $e) { + // Send the exception to a custom reporter. + }); + $exceptions->render(function (InvalidOrderException $e, Request $request) { + return response()->view('errors.invalid-order', status: 422); + }); +}) +``` + +An exception's `report()` method suppresses Laravel's default reporting unless it returns `false`. A report callback allows default reporting unless it returns `false` or is chained with `stop()`. Use `ShouldntReport` or `dontReport()` when the handler should not report an exception at all. By contrast, returning `false` from a `render()` method or render callback defers to Laravel's default rendering. + +## Mark Exceptions the Handler Should Not Report + +Implementing `ShouldntReport` prevents Laravel's exception handler from reporting that exception type and keeps the policy visible on the class. It does not prevent application code from logging the exception explicitly. + +```php +class PodcastProcessingException extends Exception implements ShouldntReport {} +``` + +## Throttle High-Volume Exception Reports + +A failing integration can flood logs or error tracking. Configure `throttle()` with a `Lottery` or `Limit` result to sample or rate-limit matching exception reports. Choose keys deliberately when separate exception classes, tenants, or integrations need independent limits. + +## Prevent Duplicate Reports of One Exception Instance + +Enable `dontReportDuplicates()` when the same exception object may pass through multiple `report($exception)` calls. It deduplicates by object identity, not by exception class or message. + +## Define JSON Rendering for API Routes + +Laravel normally uses request content negotiation to decide whether to render an exception as JSON. If the application's API contract requires JSON regardless of the `Accept` header, define that policy explicitly for the relevant routes. + +```php +$exceptions->shouldRenderJsonWhen(function (Request $request, Throwable $e) { + return $request->is('api/*') || $request->expectsJson(); +}); +``` + +## Add Context to Exception Classes + +Attach structured data to an exception through `context()`. Laravel merges that data into the exception's log context when the handler reports it. + +```php +class InvalidOrderException extends Exception +{ + public function context(): array + { + return ['order_id' => $this->orderId]; + } +} +``` diff --git a/.claude/skills/laravel-best-practices/rules/events-notifications.md b/.claude/skills/laravel-best-practices/rules/events-notifications.md new file mode 100644 index 0000000..a8cce31 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/events-notifications.md @@ -0,0 +1,52 @@ +# Events and Notifications Best Practices + +## Rely on Event Discovery + +Laravel discovers listeners in the configured listener directories by inspecting type-hinted event arguments on `handle()` or `__invoke()` methods. Register listeners manually only when discovery is disabled, the listener is outside those directories, or explicit registration is clearer. + +## Cache Event Discovery During Production Deployment + +Cache discovered listeners during production deployment with `php artisan optimize` or `php artisan event:cache`. Rebuild the cache whenever listener definitions change. + +## Use `ShouldDispatchAfterCommit` Inside Transactions + +When an event is dispatched inside a database transaction, `ShouldDispatchAfterCommit` delays dispatch until all open database transactions commit. If a transaction rolls back, Laravel discards the event. This affects synchronous and queued listeners; it is not limited to queue timing. + +```php +class OrderShipped implements ShouldDispatchAfterCommit {} +``` + +## Queue Slow Notifications + +Queue notifications that call external services, such as email, text messaging, or Slack, when they do not need to complete before the response. Keep a notification synchronous when immediate completion or failure feedback is part of the operation. + +```php +class InvoicePaid extends Notification implements ShouldQueue +{ + use Queueable; +} +``` + +## Dispatch Queued Notifications After Commit + +A queued notification sent inside a database transaction can run before the transaction commits. Call `afterCommit()` on the queued notification, or enable the queue connection's `after_commit` option, when its delivery depends on committed data. This setting has no scheduling effect on a synchronous notification. + +```php +$user->notify((new InvoicePaid($invoice))->afterCommit()); +``` + +## Route Notification Channels to Dedicated Queues + +Different notification channels can have different latency and priority requirements. Implement `viaQueues()` when channels should use separate queues. + +## Use On-Demand Notifications for Non-User Recipients + +Avoid creating dummy models to send notifications to arbitrary addresses. + +```php +Notification::route('mail', 'admin@example.com')->notify(new SystemAlert()); +``` + +## Implement `HasLocalePreference` on Notifiable Models + +Implement `HasLocalePreference::preferredLocale()` on a notifiable model when notifications and mailables should use the recipient's locale. Laravel also preserves that locale for queued delivery. An explicit `locale()` call can still override the preference for an individual notification. diff --git a/.claude/skills/laravel-best-practices/rules/http-client.md b/.claude/skills/laravel-best-practices/rules/http-client.md new file mode 100644 index 0000000..cc8fdd6 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/http-client.md @@ -0,0 +1,157 @@ +# HTTP Client Best Practices + +## Set Explicit Timeouts + +Laravel's HTTP client has a 30-second response timeout by default. Choose response and connection timeouts that fit the service and the calling request or job. Remember that retries can multiply the total elapsed time. + +Less resilient: + +```php +$response = Http::get('https://api.example.com/users'); +``` + +Preferred: + +```php +$response = Http::connectTimeout(3) + ->timeout(5) + ->get('https://api.example.com/users'); +``` + +Define shared settings in a macro or a dedicated client: + +```php +Http::macro('github', function () { + return Http::baseUrl('https://api.github.com') + ->connectTimeout(3) + ->timeout(10) + ->withToken(config('services.github.token')); +}); + +$response = Http::github()->get('/repos/laravel/framework'); +``` + +## Retry Only Safe Operations + +Retry transient connection failures, rate-limit responses, and server errors with an appropriate delay. Retry idempotent requests such as `GET` when the operation can safely run more than once. Retry a state-changing request only when the remote API supports an idempotency key or provides equivalent duplicate protection. + +Unsafe without an idempotency guarantee: + +```php +$response = Http::retry([100, 500, 1000]) + ->post('https://api.example.com/v1/charges', $data); +``` + +Safe for an idempotent request: + +```php +$response = Http::connectTimeout(3) + ->timeout(10) + ->retry([100, 500, 1000], 0, function (Throwable $exception) { + return $exception instanceof ConnectionException + || ($exception instanceof RequestException + && ($exception->response->serverError() || $exception->response->status() === 429)); + }) + ->get('https://api.example.com/data'); +``` + +For a supported state-changing API, send a stable idempotency key for every attempt: + +```php +$response = Http::withHeaders(['Idempotency-Key' => $paymentAttempt->uuid]) + ->connectTimeout(3) + ->timeout(10) + ->retry([100, 500, 1000], 0, function (Throwable $exception) { + return $exception instanceof ConnectionException + || ($exception instanceof RequestException + && ($exception->response->serverError() || $exception->response->status() === 429)); + }) + ->post('https://api.example.com/v1/charges', $data); +``` + +## Handle Errors Explicitly + +The HTTP client returns responses for `4xx` and `5xx` status codes instead of throwing by default. Inspect the expected statuses or call `throw()` before consuming a success payload. + +Unsafe when a success payload is expected: + +```php +$user = Http::get('https://api.example.com/users/1')->json(); +``` + +Preferred: + +```php +$user = Http::connectTimeout(3) + ->timeout(5) + ->get('https://api.example.com/users/1') + ->throw() + ->json(); +``` + +Handle expected alternatives explicitly when graceful degradation is required: + +```php +$response = Http::connectTimeout(3) + ->timeout(5) + ->get('https://api.example.com/users/1'); + +if ($response->successful()) { + return $response->json(); +} + +if ($response->notFound()) { + return null; +} + +$response->throw(); +``` + +## Pool Independent Requests + +Use `Http::pool()` when several independent requests can run concurrently. Pooling changes execution time, not error handling; inspect or throw for each response as needed. + +```php +use Illuminate\Http\Client\Pool; + +$responses = Http::pool(fn (Pool $pool) => [ + $pool->as('users')->connectTimeout(3)->timeout(5) + ->get('https://api.example.com/users'), + $pool->as('posts')->connectTimeout(3)->timeout(5) + ->get('https://api.example.com/posts'), +]); + +$users = $responses['users']->throw()->json(); +$posts = $responses['posts']->throw()->json(); +``` + +## Fake HTTP Requests in Tests + +Use `Http::fake()` for external integrations, and use `Http::preventStrayRequests()` when an unexpected real request should fail the test. Also test timeouts, connection failures, and error responses that the application handles. + +```php +it('syncs a user from the API', function () { + Http::preventStrayRequests(); + + Http::fake([ + 'api.example.com/users/1' => Http::response([ + 'name' => 'John Doe', + 'email' => 'john@example.com', + ]), + ]); + + (new UserSyncService)->sync(1); + + Http::assertSent(fn (Request $request) => + $request->url() === 'https://api.example.com/users/1' + ); +}); +``` + +For example, fake a connection failure when testing the integration's failure path: + +```php +Http::fake([ + 'api.example.com/*' => Http::failedConnection(), +]); +``` diff --git a/.claude/skills/laravel-best-practices/rules/mail.md b/.claude/skills/laravel-best-practices/rules/mail.md new file mode 100644 index 0000000..f631043 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/mail.md @@ -0,0 +1,54 @@ +# Mail Best Practices + +## Queue Slow Mail Delivery + +Implement `ShouldQueue` on a mailable when delivery should normally happen in the background. Laravel queues that mailable even when the call site uses `Mail::send()`. + +```php +class OrderShipped extends Mailable implements ShouldQueue +{ + use Queueable, SerializesModels; +} +``` + +Keep mail synchronous when the caller must know immediately whether delivery was accepted, or when no queue worker is available. + +## Dispatch Queued Mail After Commit + +A queued mailable dispatched during a database transaction can be processed before the transaction commits. Call `afterCommit()` on the mailable, or enable the queue connection's `after_commit` option, when the mail depends on committed records. + +```php +Mail::to($user)->send( + (new OrderShipped($order))->afterCommit() +); +``` + +If the transaction rolls back, an after-commit mailable is not dispatched. This setting affects queued mail only; it does not defer synchronous delivery. + +## Assert the Delivery Mode + +Use `Mail::assertQueued()` for queued mailables and `Mail::assertSent()` for synchronously sent mailables. + +Incorrect for a mailable that implements `ShouldQueue`: + +```php +Mail::assertSent(OrderShipped::class); +``` + +Correct: + +```php +Mail::assertQueued(OrderShipped::class); +``` + +## Use Markdown Mailables When They Fit + +Markdown mailables render HTML and plain-text versions from Laravel's mail components and support publishable themes. They are useful for conventional transactional messages, but a custom HTML and text pair may be more appropriate for a specialized design. + +```bash +php artisan make:mail OrderShipped --markdown=mail.orders.shipped +``` + +## Separate Content and Delivery Tests + +Test rendered content by instantiating the mailable and using assertions such as `assertSeeInHtml()` and `assertSeeInText()`. Test delivery separately with `Mail::fake()` and `assertSent()` or `assertQueued()` so failures identify the affected behavior. diff --git a/.claude/skills/laravel-best-practices/rules/migrations.md b/.claude/skills/laravel-best-practices/rules/migrations.md new file mode 100644 index 0000000..3345402 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/migrations.md @@ -0,0 +1,67 @@ +# Migration Best Practices + +## Generate Migrations with Artisan + +Use `php artisan make:migration` to generate the timestamped filename and migration structure. + +```bash +php artisan make:migration create_posts_table +php artisan make:migration add_slug_to_posts_table +``` + +## Define Foreign-Key Constraints Deliberately + +Use `constrained()` when its naming conventions and default actions match the relationship. Specify the table or delete behavior when they do not. + +```php +$table->foreignId('user_id')->constrained()->cascadeOnDelete(); +$table->foreignId('author_id')->constrained('users'); +``` + +Do not add a duplicate single-column index without checking the database driver's treatment of foreign-key indexes and the indexes already created by the migration. + +## Treat Deployed Migrations as Immutable + +After a migration has run in a shared or production environment, create a new migration for subsequent changes. Editing the old file makes fresh installations differ from upgraded installations. + +For a local migration that has not been shared or deployed, editing and rerunning it may be simpler. + +## Design Indexes for Real Queries + +Add indexes based on query patterns, selectivity, write cost, and the database's ability to use composite indexes. A column appearing in `WHERE`, `ORDER BY`, or `JOIN` does not automatically need its own index. + +Declare each selected index in the schema migration that creates or changes the relevant table. Confirm important indexes with representative data and the database's query plan, and avoid redundant indexes whose leading columns duplicate an existing index without serving a distinct query. See the database performance and advanced query rules for index selection and column-order guidance. + +## Stage Changes That Affect Existing Rows + +Adding a required or unique column to a populated table often needs multiple deployment-safe steps. Add a nullable column, deploy code that can handle both states, backfill existing rows in bounded chunks, then add the required constraint or index after the data is valid. + +Do not assume this migration is safe on a populated table: + +```php +$table->string('slug')->unique(); +``` + +Large backfills are usually better implemented as an observable, restartable command or job than inside a schema migration. Small deterministic data changes may be reasonable in a migration when their locking, transaction, and deployment behavior is understood. + +## Mirror Defaults Only When Unsaved Models Need Them + +A database default is applied when a row is inserted, not when a model is instantiated. Mirror the value in the model's `$attributes` only when application code must observe that default before persistence, and keep both definitions synchronized. + +```php +// Migration +$table->string('status')->default('pending'); + +// Model +protected $attributes = [ + 'status' => 'pending', +]; +``` + +## Make Rollbacks Honest + +Implement `down()` when the change can be safely reversed. A rollback that drops populated columns or cannot restore transformed data is destructive even if it is syntactically reversible; document that limitation and prefer a forward-fix migration in production. + +## Keep Migrations Focused + +Keep each migration small enough to reason about, deploy, and reverse. Separate long-running backfills from schema changes when doing so reduces locks and supports phased deployment, but do not split related operations merely to enforce a blanket separation between data definition and data manipulation. diff --git a/.claude/skills/laravel-best-practices/rules/queue-jobs.md b/.claude/skills/laravel-best-practices/rules/queue-jobs.md new file mode 100644 index 0000000..011828a --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/queue-jobs.md @@ -0,0 +1,117 @@ +# Queue and Job Best Practices + +## Keep Reservation Time Longer Than Execution Time + +For queue drivers that use Laravel's `retry_after` setting, configure it to exceed the longest worker or job timeout by a safety margin. When a reservation expires, another worker can reserve the same job while the first process is still running. Keep the worker's `--timeout` several seconds shorter than `retry_after`. + +```php +// Job +public $timeout = 120; + +// config/queue.php for the connection +'retry_after' => 150, +``` + +Amazon Simple Queue Service uses its visibility timeout instead of Laravel's `retry_after`; configure that timeout at the queue level. Because workers can also stop after side effects but before acknowledging a job, make important jobs idempotent even with correct timeout settings. + +## Back Off Transient Failures + +Use progressively longer delays when a dependency needs time to recover. Do not retry permanent validation or business-rule failures. + +```php +class SyncWithStripe implements ShouldQueue +{ + public $tries = 4; + + public $backoff = [1, 5, 10]; +} +``` + +Rate-limiting and exception-throttling middleware can release jobs back to the queue. Released attempts may still count toward the maximum attempt limit, so configure `$tries` or `retryUntil()` to allow the intended retry window. + +## Use Unique Jobs for Dispatch Deduplication + +Implement `ShouldBeUnique` when only one queued instance of a logical job should exist. Uniqueness uses a cache lock and is not a substitute for idempotent processing or a database constraint. + +```php +class GenerateInvoice implements ShouldQueue, ShouldBeUnique +{ + public $uniqueFor = 3600; + + public function uniqueId(): string + { + return (string) $this->order->id; + } +} +``` + +All dispatching processes must use a shared cache that supports locks. Unique-job constraints do not apply to jobs within batches. + +Use `ShouldBeUniqueUntilProcessing` only when the lock should be released immediately before processing begins, allowing another instance to be dispatched while the first is running: + +```php +class UpdateSearchIndex implements ShouldQueue, ShouldBeUniqueUntilProcessing +{ + // ... +} +``` + +## Handle Terminal Failure When Needed + +Implement `failed()` when the application must update state, alert an operator, or record domain-specific context after all attempts are exhausted. Logging every failure in each job may duplicate the queue system's failure reporting. + +Laravel invokes `failed()` on a new job instance, so mutations made to the job during `handle()` are not available there. + +```php +public function failed(?Throwable $exception): void +{ + $this->podcast->update(['status' => 'failed']); + + Log::error('Podcast processing failed', [ + 'podcast_id' => $this->podcast->id, + 'exception' => $exception, + ]); +} +``` + +## Rate Limit External Calls + +Use queue middleware such as `RateLimited` when jobs share a third-party API quota. Define the named limiter and choose release delays and attempt limits together. + +```php +public function middleware(): array +{ + return [new RateLimited('external-api')]; +} +``` + +## Batch Jobs for Group Coordination + +Use `Bus::batch()` to monitor a group of jobs and run callbacks when the batch completes or encounters failures. A batch is not a database transaction: completed jobs are not rolled back when another job fails. By default, one failed job cancels the batch; call `allowFailures()` only when partial failure is acceptable. + +```php +Bus::batch([ + new ImportCsvChunk($chunk1), + new ImportCsvChunk($chunk2), +]) + ->then(fn (Batch $batch) => Notification::send($user, new ImportComplete)) + ->catch(fn (Batch $batch, Throwable $exception) => Log::error('Import batch failed', [ + 'exception' => $exception, + ])) + ->dispatch(); +``` + +## Configure Time-Based Retry Limits Deliberately + +Use `retryUntil()` as the time-based alternative to a maximum attempt count. Laravel may attempt the job any number of times until this deadline, subject to other failure conditions such as maximum exceptions. The method takes precedence over attempt-based limits, so setting `$tries = 0` is not required. + +```php +public function retryUntil(): DateTimeInterface +{ + return now()->addHours(4); +} +``` + +## Use Horizon for Redis Queue Operations + +Laravel Horizon provides monitoring, balancing, metrics, and supervisor configuration for Redis queues. It does not support non-Redis queue drivers. diff --git a/.claude/skills/laravel-best-practices/rules/routing.md b/.claude/skills/laravel-best-practices/rules/routing.md new file mode 100644 index 0000000..1d19ef2 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/routing.md @@ -0,0 +1,106 @@ +# Routing and Controller Best Practices + +## Use Implicit Route Model Binding + +Let Laravel resolve models from route parameters when the default lookup and missing-model behavior fit the endpoint. + +Instead of manual lookup: + +```php +public function show(int $id): View +{ + $post = Post::findOrFail($id); + + return view('posts.show', ['post' => $post]); +} +``` + +Use route model binding: + +```php +public function show(Post $post): View +{ + return view('posts.show', ['post' => $post]); +} +``` + +## Scope Nested Bindings + +Use scoped bindings when a nested resource must belong to its parent. This constrains model resolution; it does not replace authorization. + +```php +Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { + // The resolved post belongs to the resolved user. +})->scopeBindings(); +``` + +## Use Resource Routes for Resourceful Actions + +Use `Route::resource()` or `Route::apiResource()` when the endpoint follows Laravel's resource-controller actions. Define explicit routes when the behavior does not fit that vocabulary. + +```php +Route::resource('posts', PostController::class); + +// Alternatively, for an API-only resource: +Route::apiResource('posts', ApiPostController::class); +``` + +`apiResource()` omits the HTML-oriented `create` and `edit` routes. It does not itself add an `/api` prefix; that prefix comes from the application's API route configuration. + +## Organize Controllers Around Resources + +As a general default, organize each controller around one resource and use Laravel's standard resource actions: `index`, `show`, `create`, `store`, `edit`, `update`, and `destroy`. This keeps routes predictable and prevents controllers from accumulating unrelated behavior. + +When a controller needs a custom action such as `publish`, `approve`, or `archive`, first consider whether that behavior represents a separate resource. A focused resource controller gives the behavior its own authorization, validation, and middleware boundary. + +Custom action on the primary controller: + +```php +Route::post('/podcasts/{podcast}/publish', [PodcastController::class, 'publish']); +``` + +The published podcast modeled as a resource: + +```php +Route::post('/published-podcasts/{podcast}', [PublishedPodcastController::class, 'store']) + ->name('published-podcasts.store'); + +Route::delete('/published-podcasts/{podcast}', [PublishedPodcastController::class, 'destroy']) + ->name('published-podcasts.destroy'); +``` + +```php +class PublishedPodcastController extends Controller +{ + public function store(Podcast $podcast): RedirectResponse + { + $podcast->publish(); + + return back(); + } + + public function destroy(Podcast $podcast): RedirectResponse + { + $podcast->unpublish(); + + return back(); + } +} +``` + +Treat a custom verb as a design signal, not proof that another controller is required. Use query parameters for simple filtering, and keep an explicit action route when modeling the operation as a resource would obscure the domain or conflict with established project conventions. + +## Keep Controllers Focused on HTTP Concerns + +Controllers should coordinate HTTP input, authorization, validation, an application operation, and the response. Extract substantial or reusable business logic, but do not introduce an action or service merely to satisfy an arbitrary line limit. + +```php +public function store(StorePostRequest $request, CreatePostAction $create): RedirectResponse +{ + $post = $create->execute($request->validated()); + + return redirect()->route('posts.show', $post); +} +``` + +A form request can perform validation and authorization before the controller runs. Do not repeat its rules in the controller. Keep simple, endpoint-specific validation inline when extraction would not improve reuse or clarity; see the validation rules for detailed guidance. diff --git a/.claude/skills/laravel-best-practices/rules/scheduling.md b/.claude/skills/laravel-best-practices/rules/scheduling.md new file mode 100644 index 0000000..4c25134 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/scheduling.md @@ -0,0 +1,61 @@ +# Task Scheduling Best Practices + +## Prevent Unwanted Overlap + +Use `withoutOverlapping()` when a second run must not begin while the previous run holds the lock. This is appropriate for variable-duration tasks that are not safe to run concurrently. + +```php +Schedule::command('reports:generate') + ->everyFifteenMinutes() + ->withoutOverlapping(30); +``` + +The optional value is the lock expiration time in minutes, not the task timeout. Choose it carefully: the default is 24 hours, stale locks can be cleared with `php artisan schedule:clear-cache`, and an expiration that is too short can permit overlap while the first task still runs. The task itself should still tolerate retries and partial execution where practical. + +## Run a Task on One Server + +Use `onOneServer()` when only one scheduler node should run an eligible task. Scheduler nodes must use the same default cache store, and that store must support atomic locks. Supported stores include `database`, `memcached`, `dynamodb`, and `redis`. + +```php +Schedule::command('billing:charge')->daily()->onOneServer(); +``` + +Name scheduled closures before applying `onOneServer()`, especially when scheduling the same closure with different parameters, so each task has a distinct lock identity. + +## Run Eligible Commands in the Background + +Tasks due at the same time run sequentially by default. Use `runInBackground()` when an independent, long-running scheduled command should not delay later tasks. + +```php +Schedule::command('analytics:process')->hourly()->runInBackground(); +``` + +Laravel restricts `runInBackground()` to tasks scheduled with `command()` and `exec()`; it is not available for scheduled closures. Ensure background processes have appropriate logging and failure monitoring. + +## Restrict Tasks by Environment + +Use `environments()` when a task should run only in named application environments. Treat this as an operational safeguard, not an authorization control. + +```php +Schedule::command('billing:charge') + ->monthly() + ->environments(['production']); +``` + +## Group Shared Configuration + +Use schedule groups when several tasks genuinely share frequency or constraints. + +```php +Schedule::daily() + ->onOneServer() + ->timezone('America/New_York') + ->group(function () { + Schedule::command('emails:send --force'); + Schedule::command('emails:prune'); + }); +``` + +## Bound Work Inside the Task + +The scheduler does not provide a `takeUntilTimeout()` event method or terminate arbitrary tasks at a deadline. Bound work in the command or job itself by processing finite chunks, checking a deadline, or dispatching queue jobs with suitable timeouts. Use operating-system or process controls when hard termination is required. diff --git a/.claude/skills/laravel-best-practices/rules/security.md b/.claude/skills/laravel-best-practices/rules/security.md new file mode 100644 index 0000000..57b57f0 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/security.md @@ -0,0 +1,156 @@ +# Security Best Practices + +## Control Mass Assignment + +Define `$fillable` when a model is populated from request-derived arrays, or deliberately guard attributes by another consistent model convention. Laravel models guard all attributes by default; `$guarded = []` opts out of that protection. + +```php +class User extends Model +{ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; +} +``` + +Do not pass untrusted request data to a model with `$guarded = []`. Mass-assignment protection controls which attributes `create()`, `fill()`, and `update()` may set; it does not validate values or authorize the operation. + +## Authorize Protected Actions + +Use policies, gates, or form request authorization for actions that depend on the current user's permissions. Authentication alone does not establish permission, and validation is not authorization. + +```php +public function update(UpdatePostRequest $request, Post $post): RedirectResponse +{ + Gate::authorize('update', $post); + + $post->update($request->validated()); + + return redirect()->route('posts.show', $post); +} +``` + +Authorization may instead live in the form request: + +```php +public function authorize(): bool +{ + return $this->user()?->can('update', $this->route('post')) ?? false; +} +``` + +Public actions intentionally available to everyone do not need a redundant authorization check. + +## Bind Query Parameters + +Use Eloquent, the query builder, or explicit bindings instead of interpolating untrusted values into Structured Query Language (SQL). Bindings protect values, not identifiers such as column names or sort directions; map user-selected identifiers to an allow-list. + +Incorrect: + +```php +DB::select("SELECT * FROM users WHERE name = '{$request->name}'"); +``` + +Correct: + +```php +User::where('name', $request->name)->get(); +User::whereRaw('LOWER(name) = ?', [$request->string('name')->lower()->toString()])->get(); +``` + +## Escape Output in Its Context + +Blade's `{{ }}` syntax HTML-escapes output. Use `{!! !!}` only for content that has been sanitized for the exact HTML context in which it is rendered. Escaping rules differ for HTML, URLs, JavaScript, and Cascading Style Sheets. + +Incorrect for untrusted content: + +```blade +{!! $user->bio !!} +``` + +Correct: + +```blade +{{ $user->bio }} +``` + +## Apply Cross-Site Request Forgery Protection + +Include `@csrf` in state-changing Blade forms handled by Laravel's `web` middleware. Routes intentionally excluded from cross-site request forgery (CSRF) verification, such as validated third-party webhooks, need their own authenticity check. + +```blade + + @csrf + + +``` + +Inertia applications commonly use Axios, which returns the encrypted `XSRF-TOKEN` cookie in the `X-XSRF-TOKEN` header. Confirm equivalent configuration when using another HTTP client. Do not disable CSRF protection merely to fix a token mismatch. + +## Rate Limit Sensitive Endpoints + +Apply suitable rate limits to login attempts, password recovery, verification messages, and expensive or abuse-prone application programming interface (API) routes. Choose the limiter key deliberately; an Internet Protocol (IP) address alone can unfairly group users behind a shared network, while an account identifier alone can enable targeted denial of service. + +```php +RateLimiter::for('login', function (Request $request) { + return Limit::perMinute(5)->by(Str::transliterate( + Str::lower($request->string('email')).'|'.$request->ip() + )); +}); + +Route::post('/login', LoginController::class)->middleware('throttle:login'); +``` + +Rate limiting reduces abuse; it does not replace authentication, authorization, or upstream denial-of-service protection. + +## Validate and Store Uploads Safely + +Validate expected content type, dimensions where relevant, and size. Laravel's `mimes` rule reads the file contents and guesses a Multipurpose Internet Mail Extensions (MIME) type corresponding to the listed extensions; it does not validate the user-assigned filename extension. The `extensions` rule checks that extension and should not be used by itself. + +```php +public function rules(): array +{ + return [ + 'avatar' => ['required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:2048'], + ]; +} +``` + +Use Laravel's storage methods to generate a filename, and store untrusted files outside a publicly executable location. Public files can require additional controls, such as image re-encoding, content-disposition headers, and explicit blocking of active formats. + +```php +$path = $request->file('avatar')->store('avatars'); +``` + +## Keep Secrets Out of Application Code + +Do not commit populated environment files or hard-code credentials. Read environment variables in configuration files, then use `config()` in application code so configuration caching works correctly. See the configuration rules for encrypted environment files and external secret stores. + +## Audit Dependencies + +Run `composer audit` regularly and in continuous integration. Review findings for exploitability and update or mitigate affected packages promptly. + +```bash +composer audit +``` + +## Encrypt Sensitive Attributes When Appropriate + +Use an `encrypted` cast for sensitive values that must be recoverable, and use `$hidden` to omit them from array and JavaScript Object Notation (JSON) serialization. Hidden attributes remain accessible in PHP, and encryption does not replace access control. Encrypted values cannot be meaningfully queried and should use a `TEXT` or larger column because ciphertext length is variable. + +```php +class Integration extends Model +{ + protected $hidden = ['api_key', 'api_secret']; + + protected function casts(): array + { + return [ + 'api_key' => 'encrypted', + 'api_secret' => 'encrypted', + ]; + } +} +``` diff --git a/.claude/skills/laravel-best-practices/rules/style.md b/.claude/skills/laravel-best-practices/rules/style.md new file mode 100644 index 0000000..3f3f14f --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/style.md @@ -0,0 +1,110 @@ +# Convention and Style Best Practices + +## Follow Project Naming Conventions + +Prefer Laravel's conventions in new code, but preserve an established project convention unless a coordinated rename is worthwhile. + +| Element | Convention | Example | +| --- | --- | --- | +| Controller | Singular resource name | `ArticleController` | +| Model | Singular StudlyCase | `User` | +| Table | Plural snake_case | `article_comments` | +| Pivot table | Singular model names in alphabetical order, in snake_case | `article_user` | +| Column | snake_case | `meta_title` | +| Conventional foreign key | Singular model name plus `_id`, in snake_case | `article_id` | +| Resource URI | Plural resource | `articles/1` | +| Route name | Dotted segments; snake_case within a segment when needed | `users.show_active` | +| Method | camelCase | `getAll` | +| Variable | camelCase | `$articlesWithAuthor` | +| Collection | Descriptive and plural | `$activeUsers` | +| Object | Descriptive and singular | `$activeUser` | +| View | kebab-case | `show-filtered.blade.php` | +| Configuration file | snake_case | `google_calendar.php` | +| Enumeration | Singular StudlyCase | `UserType` | + +## Prefer Clear, Idiomatic Syntax + +Use Laravel helpers and query methods when they communicate intent more directly. Do not shorten code when the result is ambiguous or loses useful type information. + +| More verbose | Idiomatic alternative | +| --- | --- | +| `Session::get('cart')` | `session('cart')` | +| `$request->session()->get('cart')` | `session('cart')` | +| `return Redirect::back()` | `return back()` | +| `Carbon::now()` | `now()` | +| `->where('column', '=', 1)` | `->where('column', 1)` | +| `->orderBy('created_at', 'desc')` | `->latest()` | +| `->orderBy('created_at', 'asc')` | `->oldest()` | +| `->first()?->name` | `->value('name')` when only that value is needed | + +Use typed request accessors such as `$request->string()`, `$request->integer()`, and `$request->boolean()` when their coercion matches the operation. + +## Use Utilities When They Clarify Intent + +Laravel's `Str`, `Arr`, `Number`, and `Uri` utilities provide expressive operations and framework-consistent behavior. Prefer them when they are clearer or safer than an equivalent PHP operation, not as an unconditional replacement for every built-in function. + +```php +$slug = Str::slug($title); +$short = Str::limit($text, 100); +$class = class_basename(User::class); +$result = Str::of($input)->trim()->replace('_', '-')->lower(); +``` + +Use `Arr` for dot notation and common transformations: + +```php +$name = Arr::get($array, 'user.name', 'default'); +$public = Arr::only($attributes, ['name', 'email']); +``` + +Use `Number` for localized display formatting rather than values that will be stored or calculated: + +```php +Number::format(1000000); +Number::currency(1500, 'USD'); +Number::fileSize(1024 * 1024); +``` + +Use `Uri` when constructing or transforming a uniform resource identifier (URI) benefits from a structured API: + +```php +$uri = Uri::of('https://example.com/search') + ->withQuery(['q' => 'laravel', 'page' => 1]); +``` + +Check the documentation for the Laravel version supported by the project before using newer utility classes or methods. + +## Keep Presentation Code Maintainable + +Prefer the project's asset pipeline, components, and existing conventions for substantial JavaScript and Cascading Style Sheets (CSS). Small page-specific scripts or styles can be reasonable in Blade layouts or stacks; avoid mixing large behavior and style blocks into templates. + +Pass server data with an encoding mechanism appropriate to its context. For example, Blade's `Js::from()` safely formats data for JavaScript: + +```blade + +``` + +Data attributes are useful for small scalar values, but serializing a large model into an attribute can expose unnecessary fields and complicate escaping. + +## Write Comments That Explain Why + +Prefer clear names and small units of code over comments that merely restate an operation. Add concise comments for non-obvious constraints, tradeoffs, workarounds, regular expressions, or external behavior that the code cannot express by itself. Keep comments accurate when behavior changes. + +Unhelpful: + +```php +// Check whether the query has joins. +if (count((array) $builder->getQuery()->joins) > 0) { + // ... +} +``` + +Clearer: + +```php +if ($this->hasJoins()) { + // ... +} +``` diff --git a/.claude/skills/laravel-best-practices/rules/validation.md b/.claude/skills/laravel-best-practices/rules/validation.md new file mode 100644 index 0000000..37ce6c5 --- /dev/null +++ b/.claude/skills/laravel-best-practices/rules/validation.md @@ -0,0 +1,89 @@ +# Validation and Forms Best Practices + +## Extract Validation When It Improves the Boundary + +Use a form request when validation or authorization is substantial, reused, or clearer outside the controller. Inline `$request->validate()` remains appropriate for a small, endpoint-specific rule set. + +```php +public function store(StorePostRequest $request): RedirectResponse +{ + $post = Post::create($request->validated()); + + return redirect()->route('posts.show', $post); +} +``` + +A form request's `authorize()` method can enforce access to the operation. Validation establishes the shape and values of input; it does not itself authorize the user. + +## Prefer Readable Rule Syntax + +Array syntax composes cleanly with rule objects and avoids delimiter issues. Prefer it in new code when it improves readability, while following a consistent local style. + +```php +'email' => ['required', 'email', Rule::unique('users')], +``` + +String syntax remains valid for simple rules: + +```php +'email' => 'required|email|unique:users', +``` + +## Use Only Intended Validated Data + +Use `validated()` or `safe()` instead of `$request->all()` when passing request data onward. Then select the fields intended for the operation when the validation rules also cover control fields or nested data. + +Unsafe: + +```php +Post::create($request->all()); +``` + +Preferred: + +```php +$post = Post::create($request->safe()->only(['title', 'body'])); +``` + +Validated data is not automatically safe for mass assignment. Keep model `$fillable` or `$guarded` rules aligned with the operation, and never add a sensitive attribute to validation merely to make mass assignment convenient. + +## Express Conditional Rules Clearly + +Use conditional rules such as `Rule::when()`, `required_if`, or `exclude_unless` when they make the condition explicit. Choose the simplest form that remains easy to test. + +```php +'company_name' => [ + 'string', + 'max:255', + Rule::when( + $this->input('account_type') === 'business', + ['required'], + ['nullable'], + ), +], +``` + +## Add Cross-Field Validation After Base Rules + +Use a form request's `after()` method for validation that depends on multiple fields or application state. Avoid expensive queries when prerequisite fields have already failed validation. + +```php +public function after(): array +{ + return [ + function (Validator $validator) { + if ($validator->errors()->hasAny(['product_id', 'quantity'])) { + return; + } + + $stock = Product::find($this->integer('product_id'))?->stock; + + if ($stock !== null && $this->integer('quantity') > $stock) { + $validator->errors()->add('quantity', 'Not enough stock.'); + } + }, + ]; +} +``` + +Validation against mutable state does not prevent a race between validation and persistence. Enforce inventory, uniqueness, and similar invariants with database constraints, atomic updates, or a database transaction as appropriate. diff --git a/.claude/skills/tailwindcss-development/SKILL.md b/.claude/skills/tailwindcss-development/SKILL.md new file mode 100644 index 0000000..7e3cd2a --- /dev/null +++ b/.claude/skills/tailwindcss-development/SKILL.md @@ -0,0 +1,96 @@ +--- +name: tailwindcss-development +description: "Always invoke when the user's message includes 'tailwind' in any form. Also invoke for: building responsive grid layouts (multi-column card grids, product grids), flex/grid page structures (dashboards with sidebars, fixed topbars, mobile-toggle navs), styling UI components (cards, tables, navbars, pricing sections, forms, inputs, badges), adding dark mode variants, fixing spacing or typography, and Tailwind v3/v4 work. The core use case: writing or fixing Tailwind utility classes in HTML templates (Blade, JSX, Vue). Skip for backend PHP logic, database queries, API routes, JavaScript with no HTML/CSS component, CSS file audits, build tool configuration, and vanilla CSS." +license: MIT +metadata: + author: laravel +--- + +# Tailwind CSS Development + +## Documentation + +Use `search-docs` for detailed Tailwind CSS v4 patterns and documentation. + +## Basic Usage + +- Use Tailwind CSS classes to style HTML. Check and follow existing Tailwind conventions in the project before introducing new patterns. +- Offer to extract repeated patterns into components that match the project's conventions (e.g., Blade, JSX, Vue). +- Consider class placement, order, priority, and defaults. Remove redundant classes, add classes to parent or child elements carefully to reduce repetition, and group elements logically. + +## Tailwind CSS v4 Specifics + +- Always use Tailwind CSS v4 and avoid deprecated utilities. +- `corePlugins` is not supported in Tailwind v4. + +### CSS-First Configuration + +In Tailwind v4, configuration is CSS-first using the `@theme` directive — no separate `tailwind.config.js` file is needed: + + +```css +@theme { + --color-brand: oklch(0.72 0.11 178); +} +``` + +### Import Syntax + +In Tailwind v4, import Tailwind with a regular CSS `@import` statement instead of the `@tailwind` directives used in v3: + + +```diff +- @tailwind base; +- @tailwind components; +- @tailwind utilities; ++ @import "tailwindcss"; +``` + +### Replaced Utilities + +Tailwind v4 removed deprecated utilities. Use the replacements shown below. Opacity values remain numeric. + +| Deprecated | Replacement | +|------------|-------------| +| bg-opacity-* | bg-black/* | +| text-opacity-* | text-black/* | +| border-opacity-* | border-black/* | +| divide-opacity-* | divide-black/* | +| ring-opacity-* | ring-black/* | +| placeholder-opacity-* | placeholder-black/* | +| flex-shrink-* | shrink-* | +| flex-grow-* | grow-* | +| overflow-ellipsis | text-ellipsis | +| decoration-slice | box-decoration-slice | +| decoration-clone | box-decoration-clone | + +## Spacing + +Use `gap` utilities instead of margins for spacing between siblings: + + +```html +
+
Item 1
+
Item 2
+
+``` + +## Dark Mode + +If existing pages and components support dark mode, new pages and components must support it the same way, typically using the `dark:` variant: + + +```html +
+ Content adapts to color scheme +
+``` + +## Common Pitfalls + +- Using deprecated v3 utilities (bg-opacity-*, flex-shrink-*, etc.) +- Using `@tailwind` directives instead of `@import "tailwindcss"` +- Trying to use `tailwind.config.js` instead of CSS `@theme` directive +- Using margins for spacing between siblings instead of gap utilities +- Forgetting to add dark mode variants when the project uses dark mode diff --git a/.claude/skills/testing-best-practices/SKILL.md b/.claude/skills/testing-best-practices/SKILL.md new file mode 100644 index 0000000..35d02a1 --- /dev/null +++ b/.claude/skills/testing-best-practices/SKILL.md @@ -0,0 +1,58 @@ +--- +name: testing-best-practices +description: "Laravel test design and review. Use when selecting coverage, naming or structuring tests, choosing assertions or test data, isolating dependencies, testing HTTP or security boundaries, improving suite performance, or reviewing test value. Use framework guidance or search-docs for Pest and PHPUnit syntax." +license: MIT +metadata: + author: laravel +--- + +# Testing Best Practices + +This skill provides rules for designing Laravel tests. Each rule file explains what to do and why. Use `search-docs` for Laravel and Pest API syntax. +This project uses Pest. Follow the corresponding guidance in each rule. + +## Consistency First + +Read nearby tests before you choose syntax and organization. + +A pattern repeated throughout the project is a convention, and project conventions take precedence over this skill. Follow them and give new tests the same structure. + +These rules govern the tests you write now. An existing test that follows a project convention is not defective merely because it conflicts with this skill. Do not delete or rewrite it. If the convention has drawbacks, explain them and let the user decide. + +## What to Test + +Read this section before you write a test. + +- Test observable behavior and application contracts. A test must pass after an implementation change if the behavior stays the same. +- Cover every changed decision and each applicable high-value failure mode. A decision is a branch, a validation, a calculation, or an authorization. +- Exercise declarations through behavior instead of repeating their text. +- Leave framework behavior to framework tests. Testing project configuration is not testing the framework. A constrained relationship, cast, scope, or validation rule belongs to this project. +- Keep every test that can detect a distinct defect. When two tests detect the same defect, trim the higher-layer test to one case and report the duplication. Do not delete an existing test. +- Write a feature test first. Write a unit test only for logic that does not use the framework. +- Write a feature test for every behavior reachable through a request. Real-browser tests require `pestphp/pest-plugin-browser` and a browser download, neither of which this project installs. Mention the package only if the user asks for a real-browser test. +- Judge an architecture test by the convention it protects, not by the rules above. An `arch()` test declares a rule for an entire directory, such as the parent class of every model, the classes that may use an enum, or the methods every factory declares. It intentionally checks declarations and fails when a new file breaks the convention. +- Use the test tools that the project installs. Add a new test dependency, plugin, or browser only after the user asks for it. + +## How to Apply + +1. Read the code under test. Read the tests in the same directory. Identify every decision in the code. +2. Select every applicable branch in the rule index. Read every selected rule file. +3. Report each defect in the code before you write a test. Examples are a method with no body, a policy that no action calls, and a write action with no validation. Test the actual behavior. Report the defect to the user. +4. Write the tests. Run the smallest set of tests that covers the change. The tests must pass. +5. Check every applicable item in `rules/review.md` and every selected rule file. Resolve every mismatch before completion. + +## Rule Index + +Most changes need more than one rule file. + +| Subject | Rule File | +| --- | --- | +| Test framework features that may already do the work | [`rules/finding-features.md`](rules/finding-features.md) | +| File layout, test names, and groups | [`rules/naming.md`](rules/naming.md) | +| Arrange-act-assert and choosing the correct assertion | [`rules/assertions.md`](rules/assertions.md) | +| Endpoint coverage, authentication, authorization, tenant isolation, validation, and browser tests | [`rules/endpoint-tests.md`](rules/endpoint-tests.md) | +| Factories, test data ownership, and repeated input values | [`rules/test-data.md`](rules/test-data.md) | +| Fakes, mocks, outbound HTTP, time, randomness, and databases | [`rules/isolation.md`](rules/isolation.md) | +| Escaping, injection, cross-tenant access, and privilege checks | [`rules/security.md`](rules/security.md) | +| Environment and CI settings for a slow suite | [`rules/performance.md`](rules/performance.md) | +| Reviewing a test or suite | [`rules/review.md`](rules/review.md) | diff --git a/.claude/skills/testing-best-practices/rules/assertions.md b/.claude/skills/testing-best-practices/rules/assertions.md new file mode 100644 index 0000000..ba55fb2 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/assertions.md @@ -0,0 +1,60 @@ +# Assertions + +## Arrange, Act, Assert + +Write each test in three parts: setup, one action, and assertions. Put one blank line between them so readers can identify each part without comments. + +Keep each test self-contained. Do not use values created by another test. + +## How to Find the Correct Assertion + +First identify the subject of the check, then find an assertion designed for it. A subject-specific assertion identifies the incorrect value when the test fails. + +1. Search Laravel's assertions for framework subjects such as responses, the database, sessions, models, queues, events, mail, and notifications. +2. Fetch `https://pestphp.com/docs/expectations.md` for the expectations of Pest for a plain value, a type, a format, or a shape. +3. Build the check by hand only if no assertion exists for the subject. +4. Confirm the name in the documentation before you use it. Do not write an assertion that you did not confirm. + +Use the assertion in this table for each subject. + +| Subject | Assertion to use | +| --- | --- | +| A return value, the state of an object, or a transformation of a value | an `expect()` chain | +| An HTTP status, JSON, a session, or Inertia | a Laravel response assertion | +| The state in the database | a Laravel database assertion | +| The existence of a model | `assertModelExists($model)` rather than `assertDatabaseHas('users', ['id' => $user->id])` | + +Use a PHPUnit assertion only if no Pest expectation and no Laravel assertion exists for the subject. + +Assert each fact once. Do not assert a 200 status before `assertSee`, because `assertSee` already shows that the page rendered. + +## Named Response Assertions + +Use a named response assertion, such as `assertNotFound()`, rather than `assertStatus(404)`. A failure then identifies the broken contract. Laravel provides named assertions for commonly tested status codes. + +Keep one `expect()` chain on one subject. Start a new chain when the subject changes, or when the chain is difficult to read. + +## Assert a Known Value + +Write the expected value in the test, or calculate the expected value by a different method. Do not calculate the expected value with the logic of the implementation, because the test then passes when that logic is wrong. + +```php +// The test calculates the value with the logic of the implementation... +$expected = now()->subHours(24)->floorSeconds(30)->toJson(); +expect($from)->toBe($expected); + +// The test sets a fixed input and asserts a known value... +travelTo('2025-01-01 00:00:00'); +expect($from)->toBe('2024-12-31T00:00:00.000000Z'); +``` + +## Assert the Complete Result + +A status code is not the complete result of a write operation. Assert each of the following if the operation changes it: + +- The response or the return value. +- The state in the database. +- The jobs and the events that the operation dispatches. +- The notifications and the mail that the operation sends. + +On the failure path, assert that the operation makes none of these changes. A test that asserts only `assertOk()` passes even when the application saves no record. diff --git a/.claude/skills/testing-best-practices/rules/endpoint-tests.md b/.claude/skills/testing-best-practices/rules/endpoint-tests.md new file mode 100644 index 0000000..32e32e6 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/endpoint-tests.md @@ -0,0 +1,47 @@ +# Endpoint Tests + +## How to Write the Test + +Fetch `https://laravel.com/framework/docs/http-tests` for the request helpers, the authentication helpers, and the response assertions. Confirm the name before you use it, and do not guess an assertion. + +Choose an assertion based on the subject of the check: the status, a header, a redirect, the JSON body, the session, a validation error, or the view. Laravel provides a named assertion for each subject that identifies the incorrect value. + +## Endpoint Coverage + +Write a test for each applicable case: + +- The request has missing or invalid authentication. +- The request comes from a different tenant, team, or organization. +- The user has an insufficient role or permission. +- The request does not satisfy a route or scope constraint. +- The request fails the validation. +- The request is valid. Assert both the response and the persisted state. + +Assert the application's actual behavior rather than a generic status code. An API returns `401` for a missing or invalid token, while a browser endpoint redirects to the sign-in route. + +## Tenant Isolation + +Assert the status code returned for a cross-tenant request. Use `404` rather than `403` when one tenant must not learn that another tenant's record exists, because `403` confirms its existence. + +## Test Authorization at the Policy Level + +An HTTP test shows that the endpoint performs authorization. It cannot identify which mechanism refused the request because middleware, a policy, and a call to `abort()` can all return `403`. + +- Assert the complete matrix of the permissions against the policy or the gate. A failure then names the rule that is not correct. +- Write one HTTP test for one refused role, which shows that the endpoint calls the authorization. +- Use the helper of the project that asserts the ability and the arguments of the gate, if such a helper exists. + +## Testing Validation + +- Write one test for each validation rule when each failure represents a separate contract. +- Write one test with an empty payload to assert several required fields together. +- Assert the text of the message that the user gets. A message that is present but wrong is a defect. +- Use a dataset for input values that need the same setup and the same assertions. + +Send an input value that is not valid through the application, and assert the error. Do not assert that an array of rules contains a string, because that assertion tests the declaration and not the behavior. Use such an assertion only for a rule that no request can reach, and write the reason in the test. + +### Which Layer Owns Which Case + +The rule-class test owns the matrix of values that pass and fail. The endpoint test proves that the endpoint applies the rule and that the user receives the message. + +When both tests contain the matrix, move it to the rule-class test and retain one case in the endpoint test. Never remove the last case, because the rule-class test still passes if the request omits the rule. The same division applies to policies, scopes, and other classes called by a request. diff --git a/.claude/skills/testing-best-practices/rules/finding-features.md b/.claude/skills/testing-best-practices/rules/finding-features.md new file mode 100644 index 0000000..83ce650 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/finding-features.md @@ -0,0 +1,34 @@ +# How to Find Test Framework Features + +Pest adds features faster than this skill can list them. Find an existing feature before implementing the behavior by hand. + +- Give `search-docs` the capability you need rather than the name of a function you remember. It returns features available in the installed version. +- Fetch `https://pestphp.com/llms.txt` for the complete feature list and additions in each release. +- If a search returns no results, tell the user that the installed version does not provide the feature. Do not write an API that you have not confirmed. + +Search for a feature in this table before you write the code by hand. + +| Work that you need | Term to search for | +| --- | --- | +| Run one test with many input values | datasets, bound datasets | +| Assert over many values or over a collection | higher-order expectations | +| Remove the same setup from each test in a file | hooks, higher-order tests | +| Apply a convention to the complete codebase | architecture testing | +| Measure if the suite finds a defect | mutation testing | +| Find code with no types | type coverage | +| Reduce the time of a slow suite | parallel, profiling | +| Run one test while you debug | filtering, `--bail`, `--dirty` | + +## Built-in Laravel Assertion Methods + +Laravel provides assertions for each part of the framework. Fetch `https://laravel.com/framework/docs/testing` for the complete list, and search for an assertion before building a check by hand. Examples include `assertDatabaseHas()`, `assertModelExists()`, `assertSoftDeleted()`, response assertions such as `assertRedirectToRoute()` and `assertJsonPath()`, and fake assertions such as `Queue::assertPushed()` and `Notification::assertSentTo()`. + +A hand-built check fails with `false is not true`, which identifies nothing. A framework assertion names the incorrect table, value, or response, so the failure indicates what to fix. + +```php +// The failure says that false is not true. Instead of this... +expect(User::where('email', 'taylor@laravel.com')->exists())->toBeTrue(); + +// Use this... the failure names the table and the attributes that it did not find... +$this->assertDatabaseHas('users', ['email' => 'taylor@laravel.com']); +``` diff --git a/.claude/skills/testing-best-practices/rules/isolation.md b/.claude/skills/testing-best-practices/rules/isolation.md new file mode 100644 index 0000000..e1a21fd --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/isolation.md @@ -0,0 +1,52 @@ +# Fakes, Mocks, and Determinism + +Tests that depend on actual time, randomness, sleeping, or network calls can fail for reasons unrelated to the code under test. Control all four. + +## How to Isolate a Dependency + +Fetch `https://laravel.com/framework/docs/mocking` for Laravel's fakes, facade doubles, and fake assertions. Confirm each name before using it. + +Identify the dependency, then choose the first applicable option. A framework fake preserves the real code path, while a mock replaces the dependency. + +1. Always use framework fakes for facades such as events, queues, mail, notifications, storage, the HTTP client, time, and sleep. +2. Use a developer-defined fake implementation of a service if the application provides one. +3. Use a mock for a container-resolved contract only when the real implementation leaves the process or is nondeterministic. +4. Use the real implementation for everything else, including the database. + +## Framework Fakes + +- Create each fake inside the test that needs it. Do not create fakes in a file-level `beforeEach()`. +- Pass class names to `Event::fake()` and `Queue::fake()` when you know which classes the code dispatches. A fake without class names can hide an unexpected dispatch. +- Use a fake without class names only when the test asserts the complete result, including a call to `assertNothingPushed()`. +- Write one assertion for each fake. The assertion states that the code dispatches the item, or that the code does not dispatch the item. +- Assert the data of a job or of an event if that data is part of the behavior. +- Use `Exceptions::fake()` to assert that the application reports the correct exception. Do not use `withoutExceptionHandling()`, because it changes the response under test. + +Create prerequisite factory records before calling `Event::fake()`. Factories use model events, such as a `creating` hook that generates a UUID, and a fake without class names suppresses those events and can produce an invalid model. Call the fake first only when a factory event is under test, and pass that event's class name. + +## Mocking + +Use `shouldReceive()` before the action to declare an expectation. Use `shouldHaveReceived()` after the action for a spy. Use `Mockery::on()` or `withArgs()` if an equality check cannot state the expected argument, such as a check of one field of a value object. + +Import the mock function before you use it: `use function Pest\Laravel\mock;`. + +## Outbound HTTP Testing + +Call `Http::preventStrayRequests()`. Any request without a matching fake then fails without reaching the network. + +Fake the exact endpoint used by each test. Do not call `Http::fake()` without an endpoint because it accepts unexpected requests and can hide defects. + +## Time and Randomness + +- Freeze the time or move the time in each test that depends on a date, a period, or a timestamp. +- Use the framework helpers `freezeTime()`, `travelTo()`, `travel()`, and `travelBack()`. Do not call `Carbon::setTestNow()`. +- Use `Str::createRandomStringsUsing()` to fix a generated string, if the test asserts an identifier or a slug. +- Use `Sleep::fake()` instead of a real sleep, and assert the sleeps that the code requests. +- Restore the time and the randomness after each test, if the suite does not restore them for every test. + +## Database + +- Run real queries against the real records in the test database. Do not mock the query builder, because the test then asserts the mock. +- Assert the exact keys of `toArray()` if the shape of the serialized model is a contract. The test then fails when the model exposes a new attribute. +- Test application behavior caused by the schema, such as deleting dependent records through a cascade. Do not test the database engine's cascade implementation. +- Use `LazilyRefreshDatabase` instead of `RefreshDatabase`. A test that does not use the database then does not run the migrations. diff --git a/.claude/skills/testing-best-practices/rules/naming.md b/.claude/skills/testing-best-practices/rules/naming.md new file mode 100644 index 0000000..4f3f5b1 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/naming.md @@ -0,0 +1,45 @@ +# Naming and Structure + +## File Layout + +- Name each test file `{ClassName}Test.php`. +- Place each test file at the same relative path as the class under test. The class `app/Actions/DeleteTeam.php` gets the test `tests/Unit/Actions/DeleteTeamTest.php`. +- Follow the project's convention for fixture files. If none exists, put fixtures in `tests/Fixtures/` and load them by path. +- Move large literal values out of the test body and into fixture files. + +## Test Function + +Use the test function used by other files in the same directory. If no neighboring test files exist: + +- Use `it()` for the behavior of the code, and write the name as a verb phrase. +- Use `test()` for a declarative fact, such as a grant in a policy, the labels of an enum, or the shape of a serialized model. + +Use one Pest declaration style in each file. Use either `it()` or `test()` consistently. + +## Naming Tests + +The name of a test is a specification. State the user-visible result and the condition that causes it. + +- Name the behavior, and not the method under test. The file name already gives the class. +- Give the exact status code in the name of a test for an API error. +- Do not write `Given`, `When`, or `Then` in the name. + +```php +it('returns 401 when no token is provided', function () { ... }); +it('does not include deployments from deleted environments', function () { ... }); +it('falls back to the default region when none is configured', function () { ... }); +``` + +Use a verb that describes a result, such as `returns`, `renders`, `creates`, `dispatches`, `rejects`, `forbids`, `falls back`, or `does not`. + +Do not write `it('works correctly')` or `it('returns data')`, because neither specifies a meaningful result. Do not write `it('handleMethod creates record')`, because it names a method rather than behavior. + +## Grouping + +Use `describe()` if one file covers separate actions in a lifecycle. An example is a controller with the actions `index`, `show`, `store`, `update`, and `destroy`. + +Do not use `describe()` in these cases: + +- The file covers one action or one flow. +- The tests are different only in the input value. Use a dataset instead. +- The group adds a level but does not make the file easier to read. diff --git a/.claude/skills/testing-best-practices/rules/performance.md b/.claude/skills/testing-best-practices/rules/performance.md new file mode 100644 index 0000000..ee993fb --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/performance.md @@ -0,0 +1,46 @@ +# Test Suite Performance + +These settings apply to the project and CI, not to individual tests. Read `rules/isolation.md` for choices within a test. + +Fetch `https://pestphp.com/docs/optimizing-tests` for Pest options that make test runs faster. +Verify each flag in the documentation before adding it to CI. + +Measure before changing a setting. Find the slow test first, and apply a project-wide setting only after identifying the costly work. + +## Test Environment + +- Set `BCRYPT_ROUNDS=4` in `.env.testing` or in `phpunit.xml`. The default value is 12, and the hash then takes most of the time of each test that signs a user in. +- Disable XDebug. Disable pcov also, unless the run needs the coverage. +- Disable packages that perform work on every request in the test environment. Examples are Pulse, Telescope, and Nightwatch. +- Use the `WithCachedConfig` and `WithCachedRoutes` traits, so the run does not parse the configuration and the routes for every test. +- Call `withoutVite()`, or `withoutMix()`, so the framework does not resolve a built asset. + +## Global Fakes + +Put these three calls in the base `Pest.php` of the project: + +- `Http::preventStrayRequests()`, because one request that reaches the network can slow the suite. This catches requests made through Laravel's HTTP client. Check direct Guzzle and cURL usage separately. +- `Sleep::fake(syncWithCarbon: true)`, so a retry and a backoff do not sleep. +- `Exceptions::fake()`, so the suite does not report an exception to an external service. + +## How to Run the Suite in Parallel + +Run `vendor/bin/pest --parallel` to spread tests across the machine's CPU cores. Add `--processes=N` if the default count is unsuitable for the machine or CI. + +A parallel run gives each process a separate database. Tests must meet these conditions; a test that fails only in parallel breaks one of them: + +- The test creates each record that it reads. It does not read a record that another test creates. +- The test does not depend on the order of the run. +- The test does not share a file, a cache key, or a queue with another test. Give each process a separate name for such a resource. + +## How to Find a Slow Test + +Run `vendor/bin/pest --profile` to list the slowest tests. Start with the ten slowest tests, because the same cause often applies to the complete suite. + +If the cause of a slow test is unclear, add an event listener or temporary log entry to identify its work. + +## Common Errors + +- The run loads XDebug for a test that does not need it. +- `BCRYPT_ROUNDS` keeps the default value, because the project has no `.env.testing`. +- The code under test calls the real `sleep()`, and `Sleep::fake()` then does not help. diff --git a/.claude/skills/testing-best-practices/rules/review.md b/.claude/skills/testing-best-practices/rules/review.md new file mode 100644 index 0000000..e0cfca1 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/review.md @@ -0,0 +1,44 @@ +# Reviewing Tests + +Check every item in this file. A passing test may still provide no value. For each test, identify the defect it would catch. + +Report each finding. Do not delete or rewrite a test without the user's approval. When an issue appears throughout the suite as a convention, report the pattern once rather than every affected file. + +## Test Value + +Apply this section to behavioral tests. An architecture test states a convention for a directory, so these items do not apply to it. + +- [ ] Each test covers observable behavior or an application contract, and passes after a change to the implementation that keeps the behavior. +- [ ] Each tested declaration is exercised through behavior, and no test asserts the behavior of the framework. A test of what this project configures, such as a relation with a constraint, a cast, or a scope, belongs to this project. +- [ ] Each test detects a distinct defect that no other test covers. A duplicate shrinks at the higher layer to the one case that proves the wiring. +- [ ] Every changed decision and each applicable high-value failure mode has coverage. + +## Names and Structure + +- [ ] Each file has the name `{ClassName}Test.php` and the relative path of the class under test. +- [ ] Each name states a result, the condition that causes it, and the status code for an API error. +- [ ] Each file uses one declaration style consistently, and each `describe()` group holds separate behavior. + +## Coverage + +- [ ] HTTP tests cover authentication, authorization, role, scope, and validation when applicable. +- [ ] A request for a record of a different tenant gets a status code that does not confirm that the record exists. +- [ ] The complete permission matrix belongs in policy tests, not controller tests. +- [ ] Each validation rule has one test that asserts the user-visible message. When a unit test owns a matrix, reduce duplicate higher-level coverage to one case rather than deleting it. +- [ ] Rendered user input and each dynamic part of a query have a security test. + +## Data and Determinism + +- [ ] Each test creates its mutable records directly or through a helper that it calls, and every created record arranges the behavior or supports an assertion. +- [ ] Each `beforeEach()` holds configuration only. +- [ ] Each factory state and each relationship gives the meaning of the data. +- [ ] Each call to `make()` is in a test that does not need the database. +- [ ] Time, randomness, sleep, and outbound HTTP are controlled. +- [ ] Each test passes alone, and passes in the complete suite in any order. + +## Assertions + +- [ ] Each expected value is a known value, and the test does not calculate the value with the logic of the implementation. +- [ ] Each test of a write operation asserts the response, the state in the database, and the side effects. +- [ ] Each fake has one assertion, and gives the class names unless the test asserts the complete result. +- [ ] Each `expect()` chain stays on one subject. diff --git a/.claude/skills/testing-best-practices/rules/security.md b/.claude/skills/testing-best-practices/rules/security.md new file mode 100644 index 0000000..b908889 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/security.md @@ -0,0 +1,27 @@ +# Security Tests + +Test each security boundary where user input affects authorization, rendered output, or query construction. A defect at such a boundary can be difficult to detect because the feature may continue to work. + +Write a test for each of these cases: + +- **Cross-tenant access.** Request a record of a different tenant, team, or organization. Read `rules/endpoint-tests.md` for why the response should possibly be `404` rather than `403`. +- **Each unprivileged role.** Use a dataset over the roles that the endpoint must refuse. +- **Escaping user-provided content.** Test escaping in HTML and mail. Include names and every free-text field a template renders. Assert that dangerous characters are escaped and the raw value is absent. Do not assert an exact entity for a quote, because Markdown and mail CSS inliners may decode it. +- **Injection into dynamic query components.** Examples include sort columns, filter fields, and sort directions. +- **An unexpected key** in a payload or configuration array. A merge that accepts every key can set an attribute the user must not control. + +```php +it('escapes dangerous content in the notification', function () { + $organization = Organization::factory()->make([ + 'name' => "O'Reilly ", + ]); + + $content = (new QuotaApproaching($organization, 80))->toMail()->render(); + + expect($content) + ->toContain('"); +}); +``` + +Laravel provides defenses against mass assignment, unauthorized access, and unescaped output. Test that the application applies the appropriate defense to each attribute, route, and template. diff --git a/.claude/skills/testing-best-practices/rules/test-data.md b/.claude/skills/testing-best-practices/rules/test-data.md new file mode 100644 index 0000000..6512468 --- /dev/null +++ b/.claude/skills/testing-best-practices/rules/test-data.md @@ -0,0 +1,56 @@ +# Factories and Test Data + +## Each Test Makes Its Own Data + +Create mutable records inside the test that uses them. This keeps setup visible and lets each test select its factory state. + +Use `beforeEach()` only for configuration that applies to every test in the file. Do not create records in it. + +## Record Construction + +- Use `create()` if the test needs the record in the database. +- Use `make()` only if the test does not need the database. Examples include rendering a notification and testing a value object's behavior. +- Use a named factory state instead of a raw attribute. `User::factory()->unverified()->create()` gives the state meaning; `create(['email_verified_at' => null])` gives only its value. +- Use `for()` or the relationship helper of the project to declare the owner of a record. +- Use `recycle()` if several records must share one parent record. +- Use `sequence()` if several records need different attributes. + +```php +$organization = Organization::factory()->onPlan(BillingPlan::PRO)->create(); + +$environment = Environment::factory()->recycle($organization)->create(); + +$organizations = Organization::factory() + ->count(3) + ->sequence( + ['created_at' => now()->setSeconds(30)], + ['created_at' => now()->setSeconds(1)], + ) + ->create(); +``` + +Create only the records required to arrange the behavior or support an assertion. + +## Datasets + +Use a dataset when the setup, test body, and assertions remain the same across input values. + +```php +it('forbids roles other than admin', function (Role $role) { + actingAs(User::factory()->hasOrganization($role)->create()) + ->post('/settings') + ->assertForbidden(); +})->with(collect(Role::cases())->reject(fn (Role $role) => $role === Role::ADMIN)); +``` + +Use parameterized tests for: + +- enum cases +- roles and plans +- boundary values +- input values that are invalid in the same way +- input and output value pairs + +Write separate tests if the cases need a different setup, a different behavior, or different assertions. One test function with a branch in the body is two tests in one function. + +Give each dataset case a name that states the difference. A failure then identifies the case without requiring you to count positions. diff --git a/.claude/skills/wayfinder-development/SKILL.md b/.claude/skills/wayfinder-development/SKILL.md new file mode 100644 index 0000000..8537dc0 --- /dev/null +++ b/.claude/skills/wayfinder-development/SKILL.md @@ -0,0 +1,80 @@ +--- +name: wayfinder-development +description: "Use this skill for Laravel Wayfinder which auto-generates typed functions for Laravel controllers and routes. ALWAYS use this skill when frontend code needs to call backend routes or controller actions. Trigger when: connecting any React/Vue/Svelte/Inertia frontend to Laravel controllers, routes, building end-to-end features with both frontend and backend, wiring up forms or links to backend endpoints, fixing route-related TypeScript errors, importing from @/actions or @/routes, or running wayfinder:generate. Use Wayfinder route functions instead of hardcoded URLs. Covers: wayfinder() vite plugin, .url()/.get()/.post()/.form(), query params, route model binding, tree-shaking. Do not use for backend-only task" +license: MIT +metadata: + author: laravel +--- + +# Wayfinder Development + +## Documentation + +Use `search-docs` for detailed Wayfinder patterns and documentation. + +## Quick Reference + +### Generate Routes + +Run after route changes if Vite plugin isn't installed: +```bash +php artisan wayfinder:generate --no-interaction +``` +For form helpers, use `--with-form` flag: +```bash +php artisan wayfinder:generate --with-form --no-interaction +``` + +### Import Patterns + + +```typescript +// Named imports for tree-shaking (preferred)... +import { show, store, update } from '@/actions/App/Http/Controllers/PostController' + +// Named route imports... +import { show as postShow } from '@/routes/post' +``` + +### Common Methods + + +```typescript +// Get route object... +show(1) // { url: "/posts/1", method: "get" } + +// Get URL string... +show.url(1) // "/posts/1" + +// Specific HTTP methods... +show.get(1) +store.post() +update.patch(1) +destroy.delete(1) + +// Form attributes for HTML forms... +store.form() // { action: "/posts", method: "post" } + +// Query parameters... +show(1, { query: { page: 1 } }) // "/posts/1?page=1" +``` + +## Wayfinder + Inertia + +Use Wayfinder with the `
` component: + +```typescript +
+``` + +## Verification + +1. Run `php artisan wayfinder:generate` to regenerate routes if Vite plugin isn't installed +2. Check TypeScript imports resolve correctly +3. Verify route URLs match expected paths + +## Common Pitfalls + +- Using default imports instead of named imports (breaks tree-shaking) +- Forgetting to regenerate after route changes +- Not using type-safe parameter objects for route model binding diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..37cfad7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +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 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a0a3938 --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Probindo +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost:8000 + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4da48a8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +CHANGELOG.md export-ignore +README.md export-ignore +.github/workflows/browser-tests.yml export-ignore diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..ae67c4d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + cooldown: + default-days: 5 + groups: + github-actions: + patterns: + - "*" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..7fbaaf7 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,38 @@ +name: tests + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + ci: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Setup PHP + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 + with: + php-version: '8.3' + tools: composer:v2 + coverage: none + + - name: Setup Node + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: '22' + + - name: Setup Application + run: composer setup + + - name: Run CI Checks + run: composer ci:check diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d3c534c --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +/.phpunit.cache +/bootstrap/ssr +/node_modules +/public/build +/public/fonts-manifest.dev.json +/public/hot +/public/storage +/storage/*.key +/storage/pail +/resources/js/actions +/resources/js/routes +/resources/js/wayfinder +/vendor +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +Homestead.json +Homestead.yaml +npm-debug.log +yarn-error.log +/auth.json +/.fleet +/.idea +/.nova +/.vscode +/.zed +/CLAUDE.md diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..8c6715a --- /dev/null +++ b/.mcp.json @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "laravel-boost": { + "command": "php", + "args": [ + "artisan", + "boost:mcp" + ] + } + } +} \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..97b895e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +ignore-scripts=true diff --git a/README.md b/README.md new file mode 100644 index 0000000..047782b --- /dev/null +++ b/README.md @@ -0,0 +1,168 @@ +# Probindo Web + +Website company profile **PT Probindo Artika Jaya (PAJ)**, dibangun dengan Laravel + Inertia.js + React. + +## Tech Stack + +| Bagian | Teknologi | +|---|---| +| Backend | Laravel 13, PHP 8.3+ | +| Frontend | React 19 + TypeScript, Inertia.js v3 | +| Styling | Tailwind CSS v4 (light & dark mode) | +| Routing frontend | Laravel Wayfinder (route bertipe dari Laravel ke TypeScript) | +| Build tool | Vite+ (`vp`) | +| Auth (dashboard) | Laravel Fortify | +| Database | PostgreSQL | +| Testing | Pest / PHPUnit | + +## Prasyarat + +Pastikan sudah terpasang: + +- **PHP 8.3 atau lebih baru** dengan ekstensi `pdo_pgsql`, `pgsql`, `mbstring`, `openssl`, `fileinfo`, dan `pdo_sqlite` (dipakai saat menjalankan test) +- **Composer 2** +- **Node.js 22** dan npm +- **PostgreSQL** (versi 14 ke atas disarankan) +- **Git** + +Cek versi: + +```bash +php -v +composer --version +node -v +psql --version +``` + +## Instalasi di Local + +### 1. Clone repository + +```bash +git clone probindo-web +cd probindo-web +``` + +### 2. Install dependency + +```bash +composer install +npm install +``` + +> Project ini memakai `ignore-scripts=true` di `.npmrc`, jadi script install dari package npm tidak dijalankan otomatis. + +### 3. Siapkan file environment + +```bash +cp .env.example .env +php artisan key:generate +``` + +### 4. Buat database PostgreSQL + +Buat database kosong, misalnya lewat `psql`: + +```sql +CREATE DATABASE probindo_db; +``` + +Lalu sesuaikan koneksi database di `.env` (bawaan `.env.example` masih SQLite): + +```env +DB_CONNECTION=pgsql +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_DATABASE=probindo_db +DB_USERNAME=postgres +DB_PASSWORD=password_anda +``` + +Sesuaikan `DB_PORT`, `DB_USERNAME`, dan `DB_PASSWORD` dengan instalasi PostgreSQL di komputer Anda. + +### 5. Jalankan migrasi + +```bash +php artisan migrate +``` + +### 6. Jalankan aplikasi + +Cara termudah, satu perintah untuk menjalankan server Laravel, queue worker, dan Vite sekaligus: + +```bash +composer dev +``` + +Atau jalankan di dua terminal terpisah: + +```bash +# Terminal 1 — server Laravel +php artisan serve + +# Terminal 2 — Vite dev server (hot reload) +npm run dev +``` + +Buka **http://localhost:8000** di browser. + +> **Kenapa ada dua port?** Halaman dibuka lewat port **8000** (Laravel). Port **5173** adalah Vite dev server yang hanya menyajikan file JS/CSS dan hot reload saat development, bukan untuk dibuka langsung. + +## Halaman Website + +| URL | Halaman | File | +|---|---|---| +| `/` | Beranda | `resources/js/pages/site/home.tsx` | +| `/tentang-kami` | Tentang Kami | `resources/js/pages/site/about.tsx` | +| `/jasa` | Jasa & Solusi IT | `resources/js/pages/site/services.tsx` | +| `/klien` | Klien & Portofolio | `resources/js/pages/site/clients.tsx` | +| `/kontak` | Kontak & Konsultasi | `resources/js/pages/site/contact.tsx` | + +Route didefinisikan di `routes/web.php`. + +## Struktur Frontend + +``` +resources/js/ +├── data/site.ts # Info perusahaan, 2 lokasi kantor, 8 jasa, opsi form +├── layouts/site-layout.tsx # Kerangka halaman: header + konten + footer +├── components/site/ # Komponen UI yang dipakai ulang +│ ├── section.tsx, container.tsx, section-header.tsx, page-hero.tsx +│ ├── button.tsx, card.tsx, feature-card.tsx, step-card.tsx, ... +│ ├── site-header.tsx, site-footer.tsx, theme-toggle.tsx +│ └── sections/ # Section bersama (form konsultasi, grid jasa, CTA) +└── pages/site/ # Halaman, tinggal menyusun section + data +``` + +- **Ubah kontak, alamat, atau daftar jasa** cukup di `resources/js/data/site.ts`, otomatis berlaku di semua halaman. +- **Warna tema (light & dark)** ada di `resources/css/app.css`, pada blok `.probindo-site` (light) dan `.dark .probindo-site` (dark). + +## Perintah yang Sering Dipakai + +| Perintah | Fungsi | +|---|---| +| `composer dev` | Jalankan server, queue, dan Vite sekaligus | +| `npm run dev` | Vite dev server saja | +| `npm run build` | Build aset untuk production ke `public/build` | +| `npm run types:check` | Cek tipe TypeScript | +| `npm run check` | Format + lint frontend | +| `php artisan test` | Jalankan test | +| `php artisan wayfinder:generate` | Generate ulang route TypeScript setelah menambah route | + +## Troubleshooting + +**Halaman putih / aset tidak termuat** +File `public/hot` tertinggal dari sesi `npm run dev` sebelumnya. Jalankan lagi `npm run dev`, atau hapus `public/hot` lalu `npm run build`. + +**Error `could not find driver` saat test** +Ekstensi `pdo_sqlite` belum aktif. Buka `php.ini`, aktifkan `extension=pdo_sqlite`, lalu restart terminal. + +**Error koneksi database saat migrate** +Pastikan PostgreSQL berjalan, database sudah dibuat, dan `DB_*` di `.env` sudah benar. Setelah mengubah `.env`, jalankan `php artisan config:clear`. + +**Import `@/routes` error di editor** +File route TypeScript di-generate otomatis. Jalankan `php artisan wayfinder:generate` atau `npm run dev`. + +## Catatan + +Form konsultasi di halaman Beranda, Jasa, dan Kontak **belum terhubung ke backend**: saat ini hanya menampilkan pesan sukses di browser tanpa menyimpan atau mengirim data. diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php new file mode 100644 index 0000000..3c7c00c --- /dev/null +++ b/app/Actions/Fortify/CreateNewUser.php @@ -0,0 +1,33 @@ + $input + */ + public function create(array $input): User + { + Validator::make($input, [ + ...$this->profileRules(), + 'password' => $this->passwordRules(), + ])->validate(); + + return User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => $input['password'], + ]); + } +} diff --git a/app/Actions/Fortify/ResetUserPassword.php b/app/Actions/Fortify/ResetUserPassword.php new file mode 100644 index 0000000..8fda5dd --- /dev/null +++ b/app/Actions/Fortify/ResetUserPassword.php @@ -0,0 +1,29 @@ + $input + */ + public function reset(User $user, array $input): void + { + Validator::make($input, [ + 'password' => $this->passwordRules(), + ])->validate(); + + $user->forceFill([ + 'password' => $input['password'], + ])->save(); + } +} diff --git a/app/Concerns/PasswordValidationRules.php b/app/Concerns/PasswordValidationRules.php new file mode 100644 index 0000000..7409ed8 --- /dev/null +++ b/app/Concerns/PasswordValidationRules.php @@ -0,0 +1,29 @@ +|string> + */ + protected function passwordRules(): array + { + return ['required', 'string', Password::default(), 'confirmed']; + } + + /** + * Get the validation rules used to validate the current password. + * + * @return array|string> + */ + protected function currentPasswordRules(): array + { + return ['required', 'string', 'current_password']; + } +} diff --git a/app/Concerns/ProfileValidationRules.php b/app/Concerns/ProfileValidationRules.php new file mode 100644 index 0000000..a9c069b --- /dev/null +++ b/app/Concerns/ProfileValidationRules.php @@ -0,0 +1,51 @@ +|string>> + */ + protected function profileRules(?int $userId = null): array + { + return [ + 'name' => $this->nameRules(), + 'email' => $this->emailRules($userId), + ]; + } + + /** + * Get the validation rules used to validate user names. + * + * @return array|string> + */ + protected function nameRules(): array + { + return ['required', 'string', 'max:255']; + } + + /** + * Get the validation rules used to validate user emails. + * + * @return array|string> + */ + protected function emailRules(?int $userId = null): array + { + return [ + 'required', + 'string', + 'email', + 'max:255', + $userId === null + ? Rule::unique(User::class) + : Rule::unique(User::class)->ignore($userId), + ]; + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ + $request->user() instanceof MustVerifyEmail, + 'status' => $request->session()->get('status'), + ]); + } + + /** + * 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(); + + Inertia::flash('toast', ['type' => 'success', 'message' => __('Profile updated.')]); + + return to_route('profile.edit'); + } + + /** + * Delete the user's profile. + */ + public function destroy(ProfileDeleteRequest $request): RedirectResponse + { + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Settings/SecurityController.php b/app/Http/Controllers/Settings/SecurityController.php new file mode 100644 index 0000000..d2800f8 --- /dev/null +++ b/app/Http/Controllers/Settings/SecurityController.php @@ -0,0 +1,66 @@ + Features::canManageTwoFactorAuthentication(), + 'canManagePasskeys' => Features::canManagePasskeys(), + 'passkeys' => Features::canManagePasskeys() + ? $request->user() + ->passkeys() + ->select(['id', 'name', 'credential', 'created_at', 'last_used_at']) + ->latest() + ->get() + ->map(fn ($passkey) => [ + 'id' => $passkey->id, + 'name' => $passkey->name, + 'authenticator' => $passkey->authenticator, + 'created_at_diff' => $passkey->created_at->diffForHumans(), + 'last_used_at_diff' => $passkey->last_used_at?->diffForHumans(), + ]) + ->values() + ->all() + : [], + 'passwordRules' => Password::defaults()->toPasswordRulesString(), + ]; + + if (Features::canManageTwoFactorAuthentication()) { + $request->ensureStateIsValid(); + + $props['twoFactorEnabled'] = $request->user()->hasEnabledTwoFactorAuthentication(); + $props['requiresConfirmation'] = Features::optionEnabled(Features::twoFactorAuthentication(), 'confirm'); + } + + return Inertia::render('settings/security', $props); + } + + /** + * Update the user's password. + */ + public function update(PasswordUpdateRequest $request): RedirectResponse + { + $request->user()->update([ + 'password' => $request->password, + ]); + + Inertia::flash('toast', ['type' => 'success', 'message' => __('Password updated.')]); + + return back(); + } +} diff --git a/app/Http/Middleware/HandleAppearance.php b/app/Http/Middleware/HandleAppearance.php new file mode 100644 index 0000000..7829afa --- /dev/null +++ b/app/Http/Middleware/HandleAppearance.php @@ -0,0 +1,23 @@ +cookie('appearance') ?? 'light'); + + return $next($request); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php new file mode 100644 index 0000000..f4cc770 --- /dev/null +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -0,0 +1,47 @@ + + */ + public function share(Request $request): array + { + return [ + ...parent::share($request), + 'name' => config('app.name'), + 'auth' => [ + 'user' => $request->user(), + ], + 'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true', + ]; + } +} diff --git a/app/Http/Requests/Settings/PasswordUpdateRequest.php b/app/Http/Requests/Settings/PasswordUpdateRequest.php new file mode 100644 index 0000000..0e5ff2f --- /dev/null +++ b/app/Http/Requests/Settings/PasswordUpdateRequest.php @@ -0,0 +1,25 @@ +|string> + */ + public function rules(): array + { + return [ + 'current_password' => $this->currentPasswordRules(), + 'password' => $this->passwordRules(), + ]; + } +} diff --git a/app/Http/Requests/Settings/ProfileDeleteRequest.php b/app/Http/Requests/Settings/ProfileDeleteRequest.php new file mode 100644 index 0000000..aec9174 --- /dev/null +++ b/app/Http/Requests/Settings/ProfileDeleteRequest.php @@ -0,0 +1,24 @@ +|string> + */ + public function rules(): array + { + return [ + 'password' => $this->currentPasswordRules(), + ]; + } +} diff --git a/app/Http/Requests/Settings/ProfileUpdateRequest.php b/app/Http/Requests/Settings/ProfileUpdateRequest.php new file mode 100644 index 0000000..e4eb8d8 --- /dev/null +++ b/app/Http/Requests/Settings/ProfileUpdateRequest.php @@ -0,0 +1,22 @@ +|string> + */ + public function rules(): array + { + return $this->profileRules($this->user()->id); + } +} diff --git a/app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php b/app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php new file mode 100644 index 0000000..8a4c428 --- /dev/null +++ b/app/Http/Requests/Settings/TwoFactorAuthenticationRequest.php @@ -0,0 +1,22 @@ +|string> + */ + public function rules(): array + { + return []; + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..e67ee72 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,50 @@ + */ + use HasFactory, Notifiable, PasskeyAuthenticatable, TwoFactorAuthenticatable; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + 'two_factor_confirmed_at' => 'datetime', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..f1525e9 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,50 @@ +configureDefaults(); + } + + /** + * Configure default behaviors for production-ready applications. + */ + protected function configureDefaults(): void + { + Date::use(CarbonImmutable::class); + + DB::prohibitDestructiveCommands( + app()->isProduction(), + ); + + Password::defaults(fn (): ?Password => app()->isProduction() + ? Password::min(12) + ->mixedCase() + ->letters() + ->numbers() + ->symbols() + ->uncompromised() + : null, + ); + } +} diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php new file mode 100644 index 0000000..0215f0c --- /dev/null +++ b/app/Providers/FortifyServiceProvider.php @@ -0,0 +1,100 @@ +configureActions(); + $this->configureViews(); + $this->configureRateLimiting(); + } + + /** + * Configure Fortify actions. + */ + private function configureActions(): void + { + Fortify::resetUserPasswordsUsing(ResetUserPassword::class); + Fortify::createUsersUsing(CreateNewUser::class); + } + + /** + * Configure Fortify views. + */ + private function configureViews(): void + { + Fortify::loginView(fn (Request $request) => Inertia::render('auth/login', [ + 'canResetPassword' => Features::enabled(Features::resetPasswords()), + 'status' => $request->session()->get('status'), + ])); + + Fortify::resetPasswordView(fn (Request $request) => Inertia::render('auth/reset-password', [ + 'email' => $request->email, + 'token' => $request->route('token'), + 'passwordRules' => Password::defaults()->toPasswordRulesString(), + ])); + + Fortify::requestPasswordResetLinkView(fn (Request $request) => Inertia::render('auth/forgot-password', [ + 'status' => $request->session()->get('status'), + ])); + + Fortify::verifyEmailView(fn (Request $request) => Inertia::render('auth/verify-email', [ + 'status' => $request->session()->get('status'), + ])); + + Fortify::registerView(fn () => Inertia::render('auth/register', [ + 'passwordRules' => Password::defaults()->toPasswordRulesString(), + ])); + + Fortify::twoFactorChallengeView(fn () => Inertia::render('auth/two-factor-challenge')); + + Fortify::confirmPasswordView(fn () => Inertia::render('auth/confirm-password')); + } + + /** + * Configure rate limiting. + */ + private function configureRateLimiting(): void + { + RateLimiter::for('two-factor', function (Request $request) { + return Limit::perMinute(5)->by($request->session()->get('login.id')); + }); + + RateLimiter::for('login', function (Request $request) { + $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); + + return Limit::perMinute(5)->by($throttleKey); + }); + + RateLimiter::for('passkeys', function (Request $request) { + return Limit::perMinute(10)->by( + ($request->input('credential.id') ?: $request->session()->getId()).'|'.$request->ip(), + ); + }); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..c35e31d --- /dev/null +++ b/artisan @@ -0,0 +1,18 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/boost.json b/boost.json new file mode 100644 index 0000000..ce644eb --- /dev/null +++ b/boost.json @@ -0,0 +1,19 @@ +{ + "agents": [ + "claude_code" + ], + "cloud": false, + "guidelines": true, + "mcp": true, + "nightwatch": false, + "sail": false, + "skills": [ + "infer-conventions", + "fortify-development", + "laravel-best-practices", + "testing-best-practices", + "wayfinder-development", + "inertia-react-development", + "tailwindcss-development" + ] +} diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..ba5cf4c --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,30 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware): void { + $middleware->encryptCookies(except: ['appearance', 'sidebar_state']); + + $middleware->web(append: [ + HandleAppearance::class, + HandleInertiaRequests::class, + AddLinkHeadersForPreloadedAssets::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions): void { + $exceptions->shouldRenderJsonWhen( + fn (Request $request) => $request->is('api/*') || $request->expectsJson(), + ); + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..5ffd769 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,9 @@ +=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": "dasprid/enum", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.7" + }, + "time": "2025-09-16T12:23:56+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/deprecations", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-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.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "adccca3324eece92ca35463648c12b9e6293c05b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/adccca3324eece92ca35463648c12b9e6293c05b", + "reference": "adccca3324eece92ca35463648c12b9e6293c05b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.10" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14" + }, + "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.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2026-08-24T09:06:52+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "8.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "2cdae51a4a02c3fe2c38d42e25a7bb952e27b768" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/2cdae51a4a02c3fe2c38d42e25a7bb952e27b768", + "reference": "2cdae51a4a02c3fe2c38d42e25a7bb952e27b768", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^3.0.2", + "guzzlehttp/psr7": "^3.1", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "4.0.1", + "guzzlehttp/test-server": "^1.0", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^9.6.34", + "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": { + "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/8.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2026-08-24T11:07:02+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "42118e66a53c492effaf92bc357e931985d5c6f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/42118e66a53c492effaf92bc357e931985d5c6f9", + "reference": "42118e66a53c492effaf92bc357e931985d5c6f9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.34" + }, + "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/3.0.2" + }, + "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": "2026-08-24T10:00:26+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a3059ba1a84c9139c4ae03cf0f45bea276c97c74", + "reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^2.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" + }, + "provide": { + "psr/http-factory-implementation": "1.1", + "psr/http-message-implementation": "2.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "php-http/psr7-integration-tests": "^1.5.1", + "phpunit/phpunit": "^9.6.34" + }, + "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/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-08-24T11:02:13+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "7a466ad606491eb6528c717482f7cca77f1851f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/7a466ad606491eb6528c717482f7cca77f1851f3", + "reference": "7a466ad606491eb6528c717482f7cca77f1851f3", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "symfony/polyfill-php80": "^1.25" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^9.6.34", + "uri-template/tests": "1.0.2" + }, + "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/v2.0.1" + }, + "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": "2026-08-24T17:13:02+00:00" + }, + { + "name": "inertiajs/inertia-laravel", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "174f5040314edeb1a2371ce18aef4736c25375f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/174f5040314edeb1a2371ce18aef4736c25375f6", + "reference": "174f5040314edeb1a2371ce18aef4736c25375f6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^11.35|^12.0|^13.0", + "php": "^8.2.0", + "symfony/console": "^7.0|^8.0" + }, + "conflict": { + "laravel/boost": "<2.5.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.15.2|^8.0", + "larastan/larastan": "^3.0", + "laravel/pint": "^1.16", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^9.2|^10.0|^11.0", + "phpunit/phpunit": "^11.5|^12.0" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./helpers.php" + ], + "psr-4": { + "Inertia\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v3.3.2" + }, + "time": "2026-09-02T07:31:03+00:00" + }, + { + "name": "laravel/chisel", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/chisel.git", + "reference": "c2ac11cd1c6b763b412aa26b9d95fce70a489d31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/chisel/zipball/c2ac11cd1c6b763b412aa26b9d95fce70a489d31", + "reference": "c2ac11cd1c6b763b412aa26b9d95fce70a489d31", + "shasum": "" + }, + "require": { + "illuminate/process": "^10.20|^11.0|^12.0|^13.0", + "nikic/php-parser": "^5.0", + "php": "^8.2" + }, + "require-dev": { + "laravel/pint": "^1.24.0", + "pestphp/pest": "^4.1.0", + "phpstan/phpstan": "^2.1.26", + "rector/rector": "^2.1.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laravel\\Chisel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Toolkit for building scripts that remove unwanted code, files, and dependencies.", + "keywords": [ + "chisel", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/chisel/issues", + "source": "https://github.com/laravel/chisel/tree/v0.1.1" + }, + "time": "2026-05-13T21:29:24+00:00" + }, + { + "name": "laravel/fortify", + "version": "v1.39.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/fortify.git", + "reference": "b1fc50707bbe007fd92165d8b7d460ab549b355a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/fortify/zipball/b1fc50707bbe007fd92165d8b7d460ab549b355a", + "reference": "b1fc50707bbe007fd92165d8b7d460ab549b355a", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^3.0", + "ext-json": "*", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "laravel/passkeys": "^0.2.0", + "php": "^8.2", + "pragmarx/google2fa": "^9.0" + }, + "require-dev": { + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^2.2.6" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Fortify\\FortifyServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Fortify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Backend controllers and scaffolding for Laravel authentication.", + "keywords": [ + "auth", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/fortify/issues", + "source": "https://github.com/laravel/fortify" + }, + "time": "2026-08-23T07:46:41+00:00" + }, + { + "name": "laravel/framework", + "version": "v13.30.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "718d17db56861e0a49f644217c8853dab1bff8ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/718d17db56861e0a49f644217c8853dab1bff8ce", + "reference": "718d17db56861e0a49f644217c8853dab1bff8ce", + "shasum": "" + }, + "require": { + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2 || ^8.0", + "guzzlehttp/promises": "^2.0.3 || ^3.0", + "guzzlehttp/psr7": "^2.9 || ^3.0", + "guzzlehttp/uri-template": "^1.0 || ^2.0", + "laravel/prompts": "^0.3.11", + "laravel/serializable-closure": "^2.0.10", + "league/commonmark": "^2.8.1", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.10", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.3", + "psr/container": "^1.1.1 || ^2.0.1", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/error-handler": "^7.4.0 || ^8.0.0", + "symfony/finder": "^7.4.0 || ^8.0.0", + "symfony/http-foundation": "^7.4.0 || ^8.0.0", + "symfony/http-kernel": "^7.4.0 || ^8.0.0", + "symfony/mailer": "^7.4.0 || ^8.0.0", + "symfony/mime": "^7.4.0 || ^8.0.0", + "symfony/polyfill-php84": "^1.36", + "symfony/polyfill-php85": "^1.36", + "symfony/polyfill-php86": "^1.36", + "symfony/process": "^7.4.5 || ^8.0.5", + "symfony/routing": "^7.4.0 || ^8.0.0", + "symfony/uid": "^7.4.0 || ^8.0.0", + "symfony/var-dumper": "^7.4.0 || ^8.0.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1 || 2.0", + "psr/log-implementation": "1.0 || 2.0 || 3.0", + "psr/simple-cache-implementation": "1.0 || 2.0 || 3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/image": "self.version", + "illuminate/json-schema": "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/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "intervention/image": "^4.0", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^11.0.0", + "pda/pheanstalk": "^7.0.0 || ^8.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", + "predis/predis": "^2.3 || ^3.0", + "rector/rector": "2.6.3", + "resend/resend-php": "^1.0", + "symfony/cache": "^7.4.0 || ^8.0.0", + "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", + "symfony/translation": "^7.4.0 || ^8.0.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0 || ^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0 || ^5.0 || ^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "intervention/image": "Required to use the image processing features (^4.0).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^7.0 || ^8.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^11.5.50 || ^12.5.8 || ^13.0.3).", + "predis/predis": "Required to use the predis connector (^2.3 || ^3.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 || ^1.0).", + "spatie/fork": "Required to use the 'fork' concurrency driver (^1.2).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.4 || ^8.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "13.0.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "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": "2026-09-01T21:42:30+00:00" + }, + { + "name": "laravel/passkeys", + "version": "v0.2.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/passkeys-server.git", + "reference": "a76656ada41b2b4a591f075eddae5ddc67e8ab9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passkeys-server/zipball/a76656ada41b2b4a591f075eddae5ddc67e8ab9c", + "reference": "a76656ada41b2b4a591f075eddae5ddc67e8ab9c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/http": "^11.0|^12.0|^13.0", + "illuminate/routing": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "web-auth/webauthn-lib": "5.3.x" + }, + "require-dev": { + "laravel/pint": "^1.28.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "rector/rector": "^2.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Passkeys\\PasskeysServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passkeys\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Passwordless authentication using WebAuthn/passkeys for Laravel", + "homepage": "https://github.com/laravel/passkeys-server", + "keywords": [ + "Authentication", + "Passwordless", + "laravel", + "passkeys", + "webauthn" + ], + "support": { + "issues": "https://github.com/laravel/passkeys-server/issues", + "source": "https://github.com/laravel/passkeys-server" + }, + "time": "2026-05-18T16:26:00+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.24", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/5d3cdef29e93ca3b62b1871359db3078cd99908b", + "reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.24" + }, + "time": "2026-08-20T12:55:36+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.16", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", + "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2026-08-18T20:28:54+00:00" + }, + { + "name": "laravel/tinker", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "4faba77764bd33411735936acdf30446d058c78b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/4faba77764bd33411735936acdf30446d058c78b", + "reference": "4faba77764bd33411735936acdf30446d058c78b", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5|^11.5" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "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/v3.0.2" + }, + "time": "2026-03-17T14:54:13+00:00" + }, + { + "name": "laravel/wayfinder", + "version": "v0.1.21", + "source": { + "type": "git", + "url": "https://github.com/laravel/wayfinder.git", + "reference": "a85a996cea189f59cac14854f8b13319a29007f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/wayfinder/zipball/a85a996cea189f59cac14854f8b13319a29007f3", + "reference": "a85a996cea189f59cac14854f8b13319a29007f3", + "shasum": "" + }, + "require": { + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/filesystem": "^11.0|^12.0|^13.0", + "illuminate/routing": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "phpstan/phpdoc-parser": "^2.3" + }, + "conflict": { + "laravel/boost": "<2.5.0" + }, + "require-dev": { + "laravel/pint": "^1.21", + "orchestra/testbench": "^11.0|^10.1|^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Wayfinder\\WayfinderServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Wayfinder\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Generate TypeScript representations of your Laravel actions and routes.", + "homepage": "https://github.com/laravel/wayfinder", + "keywords": [ + "laravel", + "php", + "routes", + "typescript" + ], + "support": { + "issues": "https://github.com/laravel/wayfinder/issues", + "source": "https://github.com/laravel/wayfinder" + }, + "time": "2026-08-04T21:55:43+00:00" + }, + { + "name": "league/commonmark", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d2d1aa8b35e072966c89bc0c66cf926e56767dc4", + "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.11-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": "2026-08-11T16:06:25+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.36.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f7fb152932f30072d573510cbd4dd657d6475b25", + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.36.0" + }, + "time": "2026-09-02T08:00:27+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.35.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/a099b24dce160f3b2239043d13d47c4a1a214ea4", + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4", + "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.35.3" + }, + "time": "2026-08-12T13:29:21+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.17.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "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 || ^11.0 || ^12.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.17.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2026-07-09T11:49:27+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "147f303310f06334f03f409e49d7ad1e275ff05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/147f303310f06334f03f409e49d7ad1e275ff05a", + "reference": "147f303310f06334f03f409e49d7ad1e275ff05a", + "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 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.11.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-09-02T12:39:56+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.13.2", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.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": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-08-08T11:40:35+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.6", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "c54350438cd6914616f790a49cb424605f421562" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/c54350438cd6914616f790a49cb424605f421562", + "reference": "c54350438cd6914616f790a49cb424605f421562", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette 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.6" + }, + "time": "2026-08-16T21:58:41+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::chr(), ord() 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.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.5" + }, + "time": "2026-07-17T23:02:45+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.8.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "shasum": "" + }, + "require": { + "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.x-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.8.0" + }, + "time": "2026-07-04T14:30:18+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "require-dev": { + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.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": "It's 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.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^2.0", + "phpstan/phpdoc-parser": "^2.0", + "webmozart/assert": "^1.9.1 || ^2" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26", + "shipmonk/dead-code-detector": "^0.5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" + }, + "time": "2026-03-18T20:49:53+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", + "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" + }, + "time": "2026-01-06T21:53:42+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d", + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33" + }, + "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.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2026-08-24T00:54:40+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.5" + }, + "time": "2026-08-31T16:05:28+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "v9.1.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "f00bc788c555adfb6765c437ff3538e59cd88af1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/f00bc788c555adfb6765c437ff3538e59cd88af1", + "reference": "f00bc788c555adfb6765c437ff3538e59cd88af1", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "phpunit/phpunit": "~9|~10|~11|~12|~13", + "psalm/plugin-phpunit": "^0.19|^0.20", + "vimeo/psalm": "^5.26|^6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "MFA", + "Two Factor Authentication", + "google-authenticator", + "google2fa", + "hotp", + "otp", + "rfc4226", + "rfc6238", + "totp" + ], + "support": { + "docs": "https://github.com/antonioribeiro/google2fa#readme", + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "security": "https://github.com/antonioribeiro/google2fa/security/policy", + "source": "https://github.com/antonioribeiro/google2fa" + }, + "time": "2026-08-15T13:22:01+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.24", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^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", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.24" + }, + "time": "2026-06-29T15:41:09+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8", + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", + "shasum": "" + }, + "require": { + "brick/math": ">=0.8.16 <=0.18", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.3" + }, + "time": "2026-06-18T03:57:49+00:00" + }, + { + "name": "spomky-labs/cbor-php", + "version": "3.3.4", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/cbor-php.git", + "reference": "1cac24eeae4be47122d505542a170623b2a35ea3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/1cac24eeae4be47122d505542a170623b2a35ea3", + "reference": "1cac24eeae4be47122d505542a170623b2a35ea3", + "shasum": "" + }, + "require": { + "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18|^0.19|^0.20", + "ext-mbstring": "*", + "php": ">=8.0" + }, + "require-dev": { + "ext-json": "*", + "roave/security-advisories": "dev-latest", + "symfony/error-handler": "^6.4|^7.1|^8.0", + "symfony/var-dumper": "^6.4|^7.1|^8.0" + }, + "suggest": { + "ext-bcmath": "GMP or BCMath extensions will drastically improve the library performance. BCMath extension needed to handle the Big Float and Decimal Fraction Tags", + "ext-gmp": "GMP or BCMath extensions will drastically improve the library performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "CBOR\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/Spomky-Labs/cbor-php/contributors" + } + ], + "description": "CBOR Encoder/Decoder for PHP", + "keywords": [ + "Concise Binary Object Representation", + "RFC7049", + "cbor" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/cbor-php/issues", + "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.3.4" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2026-08-31T18:59:25+00:00" + }, + { + "name": "spomky-labs/pki-framework", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/pki-framework.git", + "reference": "5d630ec371652229ad568337519f16e539e5f79d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/5d630ec371652229ad568337519f16e539e5f79d", + "reference": "5d630ec371652229ad568337519f16e539e5f79d", + "shasum": "" + }, + "require": { + "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18|^0.19|^0.20", + "ext-mbstring": "*", + "php": ">=8.1" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0|^2.0|^3.0", + "ext-gmp": "*", + "ext-openssl": "*", + "infection/infection": "^0.28|^0.29|^0.31", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.3|^2.0", + "phpstan/phpstan": "^1.8|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.1|^2.0", + "phpstan/phpstan-strict-rules": "^1.3|^2.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", + "rector/rector": "^1.0|^2.0", + "roave/security-advisories": "dev-latest", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symplify/easy-coding-standard": "^12.0 || ^13.0" + }, + "suggest": { + "ext-bcmath": "For better performance (or GMP)", + "ext-gmp": "For better performance (or BCMath)", + "ext-openssl": "For OpenSSL based cyphering" + }, + "type": "library", + "autoload": { + "psr-4": { + "SpomkyLabs\\Pki\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joni Eskelinen", + "email": "jonieske@gmail.com", + "role": "Original developer" + }, + { + "name": "Florent Morselli", + "email": "florent.morselli@spomky-labs.com", + "role": "Spomky-Labs PKI Framework developer" + } + ], + "description": "A PHP framework for managing Public Key Infrastructures. It comprises X.509 public key certificates, attribute certificates, certification requests and certification path validation.", + "homepage": "https://github.com/spomky-labs/pki-framework", + "keywords": [ + "DER", + "Private Key", + "ac", + "algorithm identifier", + "asn.1", + "asn1", + "attribute certificate", + "certificate", + "certification request", + "cryptography", + "csr", + "decrypt", + "ec", + "encrypt", + "pem", + "pkcs", + "public key", + "rsa", + "sign", + "signature", + "verify", + "x.509", + "x.690", + "x509", + "x690" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/pki-framework/issues", + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.6.1" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2026-08-30T13:53:49+00:00" + }, + { + "name": "symfony/clock", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/clock": "^1.0" + }, + "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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/console", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/eb7d9957d66739649e931ce7a9d05dab69f8abac", + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.4.6|^8.0.6" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-25T14:18:42+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/08e2905152a39cf3fd1745d83f8c483e258887d9", + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-23T10:06:25+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce", + "reference": "8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^7.4|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7458da64220376b2e0dc2d8451bf43382c1ad297", + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/security-http": "<7.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": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.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/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/finder", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474", + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.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/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T12:16:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/093b78326f649c3a9db922b9f17123b6aeb3b8fb", + "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<4.3" + }, + "require-dev": { + "doctrine/dbal": "^4.3", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T20:10:55+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", + "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/flex": "<2.10", + "symfony/http-client-contracts": "<2.5", + "symfony/serializer": "<7.4.15|>=8.0,<8.0.15|>=8.1,<8.1.2", + "symfony/translation-contracts": "<2.5", + "symfony/var-dumper": "<8.1", + "symfony/web-profiler-bundle": "<8.1", + "twig/twig": "<3.21" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^8.1", + "symfony/var-exporter": "^7.4|^8.0", + "twig/twig": "^3.21|^4.0" + }, + "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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T21:40:49+00:00" + }, + { + "name": "symfony/mailer", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "89f43137da74b8f1aab37c99926482b7084f51b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/89f43137da74b8f1aab37c99926482b7084f51b9", + "reference": "89f43137da74b8f1aab37c99926482b7084f51b9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.4.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.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/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/mime", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", + "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/serializer": "^7.4.17|^8.1.5" + }, + "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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-22T09:06:25+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-28T08:25:59+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.42.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/51b5ff5ba85452b31ec6f55490b08148612339d9", + "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.42.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-24T10:51:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.42.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-07T06:33:24+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-php82", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php82.git", + "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php82\\": "" + }, + "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.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php82/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:45:58+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:51:13+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-01T12:47:55+00:00" + }, + { + "name": "symfony/polyfill-php86", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php86.git", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php86\\": "" + }, + "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.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php86/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-02T13:42:24+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/process", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d863f5e70d7c87abb906ac11b61f83036093000b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d863f5e70d7c87abb906ac11b61f83036093000b", + "reference": "d863f5e70d7c87abb906ac11b61f83036093000b", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/property-access", + "version": "v8.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "1a41232c678972b93ce499a504e19ea09dfcd0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/1a41232c678972b93ce499a504e19ea09dfcd0b2", + "reference": "1a41232c678972b93ce499a504e19ea09dfcd0b2", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/property-info": "^7.4.4|^8.0.4" + }, + "require-dev": { + "symfony/cache": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v8.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-30T12:40:56+00:00" + }, + { + "name": "symfony/property-info", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42", + "reference": "d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/string": "^7.4|^8.0", + "symfony/type-info": "^7.4.7|^8.0.7" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T08:48:43+00:00" + }, + { + "name": "symfony/routing", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3c188091b6b4fa2e4bc83a135caede12deb8576c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3c188091b6b4fa2e4bc83a135caede12deb8576c", + "reference": "3c188091b6b4fa2e4bc83a135caede12deb8576c", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-17T13:18:34+00:00" + }, + { + "name": "symfony/serializer", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "931151b12d6e2d4996ce2ce8e7b180d35455f37a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/931151b12d6e2d4996ce2ce8e7b180d35455f37a", + "reference": "931151b12d6e2d4996ce2ce8e7b180d35455f37a", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/property-access": "<8.1", + "symfony/property-info": "<7.4.15", + "symfony/type-info": "<7.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/filesystem": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/property-access": "^8.1", + "symfony/property-info": "^7.4.15|~8.0.15|^8.1.2", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T08:48:47+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-27T15:39:01+00:00" + }, + { + "name": "symfony/string", + "version": "v8.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.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/v8.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-28T07:35:25+00:00" + }, + { + "name": "symfony/translation", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/d9e1caba0d6b6f9a26710af8a2f88d37f001215a", + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^3.6.1" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/http-client-contracts": "<2.5", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^7.4|^8.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/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/type-info", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "ceb48db5b38d6a48640c414be0c69d53980ae5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/ceb48db5b38d6a48640c414be0c69d53980ae5c5", + "reference": "ceb48db5b38d6a48640c414be0c69d53980ae5c5", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-21T17:47:34+00:00" + }, + { + "name": "symfony/uid", + "version": "v8.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "a08aef47989093f32fe50fd11859be1b427df389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/a08aef47989093f32fe50fd11859be1b427df389", + "reference": "a08aef47989093f32fe50fd11859be1b427df389", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^7.4|^8.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/v8.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-11T13:39:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "3783365b58972f4779254d98372af80fbf15e170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3783365b58972f4779254d98372af80fbf15e170", + "reference": "3783365b58972f4779254d98372af80fbf15e170", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "twig/twig": "^3.12|^4.0" + }, + "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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T20:10:55+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "301c07936b16d88628b126b01d082ba153cf4c40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40", + "reference": "301c07936b16d88628b126b01d082ba153cf4c40", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.10", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "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 `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2026-08-24T18:07:49+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.1.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": "2026-04-26T05:33:54+00:00" + }, + { + "name": "web-auth/cose-lib", + "version": "4.7.1", + "source": { + "type": "git", + "url": "https://github.com/web-auth/cose-lib.git", + "reference": "e698b150049141f2f9ec03d2a4d681a2d020ab83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/e698b150049141f2f9ec03d2a4d681a2d020ab83", + "reference": "e698b150049141f2f9ec03d2a4d681a2d020ab83", + "shasum": "" + }, + "require": { + "brick/math": "^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20", + "ext-json": "*", + "ext-openssl": "*", + "php": ">=8.1", + "spomky-labs/pki-framework": "^1.0" + }, + "require-dev": { + "spomky-labs/cbor-php": "^3.2.2" + }, + "suggest": { + "ext-bcmath": "For better performance, please install either GMP (recommended) or BCMath extension", + "ext-gmp": "For better performance, please install either GMP (recommended) or BCMath extension", + "spomky-labs/cbor-php": "For COSE Signature support" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cose\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-auth/cose/contributors" + } + ], + "description": "CBOR Object Signing and Encryption (COSE) For PHP", + "homepage": "https://github.com/web-auth", + "keywords": [ + "COSE", + "RFC8152" + ], + "support": { + "issues": "https://github.com/web-auth/cose-lib/issues", + "source": "https://github.com/web-auth/cose-lib/tree/4.7.1" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2026-08-30T13:53:57+00:00" + }, + { + "name": "web-auth/webauthn-lib", + "version": "5.3.8", + "source": { + "type": "git", + "url": "https://github.com/web-auth/webauthn-lib.git", + "reference": "85d8ae791c87a34be91a7ff5cdb5606f67dedaab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/85d8ae791c87a34be91a7ff5cdb5606f67dedaab", + "reference": "85d8ae791c87a34be91a7ff5cdb5606f67dedaab", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "paragonie/constant_time_encoding": "^2.6|^3.0", + "php": ">=8.2", + "phpdocumentor/reflection-docblock": "^5.3|^6.0", + "psr/clock": "^1.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "spomky-labs/cbor-php": "^3.0", + "spomky-labs/pki-framework": "^1.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^3.2", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "web-auth/cose-lib": "^4.2.3" + }, + "suggest": { + "psr/log-implementation": "Recommended to receive logs from the library", + "symfony/event-dispatcher": "Recommended to use dispatched events", + "web-token/jwt-library": "Mandatory for fetching Metadata Statement from distant sources" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/web-auth/webauthn-framework", + "name": "web-auth/webauthn-framework" + } + }, + "autoload": { + "psr-4": { + "Webauthn\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-auth/webauthn-library/contributors" + } + ], + "description": "FIDO2/Webauthn Support For PHP", + "homepage": "https://github.com/web-auth", + "keywords": [ + "FIDO2", + "fido", + "webauthn" + ], + "support": { + "source": "https://github.com/web-auth/webauthn-lib/tree/5.3.8" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2026-08-30T14:20:17+00:00" + }, + { + "name": "webmozart/assert", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^8.2" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "type": "library", + "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, + "branch-alias": { + "dev-master": "2.0-dev", + "dev-feature/2-0": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@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/2.4.1" + }, + "time": "2026-06-15T15:31:57+00:00" + } + ], + "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.20.0", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.3.0", + "jean85/pretty-package-versions": "^2.1.1", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", + "phpunit/php-file-iterator": "^6.0.1 || ^7", + "phpunit/php-timer": "^8 || ^9", + "phpunit/phpunit": "^12.5.14 || ^13.0.5", + "sebastian/environment": "^8.0.3 || ^9", + "symfony/console": "^7.4.7 || ^8.0.7", + "symfony/process": "^7.4.5 || ^8.0.5" + }, + "require-dev": { + "doctrine/coding-standard": "^14.0.0", + "ext-pcntl": "*", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.44", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "symfony/filesystem": "^7.4.6 || ^8.0.6" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.20.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2026-03-29T15:46:14+00:00" + }, + { + "name": "composer/pcre", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", + "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<2.2.2" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-06-07T11:47:49+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b61cd040da1a4925bc90a51c074f5297e7c0fa52", + "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-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/v3.0.0" + }, + "time": "2026-03-17T11:56:53+00:00" + }, + { + "name": "iamcal/sql-parser", + "version": "v0.7", + "source": { + "type": "git", + "url": "https://github.com/iamcal/SQLParser.git", + "reference": "610392f38de49a44dab08dc1659960a29874c4b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/iamcal/SQLParser/zipball/610392f38de49a44dab08dc1659960a29874c4b8", + "reference": "610392f38de49a44dab08dc1659960a29874c4b8", + "shasum": "" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^1.0", + "phpunit/phpunit": "^5|^6|^7|^8|^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "iamcal\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cal Henderson", + "email": "cal@iamcal.com" + } + ], + "description": "MySQL schema parser", + "support": { + "issues": "https://github.com/iamcal/SQLParser/issues", + "source": "https://github.com/iamcal/SQLParser/tree/v0.7" + }, + "time": "2026-01-28T22:20:33+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, + { + "name": "larastan/larastan", + "version": "v3.11.0", + "source": { + "type": "git", + "url": "https://github.com/larastan/larastan.git", + "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/larastan/larastan/zipball/9baa74074f17cc70feaef31616a06ea0faeebba5", + "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5", + "shasum": "" + }, + "require": { + "iamcal/sql-parser": "^0.7.0", + "illuminate/console": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/container": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/contracts": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/database": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/http": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/pipeline": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/support": "^11.44.2 || ^12.4.1 || ^13", + "php": "^8.2", + "phpstan/phpstan": "^2.2.2" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "laravel/framework": "^11.44.2 || ^12.7.2 || ^13", + "mockery/mockery": "^1.6.12", + "nikic/php-parser": "^5.4", + "orchestra/canvas": "^v9.2.2 || ^10.0.1 || ^11", + "orchestra/testbench-core": "^9.12.0 || ^10.1 || ^11", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpunit/phpunit": "^10.5.35 || ^11.5.15 || ^12.5.8 || ^13.3.0" + }, + "suggest": { + "orchestra/testbench": "Using Larastan for analysing a package needs Testbench", + "phpmyadmin/sql-parser": "Install to enable Larastan's optional phpMyAdmin-based SQL parser automatically" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Larastan\\Larastan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Can Vural", + "email": "can9119@gmail.com" + } + ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/larastan/larastan/issues", + "source": "https://github.com/larastan/larastan/tree/v3.11.0" + }, + "funding": [ + { + "url": "https://github.com/canvural", + "type": "github" + } + ], + "time": "2026-09-01T16:35:48+00:00" + }, + { + "name": "laravel/agent-detector", + "version": "v2.0.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/agent-detector.git", + "reference": "90694b9256099591cf9e55d08c18ba7a00bf099f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/agent-detector/zipball/90694b9256099591cf9e55d08c18ba7a00bf099f", + "reference": "90694b9256099591cf9e55d08c18ba7a00bf099f", + "shasum": "" + }, + "require": { + "php": "^8.2.0" + }, + "require-dev": { + "laravel/pint": "^1.24.0", + "pestphp/pest": "^3.8.5|^4.1.0", + "pestphp/pest-plugin-type-coverage": "^3.0|^4.0.2", + "phpstan/phpstan": "^2.1.26", + "rector/rector": "^2.1.7", + "symfony/var-dumper": "^7.3.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Laravel\\AgentDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Detect if code is running in an AI agent or automated development environment", + "homepage": "https://github.com/laravel/agent-detector", + "keywords": [ + "Agent", + "ai", + "automation", + "claude", + "cursor", + "detection", + "devin", + "php" + ], + "support": { + "issues": "https://github.com/laravel/agent-detector/issues", + "source": "https://github.com/laravel/agent-detector" + }, + "time": "2026-04-29T18:32:34+00:00" + }, + { + "name": "laravel/boost", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/boost.git", + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/boost/zipball/b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^7.9|^8.0", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "laravel/mcp": "^0.7.1|^0.8.0|^0.9.0", + "laravel/prompts": "^0.3.10", + "laravel/roster": "^1.0.0", + "php": "^8.2" + }, + "require-dev": { + "laravel/pint": "^1.27.0", + "mockery/mockery": "^1.6.12", + "orchestra/testbench": "^9.15.0|^10.6|^11.0", + "pestphp/pest": "^2.36.0|^3.8.4|^4.1.5", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Boost\\BoostServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Boost\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.", + "homepage": "https://github.com/laravel/boost", + "keywords": [ + "ai", + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/boost/issues", + "source": "https://github.com/laravel/boost" + }, + "time": "2026-08-26T21:39:22+00:00" + }, + { + "name": "laravel/mcp", + "version": "v0.9.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/mcp.git", + "reference": "7ca5b923630118696602d14348cd0466a5e853ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/mcp/zipball/7ca5b923630118696602d14348cd0466a5e853ec", + "reference": "7ca5b923630118696602d14348cd0466a5e853ec", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/container": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/http": "^11.45.3|^12.41.1|^13.0", + "illuminate/json-schema": "^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "illuminate/validation": "^11.45.3|^12.41.1|^13.0", + "php": "^8.2", + "symfony/process": "^7.4.5|^8.0.5" + }, + "require-dev": { + "laravel/pint": "^1.20", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "pestphp/pest": "^3.8.5|^4.3.2", + "phpstan/phpstan": "^2.1.27", + "rector/rector": "^2.2.4" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Mcp": "Laravel\\Mcp\\Facades\\Mcp" + }, + "providers": [ + "Laravel\\Mcp\\Server\\McpServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Mcp\\": "src/", + "Laravel\\Mcp\\Server\\": "src/Server/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Rapidly build MCP servers for your Laravel applications.", + "homepage": "https://github.com/laravel/mcp", + "keywords": [ + "laravel", + "mcp" + ], + "support": { + "issues": "https://github.com/laravel/mcp/issues", + "source": "https://github.com/laravel/mcp" + }, + "time": "2026-08-13T15:01:07+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/2f7d27dada8effc48b8c424445a69cca7007daaa", + "reference": "2f7d27dada8effc48b8c424445a69cca7007daaa", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2026-05-20T22:24:57+00:00" + }, + { + "name": "laravel/pao", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/pao.git", + "reference": "5aee99c8c37565e9c457c33f4d36aa363a389dc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pao/zipball/5aee99c8c37565e9c457c33f4d36aa363a389dc8", + "reference": "5aee99c8c37565e9c457c33f4d36aa363a389dc8", + "shasum": "" + }, + "require": { + "laravel/agent-detector": "^2.0.2", + "php": "^8.3" + }, + "conflict": { + "laravel/framework": "<12.0.0", + "nunomaduro/collision": "<8.9.3", + "pestphp/pest": "<4.6.3 || >=6.0.0", + "phpunit/phpunit": "<12.5.23 || >=13.0.0 <13.1.7 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.20.0", + "laravel/pint": "^1.30.5", + "orchestra/testbench": "^10.11.0 || ^11.1.0", + "pestphp/pest": "^4.7.8 || ^5.1.0", + "pestphp/pest-plugin-type-coverage": "^4.0.4 || ^5.0.2", + "phpstan/phpstan": "^2.2.8", + "rector/rector": "^2.6.1", + "symfony/process": "^7.4.13 || ^8.1.0", + "symfony/var-dumper": "^7.4.15 || ^8.1.2" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Laravel\\Pao\\Drivers\\Pest\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Laravel\\Pao\\Laravel\\ServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Laravel\\Pao\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Agent-optimized output for PHP testing tools", + "keywords": [ + "Agent", + "PHPStan", + "ai", + "dev", + "paratest", + "pest", + "php", + "phpunit", + "rector", + "testing" + ], + "support": { + "issues": "https://github.com/laravel/pao/issues", + "source": "https://github.com/laravel/pao" + }, + "time": "2026-08-10T23:45:44+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.30.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "fe4148c503a0e266353d61396b79bbf7f35122df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/fe4148c503a0e266353d61396b79bbf7f35122df", + "reference": "fe4148c503a0e266353d61396b79bbf7f35122df", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.3.0" + }, + "require-dev": { + "composer/semver": "^3.4.4", + "friendsofphp/php-cs-fixer": "^3.95.18", + "illuminate/view": "^13.24.0", + "larastan/larastan": "^3.10.0", + "laravel-zero/framework": "^13.0.0", + "laravel/agent-detector": "^2.0.2", + "laravel/prompts": "^0.3.22", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^4.7.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": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2026-08-10T15:35:50+00:00" + }, + { + "name": "laravel/roster", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/roster.git", + "reference": "89e518bd88ae98ff50f6082f6b517c8d8e8245fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/roster/zipball/89e518bd88ae98ff50f6082f6b517c8d8e8245fa", + "reference": "89e518bd88ae98ff50f6082f6b517c8d8e8245fa", + "shasum": "" + }, + "require": { + "composer/semver": "^3.0", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/yaml": "^7.2|^8.0" + }, + "require-dev": { + "laravel/pint": "^1.29", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "pestphp/pest": "^3.0|^4.1", + "phpstan/phpstan": "^2.0", + "rector/rector": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Roster\\RosterServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Roster\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Detect packages & approaches in use within a Laravel project", + "homepage": "https://github.com/laravel/roster", + "keywords": [ + "dev", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/roster/issues", + "source": "https://github.com/laravel/roster" + }, + "time": "2026-07-18T17:53:15+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.67.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "639e03ac12cf23def171770bcab05758045b2642" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/639e03ac12cf23def171770bcab05758045b2642", + "reference": "639e03ac12cf23def171770bcab05758045b2642", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" + }, + "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": "2026-08-12T13:55:56+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.15", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/967a801bd188989a5669bd280f252d51c0fdc9ee", + "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0 || ^3.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6.36", + "symplify/easy-coding-standard": "^13.2.17" + }, + "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": "2026-08-19T19:37:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "shasum": "" + }, + "require": { + "php": "^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.14.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2026-08-11T10:17:44+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.9.5", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.14 || ^8.1.1" + }, + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.10.0", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0", + "laravel/pint": "^1.29.3", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5", + "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-07-15T19:09:14+00:00" + }, + { + "name": "pestphp/pest", + "version": "v4.7.8", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "5b2293f67adcf1b2320b33f521b94a692d18f360" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/5b2293f67adcf1b2320b33f521b94a692d18f360", + "reference": "5b2293f67adcf1b2320b33f521b94a692d18f360", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.20.0", + "composer/xdebug-handler": "^3.0.5", + "nunomaduro/collision": "^8.9.5", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest-plugin": "^4.0.0", + "pestphp/pest-plugin-arch": "^4.0.2", + "pestphp/pest-plugin-mutate": "^4.0.1", + "pestphp/pest-plugin-profanity": "^4.2.1", + "php": "^8.3.0", + "phpunit/phpunit": "^12.5.33", + "symfony/process": "^7.4.13|^8.1.0" + }, + "conflict": { + "filp/whoops": "<2.18.3", + "phpunit/phpunit": ">12.5.33", + "sebastian/exporter": "<7.0.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "mrpunyapal/peststan": "^0.2.12", + "pestphp/pest-dev-tools": "^4.1.0", + "pestphp/pest-plugin-browser": "^4.3.1", + "pestphp/pest-plugin-type-coverage": "^4.0.4", + "psy/psysh": "^0.12.24" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Shard", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v4.7.8" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2026-08-03T20:49:44+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.3" + }, + "conflict": { + "pestphp/pest": "<4.0.0" + }, + "require-dev": { + "composer/composer": "^2.8.10", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2025-08-20T12:35:58+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v4.0.2", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", + "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "ta-tikoma/phpunit-architecture-test": "^0.8.7" + }, + "require-dev": { + "pestphp/pest": "^4.4.6", + "pestphp/pest-dev-tools": "^4.1.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2026-04-10T17:20:19+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/3057a36669ff11416cc0dc2b521b3aec58c488d0", + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0", + "shasum": "" + }, + "require": { + "laravel/framework": "^11.45.2|^12.52.0|^13.0", + "pestphp/pest": "^4.4.1", + "php": "^8.3.0" + }, + "require-dev": { + "laravel/dusk": "^8.3.6", + "orchestra/testbench": "^9.13.0|^10.9.0|^11.0", + "pestphp/pest-dev-tools": "^4.1.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.1.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2026-02-21T00:29:45+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v4.0.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", + "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.6.1", + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0", + "pestphp/pest-plugin-type-coverage": "^4.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + }, + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2025-08-21T20:19:25+00:00" + }, + { + "name": "pestphp/pest-plugin-profanity", + "version": "v4.2.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-profanity.git", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "shasum": "" + }, + "require": { + "pestphp/pest-plugin": "^4.0.0", + "php": "^8.3" + }, + "require-dev": { + "faissaloux/pest-plugin-inside": "^1.9", + "pestphp/pest": "^4.0.0", + "pestphp/pest-dev-tools": "^4.0.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Profanity\\Plugin" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\Profanity\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Profanity Plugin", + "keywords": [ + "framework", + "pest", + "php", + "plugin", + "profanity", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.1" + }, + "time": "2025-12-08T00:13:17+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": "phpstan/phpstan", + "version": "2.2.12", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/174b0d88710f00a42598886504dd7a146f91ace5", + "reference": "174b0d88710f00a42598886504dd7a146f91ace5", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2026-08-31T19:09:43+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "12.5.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "186dab580576598076de6818596d12b61801880e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.28" + }, + "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": "12.5.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-06-01T13:24:19+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a248d1640ab059b075f53a2ef0f9856e864e06b5", + "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.33" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-08-25T14:40:53+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:58+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.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/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:38+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "12.5.33", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b98e028a26c5c5ba7e4a54be96ccf35f2914d184", + "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "12.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.33" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-07-28T13:58:09+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for 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/4.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" + } + ], + "time": "2026-05-17T05:29:34+00:00" + }, + { + "name": "sebastian/comparator", + "version": "7.1.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "7c65c1e79836812819705b473a90c12399542485" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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": "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/7.1.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-05-21T04:45:25+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6", + "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.33", + "symfony/process": "^7.4.17" + }, + "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" + }, + { + "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/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/diff", + "type": "tidelift" + } + ], + "time": "2026-08-25T15:35:54+00:00" + }, + { + "name": "sebastian/environment", + "version": "8.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.26" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:40:20+00:00" + }, + { + "name": "sebastian/exporter", + "version": "7.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "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" + }, + { + "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/7.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2026-05-20T04:37:17+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0.1" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.5.28" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.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/8.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2026-06-01T15:10:33+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.7.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "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 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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" + } + ], + "time": "2026-05-19T16:22:07+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.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": "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/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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" + }, + { + "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/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:44:59+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "82ff822c2edc46724be9f7411d3163021f602773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.5.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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/6.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2026-05-20T06:45:45+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v8.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5", + "reference": "0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" + }, + "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/v8.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-08-30T01:03:44+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.7", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" + }, + "time": "2026-02-17T17:25:14+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" + }, + "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/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-12-08T11:19:18+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.3" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..1f8dd27 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')), + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache", "array" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..d7568ff --- /dev/null +++ b/config/auth.php @@ -0,0 +1,117 @@ + [ + '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', User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..d7eec61 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,136 @@ + 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", "storage", "octane", + | "session", "failover", "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'), + ], + + 'storage' => [ + 'driver' => 'storage', + 'disk' => env('CACHE_STORAGE_DISK'), + 'path' => env('CACHE_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', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + + /* + |-------------------------------------------------------------------------- + | Serializable Classes + |-------------------------------------------------------------------------- + | + | This value determines the classes that can be unserialized from cache + | storage. By default, no PHP classes will be unserialized from your + | cache to prevent gadget chain attacks if your APP_KEY is leaked. + | + */ + + 'serializable_classes' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..abbb88e --- /dev/null +++ b/config/database.php @@ -0,0 +1,184 @@ + 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, + 'transaction_mode' => 'DEFERRED', + ], + + '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([ + 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([ + 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' => env('DB_SSLMODE', 'prefer'), + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + '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'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..6cfdfb3 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => rtrim((string) env('APP_URL', 'http://localhost'), '/').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/fortify.php b/config/fortify.php new file mode 100644 index 0000000..cedebce --- /dev/null +++ b/config/fortify.php @@ -0,0 +1,177 @@ + 'web', + + /* + |-------------------------------------------------------------------------- + | Fortify Password Broker + |-------------------------------------------------------------------------- + | + | Here you may specify which password broker Fortify can use when a user + | is resetting their password. This configured value should match one + | of your password brokers setup in your "auth" configuration file. + | + */ + + 'passwords' => 'users', + + /* + |-------------------------------------------------------------------------- + | Username / Email + |-------------------------------------------------------------------------- + | + | This value defines which model attribute should be considered as your + | application's "username" field. Typically, this might be the email + | address of the users but you are free to change this value here. + | + | Out of the box, Fortify expects forgot password and reset password + | requests to have a field named 'email'. If the application uses + | another name for the field you may define it below as needed. + | + */ + + 'username' => 'email', + + 'email' => 'email', + + /* + |-------------------------------------------------------------------------- + | Lowercase Usernames + |-------------------------------------------------------------------------- + | + | This value defines whether usernames should be lowercased before saving + | them in the database, as some database system string fields are case + | sensitive. You may disable this for your application if necessary. + | + */ + + 'lowercase_usernames' => true, + + /* + |-------------------------------------------------------------------------- + | Home Path + |-------------------------------------------------------------------------- + | + | Here you may configure the path where users will get redirected during + | authentication or password reset when the operations are successful + | and the user is authenticated. You are free to change this value. + | + */ + + 'home' => '/dashboard', + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Prefix / Subdomain + |-------------------------------------------------------------------------- + | + | Here you may specify which prefix Fortify will assign to all the routes + | that it registers with the application. If necessary, you may change + | subdomain under which all of the Fortify routes will be available. + | + */ + + 'prefix' => '', + + 'domain' => null, + + /* + |-------------------------------------------------------------------------- + | Fortify Routes Middleware + |-------------------------------------------------------------------------- + | + | Here you may specify which middleware Fortify will assign to the routes + | that it registers with the application. If necessary, you may change + | these middleware but typically this provided default is preferred. + | + */ + + 'middleware' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Rate Limiting + |-------------------------------------------------------------------------- + | + | By default, Fortify will throttle logins to five requests per minute for + | every email and IP address combination. However, if you would like to + | specify a custom rate limiter to call then you may specify it here. + | + */ + + 'limiters' => [ + 'login' => 'login', + 'two-factor' => 'two-factor', + 'passkeys' => 'passkeys', + ], + + /* + |-------------------------------------------------------------------------- + | Register View Routes + |-------------------------------------------------------------------------- + | + | Here you may specify if the routes returning views should be disabled as + | you may not need them when building your own application. This may be + | especially true if you're writing a custom single-page application. + | + */ + + 'views' => true, + + /* + |-------------------------------------------------------------------------- + | Passkeys + |-------------------------------------------------------------------------- + | + | These settings configure Fortify's passkey (WebAuthn) support. + | + */ + + 'passkeys' => [ + 'relying_party_id' => parse_url(config('app.url'), PHP_URL_HOST), + 'allowed_origins' => [config('app.url')], + 'user_handle_secret' => env('PASSKEYS_USER_HANDLE_SECRET', config('app.key')), + 'timeout' => 60000, + ], + + /* + |-------------------------------------------------------------------------- + | Features + |-------------------------------------------------------------------------- + | + | Some of the Fortify features are optional. You may disable the features + | by removing them from this array. You're free to only remove some of + | these features, or you can even remove all of these if you need to. + | + */ + + 'features' => [ + Features::registration(), + Features::resetPasswords(), + Features::emailVerification(), + Features::twoFactorAuthentication([ + 'confirm' => true, + 'confirmPassword' => true, + // 'window' => 0 + ]), + Features::passkeys([ + 'confirmPassword' => true, + ]), + ], + +]; diff --git a/config/inertia.php b/config/inertia.php new file mode 100644 index 0000000..70f6b9b --- /dev/null +++ b/config/inertia.php @@ -0,0 +1,70 @@ + [ + 'enabled' => true, + 'url' => 'http://127.0.0.1:13714', + // 'bundle' => base_path('bootstrap/ssr/ssr.mjs'), + + ], + + /* + |-------------------------------------------------------------------------- + | Pages + |-------------------------------------------------------------------------- + | + | These options configure how Inertia discovers page components on the + | filesystem. The paths and extensions are used to locate components + | when rendering responses and during testing assertions. + | + */ + + 'pages' => [ + + 'paths' => [ + resource_path('js/pages'), + ], + + 'extensions' => [ + 'js', + 'jsx', + 'svelte', + 'ts', + 'tsx', + 'vue', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Testing + |-------------------------------------------------------------------------- + | + | The values described here are used to locate Inertia components on the + | filesystem. For instance, when using `assertInertia`, the assertion + | attempts to locate the component as a file relative to the paths. + | + */ + + 'testing' => [ + + 'ensure_pages_exist' => true, + + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..97bdc03 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,140 @@ + 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", "monthly", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'max_files' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'monthly' => [ + 'driver' => 'monthly', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'max_files' => 3, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..e32e88d --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/config/queue.php @@ -0,0 +1,129 @@ + 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", + | "deferred", "background", "failover", "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, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..ec226a4 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..e0c0eac --- /dev/null +++ b/config/session.php @@ -0,0 +1,233 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) 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 without 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), + + /* + |-------------------------------------------------------------------------- + | Session Serialization + |-------------------------------------------------------------------------- + | + | This value controls the serialization strategy for session data, which + | is JSON by default. Setting this to "php" allows the storage of PHP + | objects in the session but can make an application vulnerable to + | "gadget chain" serialization attacks if the APP_KEY is leaked. + | + | Supported: "json", "php" + | + */ + + 'serialization' => 'json', + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..98825c8 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,60 @@ + + */ +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), + 'two_factor_secret' => null, + 'two_factor_recovery_codes' => null, + 'two_factor_confirmed_at' => null, + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } + + /** + * Indicate that the model has two-factor authentication configured. + */ + public function withTwoFactor(): static + { + return $this->state(fn (array $attributes) => [ + 'two_factor_secret' => encrypt('secret'), + 'two_factor_recovery_codes' => encrypt(json_encode(['recovery-code-1'])), + 'two_factor_confirmed_at' => now(), + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..06dc7a5 --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->bigInteger('expiration')->index(); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->bigInteger('expiration')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..edac6fe --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,59 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedSmallInteger('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->string('connection'); + $table->string('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + + $table->index(['connection', 'queue', 'failed_at']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2024_01_01_000000_create_passkeys_table.php b/database/migrations/2024_01_01_000000_create_passkeys_table.php new file mode 100644 index 0000000..cb884c3 --- /dev/null +++ b/database/migrations/2024_01_01_000000_create_passkeys_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->string('credential_id')->unique(); + $table->json('credential'); + $table->timestamp('last_used_at')->nullable(); + $table->timestamps(); + + $table->index('user_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('passkeys'); + } +}; diff --git a/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php new file mode 100644 index 0000000..187d974 --- /dev/null +++ b/database/migrations/2025_08_14_170933_add_two_factor_columns_to_users_table.php @@ -0,0 +1,34 @@ +text('two_factor_secret')->after('password')->nullable(); + $table->text('two_factor_recovery_codes')->after('two_factor_secret')->nullable(); + $table->timestamp('two_factor_confirmed_at')->after('two_factor_recovery_codes')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn([ + 'two_factor_secret', + 'two_factor_recovery_codes', + 'two_factor_confirmed_at', + ]); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..6b901f8 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,25 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6d58f4e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6550 @@ +{ + "name": "probindo-web", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@inertiajs/react": "^3.0.0", + "@inertiajs/vite": "^3.0.0", + "@laravel/passkeys": "^0.2.0", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@tailwindcss/vite": "^4.1.11", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "concurrently": "^10.0.3", + "input-otp": "^1.4.2", + "laravel-vite-plugin": "^3.0.0", + "lucide-react": "^0.475.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sonner": "^2.0.0", + "tailwind-merge": "^3.0.1", + "tailwindcss": "^4.0.0", + "tw-animate-css": "^1.4.0", + "typescript": "^5.7.2", + "vite": "^8.0.0" + }, + "devDependencies": { + "@laravel/vite-plugin-wayfinder": "^0.1.3", + "@rolldown/plugin-babel": "^0.2.3", + "@types/node": "^22.13.5", + "babel-plugin-react-compiler": "^1.0.0", + "vite-plus": "0.3.0" + }, + "optionalDependencies": { + "@laravel/multiplex": "^0.4.1", + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "@tailwindcss/oxide-win32-x64-msvc": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1", + "lightningcss-win32-x64-msvc": "^1.29.1" + } + }, + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.3.0.tgz", + "integrity": "sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@babel/code-frame": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0-rc.4.tgz", + "integrity": "sha512-IKAasu/lBZl6mw5HlYCabqi7jGe5cPr9LhnQNf1YH5PWpeWAgchzwzi+siTBbnKEfw4WeSn2OOmDzHklg/Pz9Q==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^8.0.0-rc.4", + "js-tokens": "^10.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0-rc.4.tgz", + "integrity": "sha512-0bCEZ+LmwXRVvkKuxYirgkFq2dMFAs3WyxVtDnOE1djnS6BnyIP0Gym4oC3JKMY8es8U3dgBdKKxAsA+pJJcYg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/core": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.0-rc.4.tgz", + "integrity": "sha512-VhCk07qH2rgkEW6rdOI8nlRd359a+TdnxXqsl3cynjtvkxbdbHVaW+3NUt+BXv4IYy6tjjZihPo5PWg65c7EJQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^8.0.0-rc.4", + "@babel/generator": "^8.0.0-rc.4", + "@babel/helper-compilation-targets": "^8.0.0-rc.4", + "@babel/helpers": "^8.0.0-rc.4", + "@babel/parser": "^8.0.0-rc.4", + "@babel/template": "^8.0.0-rc.4", + "@babel/traverse": "^8.0.0-rc.4", + "@babel/types": "^8.0.0-rc.4", + "@types/gensync": "^1.0.0", + "convert-source-map": "^2.0.0", + "gensync": "^1.0.0-beta.2", + "import-meta-resolve": "^4.2.0", + "json5": "^2.2.3", + "obug": "^2.1.1", + "semver": "^7.7.3" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + }, + "peerDependencies": { + "@babel/preset-typescript": "^8.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/preset-typescript": { + "optional": true + } + } + }, + "node_modules/@babel/generator": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.4.tgz", + "integrity": "sha512-YZ+FuIgkj7KrIb2a2X1XiY0QYgDxAbVbYP64SjwJzOK3euCsUerzenh2oqdsmKuPSlhzmFOOklnxzHAzXagvpw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^8.0.0-rc.4", + "@babel/types": "^8.0.0-rc.4", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0-rc.4.tgz", + "integrity": "sha512-pGB7/0uJCdPwKVFd0t3w7S0lN63/V8b20tn5QgdiWYizyTb648hYTyotNYuoHU7HxrQl2FS1ItlJiThzHuE86Q==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^8.0.0-rc.4", + "@babel/helper-validator-option": "^8.0.0-rc.4", + "browserslist": "^4.24.0", + "lru-cache": "^7.14.1", + "semver": "^7.7.3" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0-rc.4.tgz", + "integrity": "sha512-gpEp45D4E60hUci5mWeQF9YNisMFaBg9lFsFzx/5qwRL3wbXv6z8/aOeaclec68RqxE9bv3SG7gP2wypyHBbSg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.4.tgz", + "integrity": "sha512-dluR3v287dp6YPF57kyKKrHPKffUeuxH1zQcF1WD30TeFzWXhDiVi1U6PkqaDB0++H1PeCwRhmYl4DvoerlPIw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.4.tgz", + "integrity": "sha512-HTD3bskipk5MSm08twTW6832jzIXUhxMddy4NPPzIMuyMEsrs0ZgwAaMj5ubB5+6hMlUjDu17vNconEmwsmpYg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0-rc.4.tgz", + "integrity": "sha512-OFognYIXIr2hlubLRUohiFcj6c74CT4fL+j23v3tH/I2y/XA+jWN+v+V0jeFZ1dx0oG+CRfhgNjz75F9d6BFyw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/helpers": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0-rc.4.tgz", + "integrity": "sha512-4h9FSYm3mhyM72Lj7pUKygzqN/3/ptKY30ThccjQL7pi5VKSsgjDJMkoguhJJgI8fY+ZS37Jqd/iKtFHBoRIHg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^8.0.0-rc.4", + "@babel/types": "^8.0.0-rc.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/parser": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.4.tgz", + "integrity": "sha512-0S/1yefMa15N4i2v3t8Fw9pgMHhf2gF6Lc1UEXI96Ls6FNAjqvHHZouZ2ZS/deqLhbMFtmfVeFac6iTsvFbLwA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^8.0.0-rc.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0-rc.4.tgz", + "integrity": "sha512-9DXoBFgYSIhNbzx0SxVrS2oWd19YNgFY3l0HN0kVMiJvg123CKSrvbX4TkN51yAn9B1BPo9JxzCX2BtR1LMsiA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^8.0.0-rc.4", + "@babel/parser": "^8.0.0-rc.4", + "@babel/types": "^8.0.0-rc.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/traverse": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.0-rc.4.tgz", + "integrity": "sha512-IoC3txfExDHZf6YnDeTty4jXSorZI5zBZbPRXqJWtZOEdTDdC6RP5gWAasb6el8UBN7Y/Lp39UZcU05BopJ28Q==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^8.0.0-rc.4", + "@babel/generator": "^8.0.0-rc.4", + "@babel/helper-globals": "^8.0.0-rc.4", + "@babel/parser": "^8.0.0-rc.4", + "@babel/template": "^8.0.0-rc.4", + "@babel/types": "^8.0.0-rc.4", + "obug": "^2.1.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/types": { + "version": "8.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.4.tgz", + "integrity": "sha512-bw30DV880P/VYtsjWWdoWmJpb9S2Vn1/PqayyccTELzRQ/HslIO7+BD9rNoZ4AAFOAjC1vrNeBCkAsyh6Ibfww==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^8.0.0-rc.4", + "@babel/helper-validator-identifier": "^8.0.0-rc.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@inertiajs/core": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-3.7.0.tgz", + "integrity": "sha512-JzysXTPsOpKcnR7ohwpgKE+UWBrKwW7z23DydWHSxjfQ02tJAKmNnZJAxnX7zH3zUSTqbtPge6QC8XhvfjNXmw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "es-toolkit": "^1.33.0", + "laravel-precognition": "^2.0.0" + }, + "peerDependencies": { + "axios": "^1.15.2" + }, + "peerDependenciesMeta": { + "axios": { + "optional": true + } + } + }, + "node_modules/@inertiajs/react": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-3.7.0.tgz", + "integrity": "sha512-rc/TsVT7ihDk+cMeCuU3BjdUfTq6HJwXqGy7oPaysLQCeyfhIaP2QgExo5R1QSCFIwl9un0MeZnzTOG+i38jLw==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "3.7.0", + "es-toolkit": "^1.33.0", + "laravel-precognition": "^2.0.0" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, + "node_modules/@inertiajs/vite": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@inertiajs/vite/-/vite-3.7.0.tgz", + "integrity": "sha512-eoOqvIEgmsktC/b5NuZjsj3VvCJ7GsbvHFN2IgT/7DXjLVdXGygWeyYHmS57AGSbb6yOyebeBR6cYkk6YyHOmg==", + "license": "MIT", + "dependencies": { + "@inertiajs/core": "3.7.0", + "tinyglobby": "^0.2.15" + }, + "peerDependencies": { + "vite": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@laravel/multiplex": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@laravel/multiplex/-/multiplex-0.4.3.tgz", + "integrity": "sha512-jJTZGgKl6sK0ETYmqiPqeAwmErvqjxgDRLfzqsmqiWiupc5dfjaoVVrrdXZwb6eGylSg99WwHLibCPJs8F0bGw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "ansi-styles": "^6.2.3", + "commander": "^15.0.0", + "ink": "^7.1.0", + "react": "^19.2.7", + "string-width": "^8.2.2", + "wrap-ansi": "^10.0.0" + }, + "bin": { + "multiplex": "dist/cli.js" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/@laravel/passkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@laravel/passkeys/-/passkeys-0.2.0.tgz", + "integrity": "sha512-K+owv26weKrYaoTJutqU40UsJZpwYkqB9jdlz5Bv/C54nxj2+Py9jbVwxASWg21fLsPhn3ngPKZE5RnfakCQKg==", + "license": "MIT", + "dependencies": { + "@simplewebauthn/browser": "^13.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "svelte": "^5.0.0", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@laravel/vite-plugin-wayfinder": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@laravel/vite-plugin-wayfinder/-/vite-plugin-wayfinder-0.1.10.tgz", + "integrity": "sha512-59ZCMCEeC1UcZkqbvn+G06C4D0C/jCm525gTft7T7RPAo+0ZaHtoKl9r86OFVFd/BwuJiOYky4zJUrAPRKyRaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/runtime": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.146.0.tgz", + "integrity": "sha512-lbXHIpZ1MmK6zuw5txlMdIZ2waLVUIU5Gnm3sEuwJOiqDfQfbtjeHscatmeBoxbv8+If9LFM6PGh/3DcDWYIYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", + "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.64.0.tgz", + "integrity": "sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.64.0.tgz", + "integrity": "sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.64.0.tgz", + "integrity": "sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.64.0.tgz", + "integrity": "sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.64.0.tgz", + "integrity": "sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.64.0.tgz", + "integrity": "sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.64.0.tgz", + "integrity": "sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.64.0.tgz", + "integrity": "sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.64.0.tgz", + "integrity": "sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.64.0.tgz", + "integrity": "sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.64.0.tgz", + "integrity": "sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.64.0.tgz", + "integrity": "sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.64.0.tgz", + "integrity": "sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.64.0.tgz", + "integrity": "sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.64.0.tgz", + "integrity": "sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.64.0.tgz", + "integrity": "sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.64.0.tgz", + "integrity": "sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.64.0.tgz", + "integrity": "sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.64.0.tgz", + "integrity": "sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint-tsgolint/darwin-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2001.tgz", + "integrity": "sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint-tsgolint/darwin-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2001.tgz", + "integrity": "sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint-tsgolint/linux-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2001.tgz", + "integrity": "sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint-tsgolint/linux-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2001.tgz", + "integrity": "sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint-tsgolint/win32-arm64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2001.tgz", + "integrity": "sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint-tsgolint/win32-x64": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2001.tgz", + "integrity": "sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.79.0.tgz", + "integrity": "sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.79.0.tgz", + "integrity": "sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.79.0.tgz", + "integrity": "sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.79.0.tgz", + "integrity": "sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.79.0.tgz", + "integrity": "sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.79.0.tgz", + "integrity": "sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.79.0.tgz", + "integrity": "sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.79.0.tgz", + "integrity": "sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.79.0.tgz", + "integrity": "sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.79.0.tgz", + "integrity": "sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.79.0.tgz", + "integrity": "sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.79.0.tgz", + "integrity": "sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.79.0.tgz", + "integrity": "sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.79.0.tgz", + "integrity": "sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.79.0.tgz", + "integrity": "sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.79.0.tgz", + "integrity": "sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.79.0.tgz", + "integrity": "sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.79.0.tgz", + "integrity": "sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.79.0.tgz", + "integrity": "sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/plugins": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/@oxlint/plugins/-/plugins-1.79.0.tgz", + "integrity": "sha512-S0uyoxakDINJ4DPgqxGlEEvrdSMeQb7Z2lKVjxoY2gwsbZbfg2Xr8Klfeo5ZeraHmmdBCELFUHkSe6KEmBpMvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.15.tgz", + "integrity": "sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", + "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", + "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", + "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", + "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", + "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", + "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", + "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", + "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/plugin-babel": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.3.tgz", + "integrity": "sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=22.12.0 || ^24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.29.0 || ^8.0.0-rc.1", + "@babel/plugin-transform-runtime": "^7.29.0 || ^8.0.0-rc.1", + "@babel/runtime": "^7.27.0 || ^8.0.0-rc.1", + "rolldown": "^1.0.0-rc.5", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@babel/plugin-transform-runtime": { + "optional": true + }, + "@babel/runtime": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", + "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simplewebauthn/browser": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.3.0.tgz", + "integrity": "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@testing-library/dom/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@testing-library/dom/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.7", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.7.tgz", + "integrity": "sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/gensync": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.5.tgz", + "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/@vitest/browser": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.11.tgz", + "integrity": "sha512-bwMovvAeuTFOK5kIFevw4VEf+1gVEICv4SYK4k3knJOxl6b1zEWud8mYKD73e1B0odAn174h1MofURy2TPWf3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.11", + "@vitest/utils": "4.1.11", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.1.0", + "ws": "^8.19.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.11" + } + }, + "node_modules/@vitest/browser-preview": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/browser-preview/-/browser-preview-4.1.11.tgz", + "integrity": "sha512-iPKSE6Ibayey6HFgK1V1/aHgyhx7HSRk1YMi+lnBZGmlIiNV5Uc7xRkD9Su8RDylTxDECK23t7kTHdRKoqSYDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@testing-library/dom": "^10.4.1", + "@testing-library/user-event": "^14.6.1", + "@vitest/browser": "4.1.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.11" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.11", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.11", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@voidzero-dev/vite-plus-core": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-core/-/vite-plus-core-0.3.0.tgz", + "integrity": "sha512-aOqoqIWaF+Q/geDU48pC2rVFEVSvLV1GGj/NdvhUiBhCZntoFNbwI+hjUeG8BMaPG67sOV6ey+/sgkdmGmKqaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "=0.146.0", + "@oxc-project/types": "=0.146.0", + "lightningcss": "^1.33.0", + "postcss": "^8.5.6", + "yuku-codegen": "^0.5.44", + "yuku-parser": "^0.5.44" + }, + "engines": { + "node": "^20.19.0 || ^22.18.0 || >=24.11.0" + }, + "optionalDependencies": { + "@voidzero-dev/vite-plus-darwin-arm64": "0.3.0", + "@voidzero-dev/vite-plus-darwin-x64": "0.3.0", + "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.3.0", + "@voidzero-dev/vite-plus-linux-arm64-musl": "0.3.0", + "@voidzero-dev/vite-plus-linux-x64-gnu": "0.3.0", + "@voidzero-dev/vite-plus-linux-x64-musl": "0.3.0", + "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.3.0", + "@voidzero-dev/vite-plus-win32-x64-msvc": "0.3.0", + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "publint": "^0.3.8", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": "^0.5.0", + "unrun": "*", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "publint": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-core/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@voidzero-dev/vite-plus-darwin-arm64": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-darwin-arm64/-/vite-plus-darwin-arm64-0.3.0.tgz", + "integrity": "sha512-9ADr1egZ8T4tJOqrpQLhoDl95Y74R95+bsvjmin0gy1C0eQVhpmcNnBfb07KFNhJioJp9MMO7F7Dx4fQL5SKsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-darwin-x64": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-darwin-x64/-/vite-plus-darwin-x64-0.3.0.tgz", + "integrity": "sha512-GegasVCwNeDOkNyvhLOuwU1+T2JkjY/Tq+SOvwphUpVcqQ6OOAUq9LlpoXviO2QL/Kq2NbMYjiAfPKVSTLUFQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-linux-arm64-gnu": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-linux-arm64-gnu/-/vite-plus-linux-arm64-gnu-0.3.0.tgz", + "integrity": "sha512-nYI3KNYXkXjRPsSdR4Lr7J2xMxfR1+TplWlG/dV37qVXWAjbyHpoAlbULjZBAVJMyXRNlcADhBrEwXe4g6s48A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-linux-arm64-musl": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-linux-arm64-musl/-/vite-plus-linux-arm64-musl-0.3.0.tgz", + "integrity": "sha512-HRlVA3AOcuGXmOdHhQ+Zv5XAaKbYF9si5rRHoOsKl0UyBo4txA3OoJfmP0WjanfLUNmu85JyO2dO1ptL4C6wgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-linux-x64-gnu": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-linux-x64-gnu/-/vite-plus-linux-x64-gnu-0.3.0.tgz", + "integrity": "sha512-9A+dFScPfwcrzF/rRR0zH8++2hOf6xtFmN/5LyzyfUywtw9MILXcC72IMcOeL6QRJwKUMsudi1rFeDE59azNvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-linux-x64-musl": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-linux-x64-musl/-/vite-plus-linux-x64-musl-0.3.0.tgz", + "integrity": "sha512-KfIV3qaPdaOOE8JQMRHRE34FtZocl9O86XLTP6JMjDUlcx8FPgf8/fz/HFqJ8g232vM+JsgLI/YTVeXP8LkTKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-win32-arm64-msvc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-win32-arm64-msvc/-/vite-plus-win32-arm64-msvc-0.3.0.tgz", + "integrity": "sha512-KRhdy5K13AYx9KBfCVHRrK7zSZU+bMW9CL6gTai+UkJgAmDJi1kjdSNboZOjO8mrzUnTCrELgMI2tnstcxSTuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@voidzero-dev/vite-plus-win32-x64-msvc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@voidzero-dev/vite-plus-win32-x64-msvc/-/vite-plus-win32-x64-msvc-0.3.0.tgz", + "integrity": "sha512-7+G+GxGmxdpQO0zjiGnkZFXKGqm0CrVduebRsJd6ccuOuxCQYPxLcoHq4WOaGrh56SrAGS7XjhnQCrXRkzKUVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@yuku-codegen/binding-darwin-arm64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.5.48.tgz", + "integrity": "sha512-yo96Oef12WzqnphInfz/eexVse3+kWgfGS5g2S3rFS3dcGn1ENW9xLFDZUP9rh+yP76DOq38wBoFi1+I9+6qBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-darwin-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-x64/-/binding-darwin-x64-0.5.48.tgz", + "integrity": "sha512-aRCTw0EZC4bVosmw//0OMYP5tGWFE0Cu5yUBFkUbhXx/iBzvORcJ2xPNlOp/vtCCo9Ys4vp8b0DigJV6uOVb2g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-freebsd-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-freebsd-x64/-/binding-freebsd-x64-0.5.48.tgz", + "integrity": "sha512-CA0AQAEApDkbw51PdLWMtKPJ41/7rvXsS3SJs+phG7fHJI+MuFzWuLbkucZfZoEOiDscmcsfYIdgL8BsfuyKKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.48.tgz", + "integrity": "sha512-DuSQlk8bH4gpmW3/00P0NLagAcMv8jOxjT40cQmxKRkktr+SUOALCfkT89tdDq3qtY95NR2GXOZ7AjNh7KKqCw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.48.tgz", + "integrity": "sha512-bxj4Ee+wlaJcWJwft2ReJXWw5sfl1qavDz6+dlRdU1xfTEtjPSNiAWhiCHnJR0R4Ygd57DnzSQmAVGvFv6RcGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.48.tgz", + "integrity": "sha512-mk5JVWh+0JOe5ue8k17kbYX8uGBoKt3ZqoCyxNh4nYAAcX7+X1tFUiU7jbjctu4vHeejCBFSTdQ021+V31cUCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.48.tgz", + "integrity": "sha512-4q3vkrNghbllyxOm2KesFLxCPKHF7r3JyQ7BWZccY1j2Y05yKoIFhoWCqIuQ2W/dpte9RI0+OVfwyxnrKg6fkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.48.tgz", + "integrity": "sha512-csd4M1EVrGaohM8acM6gq1zpUA/Rwe2ulUMBKUcwQXm/k6n7cq1A++qdew78SOVb4do3JH1WE+WFwoGQAcWc1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.48.tgz", + "integrity": "sha512-KcDuEOT+GFoVKdvAWOv1v9iYjwnmvMZlO+j1Rw+5PYdeFLGWGzv/DD11y4SAAdwXIFcil4T0hibeIaF82WStMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-win32-arm64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-arm64/-/binding-win32-arm64-0.5.48.tgz", + "integrity": "sha512-HI8qNrI8dWM5BuqIMKsqornRvTNFrE6sm5zToIJ9YIa9zt5+29P7fJ7Nr39EVf6dAWSb6q7JSpScJnRsQ+FgZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-codegen/binding-win32-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-x64/-/binding-win32-x64-0.5.48.tgz", + "integrity": "sha512-X5YWJLO6EfBZpeBqO0AYESnUizbpFDWArcvVD61w0PEWQ3CaFRLnbQXs+kpM4ZZfGMfIE22zfA08QSY67q7TNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-darwin-arm64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.5.48.tgz", + "integrity": "sha512-If8mb7HH3vqghJ2NNZ8SuHfhsnjVzOxJpB8xcNOXS5WjYrs2mUhHIh5KOIvK13hDOzh0htGeGK3A6MsiEqE7HQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-darwin-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-x64/-/binding-darwin-x64-0.5.48.tgz", + "integrity": "sha512-EimvPXfspzxf1K11eB6tCW5oiQEXB8g84T2wP1TwzQagdDKo33bkmmVF0B32vTIpXnk/Ifu5IB61izZ1MylljA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-freebsd-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.5.48.tgz", + "integrity": "sha512-0GcUMrumLHheThY9r5Tp46gaZYzn0irWPS1Zba6WY+vVQfhUtzGiWgXxI6tuXX0N32kEaaEVRpkKctvo6Kx3aQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.5.48.tgz", + "integrity": "sha512-8S5T5wjCC73dmmpQeZ49aYsSunIUM3D4Fc6rdK96c+Ayg/p3FmeSPF3xuLZHejcTmqJIIvnbfPlUF+rB6DITjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-musl/-/binding-linux-arm-musl-0.5.48.tgz", + "integrity": "sha512-tTmbxvnUHcK2/crS9547vk2SMmsajH1yqJ8ltXhIuHJgqR1v+d9n9KT+kSayo/5CS76LegeYxhMFjEivBH2hFA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.5.48.tgz", + "integrity": "sha512-KGYCBMqI2zfwyhgq5tpPVNe7jpUeYTBm8DhjdS+zqWNumde/PEC170QE5RHxcOAlsirIDeIUk0jqx+r/axoFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.5.48.tgz", + "integrity": "sha512-2wTSMsCSXLTc2lZUjMAuU5X4cje55u205WJqfV5NWNF6j9pW/tXyxr15dJeekj8ziLqBXzIsj4DbRh4sY/WcjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-gnu": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.5.48.tgz", + "integrity": "sha512-d/6v9UnGglVu1WC2JQyv/5aWSi5fXZeGSlidCfmHp4+N65N1GDKUnFtys5MK5eAPeAjTgSHGGtOc/yCcKTlv3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-musl": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.5.48.tgz", + "integrity": "sha512-gX19gw6u4ApPy7SYMPKfFlEkrtj6WlORvrTKK3sBQqjyV+8+mUAkQgxXNjHw4RnOiAmVYg7TOlZcg8d+Qqod9A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-win32-arm64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-arm64/-/binding-win32-arm64-0.5.48.tgz", + "integrity": "sha512-w6cQQLbqj3Jcom5Q7ifm103NUOQ9d+Cb4VU5lkrZDjMnwVJ9Hzzg1vCQR7miJuF44vhCXldbme5UryE3giEKlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-win32-x64": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-x64/-/binding-win32-x64-0.5.48.tgz", + "integrity": "sha512-4gO0HmG7fzFxrw1rs0dUdnnaY9YgennjETqDWrTSp7x9fmTUOAoN4VsMfP7YyliQeG1WJJHc55O+rOhmsLppow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.5.43.tgz", + "integrity": "sha512-kSpvPntnXw5+lYjO71ffBEnQ5ycQ74KGIYknh0TS4xeyCuBkOqxyJumxZkMhLBBUCLjDAbx2+Icnr3Zh4ftjpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "license": "MIT", + "optional": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/babel-plugin-react-compiler/node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-react-compiler/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-plugin-react-compiler/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-boxes": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-4.0.1.tgz", + "integrity": "sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18.20 <19 || >=20.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "optional": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.1.1.tgz", + "integrity": "sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^9.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "license": "MIT", + "optional": true, + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/commander": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/concurrently": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.5.tgz", + "integrity": "sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==", + "license": "MIT", + "dependencies": { + "chalk": "5.6.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "10.2.2", + "tree-kill": "1.2.2", + "yargs": "18.0.0" + }, + "bin": { + "conc": "dist/bin/index.js", + "concurrently": "dist/bin/index.js" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "devOptional": true, + "license": "ISC", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-toolkit": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-7.1.1.tgz", + "integrity": "sha512-Y43xxa1ZSPvpmfLHcN5o+OdP8Rf8ykkNJEuKYOUNZKT8wXVNLFTtEm1nSDMQkfBH+YANF4Xuu0hhZ4ejqAtN2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.3.0", + "ansi-escapes": "^7.3.0", + "ansi-styles": "^6.2.3", + "auto-bind": "^5.0.1", + "chalk": "^5.6.2", + "cli-boxes": "^4.0.1", + "cli-cursor": "^4.0.0", + "cli-truncate": "^6.0.0", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.45.1", + "indent-string": "^5.0.0", + "is-in-ci": "^2.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.33.0", + "scheduler": "^0.27.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^9.0.0", + "stack-utils": "^2.0.6", + "string-width": "^8.2.0", + "terminal-size": "^4.0.1", + "type-fest": "^5.5.0", + "widest-line": "^6.0.0", + "wrap-ansi": "^10.0.0", + "ws": "^8.20.0", + "yoga-layout": "~3.2.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@types/react": ">=19.2.0", + "react": ">=19.2.0", + "react-devtools-core": ">=6.1.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "node_modules/input-otp": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.5.0.tgz", + "integrity": "sha512-3AcfdW1sNG0FmSA5hHMBXG7jNW5CdcdKs8ln8JOmn6S2SRkoXoJx+2UwC+ZvjflfnOdHJx0SfQ9/YjlxVYLtGQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-in-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", + "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", + "license": "MIT", + "optional": true, + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "devOptional": true, + "license": "MIT", + "peer": true + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "devOptional": true, + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/laravel-precognition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/laravel-precognition/-/laravel-precognition-2.0.0.tgz", + "integrity": "sha512-dmA4HGc9m+TsVNsJs9/XQBI8u6j7coilN+qKkBuhuXQzH3HypwS/c5dFQ4UqUGjBbcxIM7zdk91kM/SRZwIvWQ==", + "license": "MIT", + "dependencies": { + "es-toolkit": "^1.32.0" + }, + "peerDependencies": { + "axios": "^1.4.0" + }, + "peerDependenciesMeta": { + "axios": { + "optional": true + } + } + }, + "node_modules/laravel-vite-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-3.2.0.tgz", + "integrity": "sha512-xSxY9Gzeb/eancd8WeK09piAFP+a6i5QIBqNCKNv9L0Eq6wziwzSem7F1GvMSrtjMh5F/QVKFxn8t9naGOA66A==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "tinyglobby": "^0.2.12", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "fontaine": "^0.8.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "fontaine": { + "optional": true + } + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "devOptional": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lucide-react": { + "version": "0.475.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", + "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "devOptional": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oxfmt": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.64.0.tgz", + "integrity": "sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinypool": "2.1.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/binding-android-arm-eabi": "0.64.0", + "@oxfmt/binding-android-arm64": "0.64.0", + "@oxfmt/binding-darwin-arm64": "0.64.0", + "@oxfmt/binding-darwin-x64": "0.64.0", + "@oxfmt/binding-freebsd-x64": "0.64.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.64.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.64.0", + "@oxfmt/binding-linux-arm64-gnu": "0.64.0", + "@oxfmt/binding-linux-arm64-musl": "0.64.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.64.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.64.0", + "@oxfmt/binding-linux-riscv64-musl": "0.64.0", + "@oxfmt/binding-linux-s390x-gnu": "0.64.0", + "@oxfmt/binding-linux-x64-gnu": "0.64.0", + "@oxfmt/binding-linux-x64-musl": "0.64.0", + "@oxfmt/binding-openharmony-arm64": "0.64.0", + "@oxfmt/binding-win32-arm64-msvc": "0.64.0", + "@oxfmt/binding-win32-ia32-msvc": "0.64.0", + "@oxfmt/binding-win32-x64-msvc": "0.64.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint": { + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.79.0.tgz", + "integrity": "sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.79.0", + "@oxlint/binding-android-arm64": "1.79.0", + "@oxlint/binding-darwin-arm64": "1.79.0", + "@oxlint/binding-darwin-x64": "1.79.0", + "@oxlint/binding-freebsd-x64": "1.79.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.79.0", + "@oxlint/binding-linux-arm-musleabihf": "1.79.0", + "@oxlint/binding-linux-arm64-gnu": "1.79.0", + "@oxlint/binding-linux-arm64-musl": "1.79.0", + "@oxlint/binding-linux-ppc64-gnu": "1.79.0", + "@oxlint/binding-linux-riscv64-gnu": "1.79.0", + "@oxlint/binding-linux-riscv64-musl": "1.79.0", + "@oxlint/binding-linux-s390x-gnu": "1.79.0", + "@oxlint/binding-linux-x64-gnu": "1.79.0", + "@oxlint/binding-linux-x64-musl": "1.79.0", + "@oxlint/binding-openharmony-arm64": "1.79.0", + "@oxlint/binding-win32-arm64-msvc": "1.79.0", + "@oxlint/binding-win32-ia32-msvc": "1.79.0", + "@oxlint/binding-win32-x64-msvc": "1.79.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/oxlint-tsgolint": { + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2001.tgz", + "integrity": "sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==", + "dev": true, + "license": "MIT", + "bin": { + "tsgolint": "bin/tsgolint.js" + }, + "optionalDependencies": { + "@oxlint-tsgolint/darwin-arm64": "7.0.2001", + "@oxlint-tsgolint/darwin-x64": "7.0.2001", + "@oxlint-tsgolint/linux-arm64": "7.0.2001", + "@oxlint-tsgolint/linux-x64": "7.0.2001", + "@oxlint-tsgolint/win32-arm64": "7.0.2001", + "@oxlint-tsgolint/win32-x64": "7.0.2001" + } + }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "license": "MIT", + "optional": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rolldown": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", + "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.148.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.7", + "@rolldown/binding-android-arm64": "1.2.7", + "@rolldown/binding-darwin-arm64": "1.2.7", + "@rolldown/binding-darwin-x64": "1.2.7", + "@rolldown/binding-freebsd-x64": "1.2.7", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", + "@rolldown/binding-linux-arm64-gnu": "1.2.7", + "@rolldown/binding-linux-arm64-musl": "1.2.7", + "@rolldown/binding-linux-ppc64-gnu": "1.2.7", + "@rolldown/binding-linux-s390x-gnu": "1.2.7", + "@rolldown/binding-linux-x64-gnu": "1.2.7", + "@rolldown/binding-linux-x64-musl": "1.2.7", + "@rolldown/binding-openharmony-arm64": "1.2.7", + "@rolldown/binding-win32-arm64-msvc": "1.2.7", + "@rolldown/binding-win32-x64-msvc": "1.2.7" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "devOptional": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/slice-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-9.0.0.tgz", + "integrity": "sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sonner": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz", + "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "optional": true, + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terminal-size": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz", + "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", + "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-fest": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", + "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", + "license": "(MIT OR CC0-1.0)", + "optional": true, + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plus": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vite-plus/-/vite-plus-0.3.0.tgz", + "integrity": "sha512-GNWbWuWD37frCSFrz6MLzUo62bTv5IOJozHEgZYOkxsLkuQtTwm4TowzpfoGrSsfwhAAtfPd/sK1Y0+v1SwhZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@oxlint/plugins": "=1.79.0", + "@vitest/browser": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "@voidzero-dev/vite-plus-core": "0.3.0", + "oxfmt": "=0.64.0", + "oxlint": "=1.79.0", + "oxlint-tsgolint": "=7.0.2001", + "vitest": "4.1.11" + }, + "bin": { + "oxfmt": "bin/oxfmt", + "oxlint": "bin/oxlint", + "vp": "bin/vp", + "vpr": "bin/vpr" + }, + "engines": { + "node": "^20.19.0 || ^22.18.0 || >=24.11.0" + }, + "optionalDependencies": { + "@voidzero-dev/vite-plus-darwin-arm64": "0.3.0", + "@voidzero-dev/vite-plus-darwin-x64": "0.3.0", + "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.3.0", + "@voidzero-dev/vite-plus-linux-arm64-musl": "0.3.0", + "@voidzero-dev/vite-plus-linux-x64-gnu": "0.3.0", + "@voidzero-dev/vite-plus-linux-x64-musl": "0.3.0", + "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.3.0", + "@voidzero-dev/vite-plus-win32-x64-msvc": "0.3.0" + }, + "peerDependencies": { + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11" + }, + "peerDependenciesMeta": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + } + } + }, + "node_modules/vite-plus/node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vitest": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-6.0.0.tgz", + "integrity": "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.1.tgz", + "integrity": "sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT", + "optional": true + }, + "node_modules/yuku-codegen": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.5.48.tgz", + "integrity": "sha512-p7HxD5Xl4jzDzqMrGePAOeSHmRY4g58h4HuGq15weQFPxuPWd/W6e7nqp/+Lea6JfpOdBwJOAyXFqIZ/J9Zfnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "0.5.43" + }, + "optionalDependencies": { + "@yuku-codegen/binding-darwin-arm64": "0.5.48", + "@yuku-codegen/binding-darwin-x64": "0.5.48", + "@yuku-codegen/binding-freebsd-x64": "0.5.48", + "@yuku-codegen/binding-linux-arm-gnu": "0.5.48", + "@yuku-codegen/binding-linux-arm-musl": "0.5.48", + "@yuku-codegen/binding-linux-arm64-gnu": "0.5.48", + "@yuku-codegen/binding-linux-arm64-musl": "0.5.48", + "@yuku-codegen/binding-linux-x64-gnu": "0.5.48", + "@yuku-codegen/binding-linux-x64-musl": "0.5.48", + "@yuku-codegen/binding-win32-arm64": "0.5.48", + "@yuku-codegen/binding-win32-x64": "0.5.48" + } + }, + "node_modules/yuku-parser": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.5.48.tgz", + "integrity": "sha512-OWBfhrpgK9+/4+IXG9oT8Bao4AhViQA7vdyNNH7EUg8dQYgwa70XtIBWTpCEme1P1ECyoDNYkn0wT63f8XRcVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "0.5.43" + }, + "optionalDependencies": { + "@yuku-parser/binding-darwin-arm64": "0.5.48", + "@yuku-parser/binding-darwin-x64": "0.5.48", + "@yuku-parser/binding-freebsd-x64": "0.5.48", + "@yuku-parser/binding-linux-arm-gnu": "0.5.48", + "@yuku-parser/binding-linux-arm-musl": "0.5.48", + "@yuku-parser/binding-linux-arm64-gnu": "0.5.48", + "@yuku-parser/binding-linux-arm64-musl": "0.5.48", + "@yuku-parser/binding-linux-x64-gnu": "0.5.48", + "@yuku-parser/binding-linux-x64-musl": "0.5.48", + "@yuku-parser/binding-win32-arm64": "0.5.48", + "@yuku-parser/binding-win32-x64": "0.5.48" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..48c3340 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "name": "probindo-web", + "private": true, + "type": "module", + "scripts": { + "build": "vp build", + "build:ssr": "vp build && vp build --ssr", + "dev": "vp dev", + "check": "vp check", + "check:fix": "vp check --fix", + "types:check": "tsc --noEmit" + }, + "dependencies": { + "@inertiajs/react": "^3.0.0", + "@inertiajs/vite": "^3.0.0", + "@laravel/passkeys": "^0.2.0", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@tailwindcss/vite": "^4.1.11", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "concurrently": "^10.0.3", + "input-otp": "^1.4.2", + "laravel-vite-plugin": "^3.0.0", + "lucide-react": "^0.475.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sonner": "^2.0.0", + "tailwind-merge": "^3.0.1", + "tailwindcss": "^4.0.0", + "tw-animate-css": "^1.4.0", + "typescript": "^5.7.2", + "vite": "^8.0.0" + }, + "devDependencies": { + "@laravel/vite-plugin-wayfinder": "^0.1.3", + "@rolldown/plugin-babel": "^0.2.3", + "@types/node": "^22.13.5", + "babel-plugin-react-compiler": "^1.0.0", + "vite-plus": "0.3.0" + }, + "optionalDependencies": { + "@laravel/multiplex": "^0.4.1", + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", + "@tailwindcss/oxide-win32-x64-msvc": "^4.0.1", + "lightningcss-linux-x64-gnu": "^1.29.1", + "lightningcss-win32-x64-msvc": "^1.29.1" + } +} diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..1ca23a4 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,13 @@ +includes: + - vendor/larastan/larastan/extension.neon + - vendor/nesbot/carbon/extension.neon + +parameters: + paths: + - app/ + - bootstrap/app.php + - config/ + - database/ + - routes/ + + level: 7 diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..e7f0a48 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,36 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + + diff --git a/pint.json b/pint.json new file mode 100644 index 0000000..93061b6 --- /dev/null +++ b/pint.json @@ -0,0 +1,3 @@ +{ + "preset": "laravel" +} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..3d4f451 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +packages: + - '.' + +publicHoistPattern: + - '@inertiajs/core' diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2efef6de4482ad4ec770787891fb3ab7f7b1f58 GIT binary patch literal 1662 zcmV-^27&pBP)40{{R3XI2D70000&P)t-s00030 zFd+XeApb8Q|1BW@E+GFcApbBR|1Kc^Eg=6bApb5P|1Kc^EFk|aApa~N|1BW@Eg=6e zApb5P|1BW@Eg&n7Ql0<+02OpnPE!CNzd)dXU=ZKm?|<)rkZ`ZhFmF)fpgb%900q`b zL_t(|+U%Oqj+-zLMaMYBBrGf>;s1ZNY7`jIiI_O8!Rm4!Tgf`>xtSR*$bTdkB!69t zVK_O-TcI8P=u%70x?P5+&ZXoke;#Hk@~pfohJ~`UXs9Q;_B2)gTk?{cvbc)et1K<* zr+Qaj9xAKsDzB#eYQpr7r@Sm0>dVCQfKCB0Kf{y|EP9n~<+TZwVye09V$sm9n9{PSY^C}VzXiE}GC#|%c)PWA z!&5y>`JP4VkDV6b8$Z_jJJu@A$QeFse^IT?qj=G4l>4y#(Kj|Guiq{iFk{=Fwl*76 z)xQ4|>IRkjy#1lI8JM_!yJWG>8ZJNf8dXXx zrk~GbPG4tWE+u0Q(BCgl#w@cPJ5nx)T9MuG26Ggy6OkTfT zvPjI^>P)^G7FA5^`aMfVOxu)|x2A9549ulPjgm!RI{t-}!yN(BSbnfZ0rTAmB^Yxa z0ShsC{k=0v223kLF@%7Hn5rZ4wL=GnpitveraoqSfe(_EIcO5du!CjnDf@wtxv3e z-u^bn6xYI{>k~_4b4*0{)`LMCWEV`GECi(~y~rMz#`428YDY}1JOdWj&DW^?F-Ib; zJl{lRfw{1#A0resWj2_y2v`;oie!a3x9HrIxnXL+G9OMEVvZJ7Q)Y@O(#)P#Gsb*Y zz6+8!=6Lpjd0-xx2j+o!U>=wU<`2TWpY@?U`fOKhgXs$-hQ`^*57T3Y7GFKsXEUm) zBmpLJD?F4LXCptnrod!)-s4>q&NlMH1ep8=0k2DW_S$RM1ei2s8;}?pXCpsMfQj(j zNDOf{^1}p}D=)N>81ii9hY2uO&CkS;XEQ%chDr0UB!)N}`C$S~^BV*vhRd^&A11-1 z`R$K=!+176!AgetySX#KX&8o~XtND<+Gs@?_dhEVl?dUf^KAF4`3KmZ#1o5M$8F`` z3P!Tl&&CLr3Ul6+|GA>4A2dj*!Zf~z9YX~DLkTA3XY8i74zs-cJ)DTceLfYYA-}08 zCfNm;#x)M#D5naO^M{f7;@Z>}U}BCre7ypnoy1IDM_|xHKkNy25-bsNjhURKb+p6ga^RJ>eNU6hI2E^Ow5A+W|JeZDC8Wqj7Y8Fr9@Uvc=cY`i& zDS4WCQI*lV*os&Gro@tzcjHTqy#y%$-R|Mc0;Z=P9R-{!<>DZ*bg~pkU*-o&W#<07*qo IM6N<$f;hnhc>n+a literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..236fadb94188e9189807c50aa8480b3070a0cc8d GIT binary patch literal 4286 zcmcJSYiv|S6vqb^Sj9>!kD_?#USEjFuB*k05m`ulKhQ)0{ZR3Nj~ES!#h9qrHiD>$ zFCbA83#r6d--z!Q-dZre@B@j4kBxrw(=r7ZdN&YYP!=ggUN z&s>a|z(3zN`fK`{jA=H;%m+kf8A$GajE&{z=dAJbc7mU^S=a@A(CVLujIm?&L%;DC zLe@6JdI;b*I0WCqqi~9wGmd_s)3`n7>{QyT;Y-k-FM>{Z23kR}*bD8AB1Y}dT<%4|D*yFG{ipz1dZ-md_9asjFVAL*Xjeow=eI@kwWU_SmSU;ft*cgCUqSjPbCwmKa-bR^DI`k=CZ?Ca;^-d5Ll<&7I3$q~lW zumU~>#c()c$ zznq=I*j4Zy`~=s7e6N}x_jxK`Zh-@E10+?J+sM~|@>qVCnUcYu{D&HP^q=+0M}32-cM_!3Ciyi+W;gJQ1O$7`Uq{%qEf zQ&BAEGXHHD1l564qg*VjMHc7h8MJr9F#HPgp`07>0%S*IU-OwO9s`}T@>+3T1B!b* zKArZ1un%4W-3_mTYTL(f9k{v?=^U+ny>m|ylSw>PH%q64pG5ofa4((kv;&-?dWdAkLy`uhG@CDoiOQ8?+ z9kmLbnp3s^M6T<5NBhy**WqFab58X;{Fc}ICS9`EhD_t_k?aMYs+oF+X2x}$w)C!s zub>y+giUTd`u=o2$VPbg%w}A5K=FGP&VnVNeaN?!pjv4BMJ}c{)BXz-le3+UDBqmk zP^aQH6SlzLumSXcGEJ%aDelxC<@f^F20w!KrQDna?i}Mq^k;zX6#3f)bNvO(k)BF^ zHzB_V0(cothr0F?dSz!aw81>*Q(|8=^W<+HdO$YTVt*Rwysv=|;RCn=q%&SVZcpiq z>|ITJ5A23ruovR@SbG{bo3)A(@mAf`d#C(4&3${+iCyjbvGi?Vt?lZx!zN>grl)PO zquU0hL7OTS3ys0yLdGmDv^2C7yp|~iFVkJ{(t`!Bd#K + + diff --git a/public/images/probindo/about-team.jpg b/public/images/probindo/about-team.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2b1548fe4bd32ff4684e4bdc57d78912401e810 GIT binary patch literal 40003 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
  • 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 O`FwL*^~$9{fB)I-);k&i literal 0 HcmV?d00001 diff --git a/public/images/probindo/clients-erp-dashboard.jpg b/public/images/probindo/clients-erp-dashboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d22bc1baeb404f74ec926db045b6e9c526f1bbde GIT binary patch literal 42315 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 literal 0 HcmV?d00001 diff --git a/public/images/probindo/clients-hero-bg.jpg b/public/images/probindo/clients-hero-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81bbb52b9bcee3ea4d763accc08975ad948ede18 GIT binary patch literal 38899 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
  • $H$Y=5&GfBEN#|cf; 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 literal 0 HcmV?d00001 diff --git a/public/images/probindo/industry-corporate.jpg b/public/images/probindo/industry-corporate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1b3541ac7f224dd0034f98e0c3764b815831d4e GIT binary patch literal 55369 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¥g#+jsER^^iiAeZO(OHVBP_}?5gBJ-jq%?Geq3@- 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 Nei-K6ST(&L|JesWfK&hg literal 0 HcmV?d00001 diff --git a/public/images/probindo/industry-logistics.jpg b/public/images/probindo/industry-logistics.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33ded74112a305845b8177887f453737b9c243be GIT binary patch literal 70416 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 + + + ); +} diff --git a/resources/js/components/app-content.tsx b/resources/js/components/app-content.tsx new file mode 100644 index 0000000..5a04c69 --- /dev/null +++ b/resources/js/components/app-content.tsx @@ -0,0 +1,22 @@ +import * as React from 'react'; +import { SidebarInset } from '@/components/ui/sidebar'; +import type { AppVariant } from '@/types'; + +type Props = React.ComponentProps<'main'> & { + variant?: AppVariant; +}; + +export function AppContent({ variant = 'sidebar', children, ...props }: Props) { + if (variant === 'sidebar') { + return {children}; + } + + return ( +
    + {children} +
    + ); +} diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx new file mode 100644 index 0000000..9338205 --- /dev/null +++ b/resources/js/components/app-header.tsx @@ -0,0 +1,248 @@ +import { Link, usePage } from '@inertiajs/react'; +import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; +import AppLogo from '@/components/app-logo'; +import AppLogoIcon from '@/components/app-logo-icon'; +import { Breadcrumbs } from '@/components/breadcrumbs'; +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + NavigationMenu, + NavigationMenuItem, + NavigationMenuList, + navigationMenuTriggerStyle, +} from '@/components/ui/navigation-menu'; +import { + Sheet, + SheetContent, + SheetHeader, + SheetTitle, + SheetTrigger, +} from '@/components/ui/sheet'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip'; +import { UserMenuContent } from '@/components/user-menu-content'; +import { useCurrentUrl } from '@/hooks/use-current-url'; +import { useInitials } from '@/hooks/use-initials'; +import { cn, toUrl } from '@/lib/utils'; +import { dashboard } from '@/routes'; +import type { BreadcrumbItem, NavItem } from '@/types'; + +type Props = { + breadcrumbs?: BreadcrumbItem[]; +}; + +const mainNavItems: NavItem[] = [ + { + title: 'Dashboard', + href: dashboard(), + icon: LayoutGrid, + }, +]; + +const rightNavItems: NavItem[] = [ + { + title: 'Repository', + href: 'https://github.com/laravel/react-starter-kit', + icon: Folder, + }, + { + title: 'Documentation', + href: 'https://laravel.com/docs/starter-kits#react', + icon: BookOpen, + }, +]; + +const activeItemStyles = + 'text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100'; + +export function AppHeader({ breadcrumbs = [] }: Props) { + const page = usePage(); + const { auth } = page.props; + const getInitials = useInitials(); + const { isCurrentUrl, whenCurrentUrl } = useCurrentUrl(); + + return ( + <> +
    +
    + {/* Mobile Menu */} + + + + + + + {/* Desktop Navigation */} +
    + + + {mainNavItems.map((item, index) => ( + + + {item.icon && ( + + )} + {item.title} + + {isCurrentUrl(item.href) && ( +
    + )} +
    + ))} +
    +
    +
    + +
    +
    + +
    + {rightNavItems.map((item) => ( + + + + + {item.title} + + {item.icon && ( + + )} + + + +

    {item.title}

    +
    +
    + ))} +
    +
    + + + + + + {auth.user && ( + + )} + + +
    +
    +
    + {breadcrumbs.length > 1 && ( +
    +
    + +
    +
    + )} + + ); +} diff --git a/resources/js/components/app-logo-icon.tsx b/resources/js/components/app-logo-icon.tsx new file mode 100644 index 0000000..0c31215 --- /dev/null +++ b/resources/js/components/app-logo-icon.tsx @@ -0,0 +1,13 @@ +import type { SVGAttributes } from 'react'; + +export default function AppLogoIcon(props: SVGAttributes) { + return ( + + + + ); +} diff --git a/resources/js/components/app-logo.tsx b/resources/js/components/app-logo.tsx new file mode 100644 index 0000000..4845632 --- /dev/null +++ b/resources/js/components/app-logo.tsx @@ -0,0 +1,20 @@ +import { usePage } from '@inertiajs/react'; + +import AppLogoIcon from '@/components/app-logo-icon'; + +export default function AppLogo() { + const { name } = usePage().props; + + return ( + <> +
    + +
    +
    + + {name} + +
    + + ); +} diff --git a/resources/js/components/app-shell.tsx b/resources/js/components/app-shell.tsx new file mode 100644 index 0000000..f51a9db --- /dev/null +++ b/resources/js/components/app-shell.tsx @@ -0,0 +1,21 @@ +import { usePage } from '@inertiajs/react'; +import type { ReactNode } from 'react'; +import { SidebarProvider } from '@/components/ui/sidebar'; +import type { AppVariant } from '@/types'; + +type Props = { + children: ReactNode; + variant?: AppVariant; +}; + +export function AppShell({ children, variant = 'sidebar' }: Props) { + const isOpen = usePage().props.sidebarOpen; + + if (variant === 'header') { + return ( +
    {children}
    + ); + } + + return {children}; +} diff --git a/resources/js/components/app-sidebar-header.tsx b/resources/js/components/app-sidebar-header.tsx new file mode 100644 index 0000000..11c447b --- /dev/null +++ b/resources/js/components/app-sidebar-header.tsx @@ -0,0 +1,18 @@ +import { Breadcrumbs } from '@/components/breadcrumbs'; +import { SidebarTrigger } from '@/components/ui/sidebar'; +import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; + +export function AppSidebarHeader({ + breadcrumbs = [], +}: { + breadcrumbs?: BreadcrumbItemType[]; +}) { + return ( +
    +
    + + +
    +
    + ); +} diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx new file mode 100644 index 0000000..a38aa1d --- /dev/null +++ b/resources/js/components/app-sidebar.tsx @@ -0,0 +1,65 @@ +import { Link } from '@inertiajs/react'; +import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; +import AppLogo from '@/components/app-logo'; +import { NavFooter } from '@/components/nav-footer'; +import { NavMain } from '@/components/nav-main'; +import { NavUser } from '@/components/nav-user'; +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarHeader, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from '@/components/ui/sidebar'; +import { dashboard } from '@/routes'; +import type { NavItem } from '@/types'; + +const mainNavItems: NavItem[] = [ + { + title: 'Dashboard', + href: dashboard(), + icon: LayoutGrid, + }, +]; + +const footerNavItems: NavItem[] = [ + { + title: 'Repository', + href: 'https://github.com/laravel/react-starter-kit', + icon: FolderGit2, + }, + { + title: 'Documentation', + href: 'https://laravel.com/docs/starter-kits#react', + icon: BookOpen, + }, +]; + +export function AppSidebar() { + return ( + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/resources/js/components/appearance-tabs.tsx b/resources/js/components/appearance-tabs.tsx new file mode 100644 index 0000000..b013862 --- /dev/null +++ b/resources/js/components/appearance-tabs.tsx @@ -0,0 +1,45 @@ +import type { LucideIcon } from 'lucide-react'; +import { Monitor, Moon, Sun } from 'lucide-react'; +import type { HTMLAttributes } from 'react'; +import type { Appearance } from '@/hooks/use-appearance'; +import { useAppearance } from '@/hooks/use-appearance'; +import { cn } from '@/lib/utils'; + +export default function AppearanceToggleTab({ + className = '', + ...props +}: HTMLAttributes) { + const { appearance, updateAppearance } = useAppearance(); + + const tabs: { value: Appearance; icon: LucideIcon; label: string }[] = [ + { value: 'light', icon: Sun, label: 'Light' }, + { value: 'dark', icon: Moon, label: 'Dark' }, + { value: 'system', icon: Monitor, label: 'System' }, + ]; + + return ( +
    + {tabs.map(({ value, icon: Icon, label }) => ( + + ))} +
    + ); +} diff --git a/resources/js/components/breadcrumbs.tsx b/resources/js/components/breadcrumbs.tsx new file mode 100644 index 0000000..3420084 --- /dev/null +++ b/resources/js/components/breadcrumbs.tsx @@ -0,0 +1,50 @@ +import { Link } from '@inertiajs/react'; +import { Fragment } from 'react'; +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from '@/components/ui/breadcrumb'; +import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; + +export function Breadcrumbs({ + breadcrumbs, +}: { + breadcrumbs: BreadcrumbItemType[]; +}) { + return ( + <> + {breadcrumbs.length > 0 && ( + + + {breadcrumbs.map((item, index) => { + const isLast = index === breadcrumbs.length - 1; + + return ( + + + {isLast ? ( + + {item.title} + + ) : ( + + + {item.title} + + + )} + + {!isLast && } + + ); + })} + + + )} + + ); +} diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx new file mode 100644 index 0000000..213e76f --- /dev/null +++ b/resources/js/components/delete-user.tsx @@ -0,0 +1,120 @@ +import { Form } from '@inertiajs/react'; +import { useRef } from 'react'; +import ProfileController from '@/actions/App/Http/Controllers/Settings/ProfileController'; +import Heading from '@/components/heading'; +import InputError from '@/components/input-error'; +import PasswordInput from '@/components/password-input'; +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; +import { Label } from '@/components/ui/label'; + +export default function DeleteUser() { + const passwordInput = useRef(null); + + return ( +
    + +
    +
    +

    Warning

    +

    + Please proceed with caution, this cannot be undone. +

    +
    + + + + + + + + Are you sure you want to delete your account? + + + Once your account is deleted, all of its resources + and data will also be permanently deleted. Please + enter your password to confirm you would like to + permanently delete your account. + + +
    passwordInput.current?.focus()} + resetOnSuccess + className="space-y-6" + > + {({ resetAndClearErrors, processing, errors }) => ( + <> +
    + + + + + +
    + + + + + + + + + + + )} +
    +
    +
    +
    +
    + ); +} diff --git a/resources/js/components/heading.tsx b/resources/js/components/heading.tsx new file mode 100644 index 0000000..5170403 --- /dev/null +++ b/resources/js/components/heading.tsx @@ -0,0 +1,26 @@ +export default function Heading({ + title, + description, + variant = 'default', +}: { + title: string; + description?: string; + variant?: 'default' | 'small'; +}) { + return ( +
    +

    + {title} +

    + {description && ( +

    {description}

    + )} +
    + ); +} diff --git a/resources/js/components/input-error.tsx b/resources/js/components/input-error.tsx new file mode 100644 index 0000000..f323cee --- /dev/null +++ b/resources/js/components/input-error.tsx @@ -0,0 +1,17 @@ +import type { HTMLAttributes } from 'react'; +import { cn } from '@/lib/utils'; + +export default function InputError({ + message, + className = '', + ...props +}: HTMLAttributes & { message?: string }) { + return message ? ( +

    + {message} +

    + ) : null; +} diff --git a/resources/js/components/manage-passkeys.tsx b/resources/js/components/manage-passkeys.tsx new file mode 100644 index 0000000..4162959 --- /dev/null +++ b/resources/js/components/manage-passkeys.tsx @@ -0,0 +1,71 @@ +import { router } from '@inertiajs/react'; +import { KeyRound } from 'lucide-react'; +import { destroy } from '@/actions/Laravel/Passkeys/Http/Controllers/PasskeyRegistrationController'; +import Heading from '@/components/heading'; +import PasskeyItem from '@/components/passkey-item'; +import PasskeyRegistration from '@/components/passkey-register'; +import type { Passkey } from '@/types/auth'; + +export type Props = { + canManagePasskeys?: boolean; + passkeys?: Passkey[]; +}; + +const EmptyState = () => { + return ( +
    +
    + +
    +

    No passkeys yet

    +

    + Add a passkey to sign in without a password +

    +
    + ); +}; + +export default function ManagePasskeys(props: Props) { + const passkeys = props.passkeys ?? []; + + const handleDelete = (id: number, onError: () => void) => { + router.delete(destroy.url(id), { + preserveScroll: true, + onError, + }); + }; + + const handleRegisterSuccess = () => { + router.reload(); + }; + + if (!(props.canManagePasskeys ?? false)) { + return null; + } + + return ( +
    + + +
    + {passkeys.length > 0 ? ( + passkeys.map((passkey) => ( + + )) + ) : ( + + )} +
    + + +
    + ); +} diff --git a/resources/js/components/manage-two-factor.tsx b/resources/js/components/manage-two-factor.tsx new file mode 100644 index 0000000..9fb5370 --- /dev/null +++ b/resources/js/components/manage-two-factor.tsx @@ -0,0 +1,126 @@ +import { Form } from '@inertiajs/react'; +import { ShieldCheck } from 'lucide-react'; +import { useEffect, useRef, useState } from 'react'; +import Heading from '@/components/heading'; +import TwoFactorRecoveryCodes from '@/components/two-factor-recovery-codes'; +import TwoFactorSetupModal from '@/components/two-factor-setup-modal'; +import { Button } from '@/components/ui/button'; +import { useTwoFactorAuth } from '@/hooks/use-two-factor-auth'; +import { disable, enable } from '@/routes/two-factor'; + +export type Props = { + canManageTwoFactor?: boolean; + requiresConfirmation?: boolean; + twoFactorEnabled?: boolean; +}; + +export default function ManageTwoFactor(props: Props) { + const requiresConfirmation = props.requiresConfirmation ?? false; + const twoFactorEnabled = props.twoFactorEnabled ?? false; + + const { + qrCodeSvg, + hasSetupData, + manualSetupKey, + clearSetupData, + clearTwoFactorAuthData, + fetchSetupData, + recoveryCodesList, + fetchRecoveryCodes, + errors, + } = useTwoFactorAuth(); + const [showSetupModal, setShowSetupModal] = useState(false); + const prevTwoFactorEnabled = useRef(twoFactorEnabled); + + useEffect(() => { + if (prevTwoFactorEnabled.current && !twoFactorEnabled) { + clearTwoFactorAuthData(); + } + + prevTwoFactorEnabled.current = twoFactorEnabled; + }, [twoFactorEnabled, clearTwoFactorAuthData]); + + if (!(props.canManageTwoFactor ?? false)) { + return null; + } + + return ( +
    + + {twoFactorEnabled ? ( +
    +

    + You will be prompted for a secure, random pin during + login, which you can retrieve from the TOTP-supported + application on your phone. +

    + +
    +
    + {({ processing }) => ( + + )} +
    +
    + + +
    + ) : ( +
    +

    + When you enable two-factor authentication, you will be + prompted for a secure pin during login. This pin can be + retrieved from a TOTP-supported application on your + phone. +

    + +
    + {hasSetupData ? ( + + ) : ( +
    setShowSetupModal(true)} + > + {({ processing }) => ( + + )} +
    + )} +
    +
    + )} + + setShowSetupModal(false)} + requiresConfirmation={requiresConfirmation} + twoFactorEnabled={twoFactorEnabled} + qrCodeSvg={qrCodeSvg} + manualSetupKey={manualSetupKey} + clearSetupData={clearSetupData} + fetchSetupData={fetchSetupData} + errors={errors} + /> +
    + ); +} diff --git a/resources/js/components/nav-footer.tsx b/resources/js/components/nav-footer.tsx new file mode 100644 index 0000000..8430e49 --- /dev/null +++ b/resources/js/components/nav-footer.tsx @@ -0,0 +1,49 @@ +import type { ComponentPropsWithoutRef } from 'react'; +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from '@/components/ui/sidebar'; +import { toUrl } from '@/lib/utils'; +import type { NavItem } from '@/types'; + +export function NavFooter({ + items, + className, + ...props +}: ComponentPropsWithoutRef & { + items: NavItem[]; +}) { + return ( + + + + {items.map((item) => ( + + + + {item.icon && ( + + )} + {item.title} + + + + ))} + + + + ); +} diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx new file mode 100644 index 0000000..62fcc6f --- /dev/null +++ b/resources/js/components/nav-main.tsx @@ -0,0 +1,36 @@ +import { Link } from '@inertiajs/react'; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from '@/components/ui/sidebar'; +import { useCurrentUrl } from '@/hooks/use-current-url'; +import type { NavItem } from '@/types'; + +export function NavMain({ items }: { items: NavItem[] }) { + const { isCurrentUrl } = useCurrentUrl(); + + return ( + + Platform + + {items.map((item) => ( + + + + {item.icon && } + {item.title} + + + + ))} + + + ); +} diff --git a/resources/js/components/nav-user.tsx b/resources/js/components/nav-user.tsx new file mode 100644 index 0000000..a407239 --- /dev/null +++ b/resources/js/components/nav-user.tsx @@ -0,0 +1,58 @@ +import { usePage } from '@inertiajs/react'; +import { ChevronsUpDown } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; +import { UserInfo } from '@/components/user-info'; +import { UserMenuContent } from '@/components/user-menu-content'; +import { useIsMobile } from '@/hooks/use-mobile'; + +export function NavUser() { + const { auth } = usePage().props; + const { state } = useSidebar(); + const isMobile = useIsMobile(); + + if (!auth.user) { + return null; + } + + return ( + + + + + + + + + + + + + + + + ); +} diff --git a/resources/js/components/passkey-item.tsx b/resources/js/components/passkey-item.tsx new file mode 100644 index 0000000..d191860 --- /dev/null +++ b/resources/js/components/passkey-item.tsx @@ -0,0 +1,93 @@ +import { KeyRound, Trash2 } from 'lucide-react'; +import { useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; +import type { Passkey } from '@/types/auth'; + +type Props = { + passkey: Passkey; + onDelete: (id: number, onError: () => void) => void; +}; + +export default function PasskeyItem({ passkey, onDelete }: Props) { + const [isDeleting, setIsDeleting] = useState(false); + + const handleDelete = () => { + setIsDeleting(true); + onDelete(passkey.id, () => setIsDeleting(false)); + }; + + return ( +
    +
    +
    + +
    +
    +
    +

    + {passkey.name} +

    + {passkey.authenticator && ( + + {passkey.authenticator} + + )} +
    +

    + Added {passkey.created_at_diff} + {passkey.last_used_at_diff && ( + <> + + / + + Last used {passkey.last_used_at_diff} + + )} +

    +
    +
    + + + + + + + Remove passkey + + Are you sure you want to remove the "{passkey.name}" + passkey? You will no longer be able to use it to sign + in. + + + + + + + + + +
    + ); +} diff --git a/resources/js/components/passkey-register.tsx b/resources/js/components/passkey-register.tsx new file mode 100644 index 0000000..a4d2a5e --- /dev/null +++ b/resources/js/components/passkey-register.tsx @@ -0,0 +1,108 @@ +import { usePasskeyRegister } from '@laravel/passkeys/react'; +import { useState } from 'react'; +import InputError from '@/components/input-error'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; + +type Props = { + onSuccess: () => void; +}; + +export default function PasskeyRegistration({ onSuccess }: Props) { + const [name, setName] = useState(() => { + const ua = navigator.userAgent; + + const browser = [ + { pattern: /Edg|Edge/, name: 'Edge' }, + { pattern: /OPR|Opera|OPiOS/, name: 'Opera' }, + { pattern: /Firefox|FxiOS/, name: 'Firefox' }, + { pattern: /Chrome|CriOS/, name: 'Chrome' }, + { pattern: /Safari/, name: 'Safari' }, + ].find(({ pattern }) => pattern.test(ua))?.name; + + const os = [ + { pattern: /iPhone/, name: 'iPhone' }, + { pattern: /iPad|Macintosh(?=.*Mobile)/, name: 'iPad' }, + { pattern: /Android/, name: 'Android' }, + { pattern: /Mac/, name: 'Mac' }, + { pattern: /Windows/, name: 'Windows' }, + ].find(({ pattern }) => pattern.test(ua))?.name; + + return [browser, os].filter(Boolean).join(' on ') || ''; + }); + + const [showForm, setShowForm] = useState(false); + const { register, isLoading, error, isSupported } = usePasskeyRegister({ + onSuccess: () => { + setName(''); + setShowForm(false); + onSuccess(); + }, + }); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!name.trim()) { + return; + } + + await register(name); + }; + + const handleCancel = () => { + setShowForm(false); + setName(''); + }; + + if (!isSupported) { + return ( +
    + Passkeys are not supported in this browser. +
    + ); + } + + if (!showForm) { + return ( + + ); + } + + return ( +
    +
    + + setName(e.target.value)} + placeholder="e.g., MacBook Pro, iPhone" + className="border-foreground/20 mt-1 block w-full" + autoFocus + /> +

    + A name helps you identify this passkey later. +

    +
    + + {error && } + +
    + + +
    + + ); +} diff --git a/resources/js/components/passkey-verify.tsx b/resources/js/components/passkey-verify.tsx new file mode 100644 index 0000000..adb714f --- /dev/null +++ b/resources/js/components/passkey-verify.tsx @@ -0,0 +1,74 @@ +import type { UrlMethodPair } from '@inertiajs/core'; +import { router } from '@inertiajs/react'; +import { usePasskeyVerify } from '@laravel/passkeys/react'; +import { KeyRound } from 'lucide-react'; +import InputError from '@/components/input-error'; +import { Button } from '@/components/ui/button'; +import { Separator } from '@/components/ui/separator'; +import { Spinner } from '@/components/ui/spinner'; + +type Props = { + routes?: { + options: UrlMethodPair; + submit: UrlMethodPair; + }; + label?: string; + loadingLabel?: string; + separator?: string; +}; + +export default function PasskeyVerify({ + routes, + label, + loadingLabel, + separator, +}: Props = {}) { + const { verify, isLoading, error, isSupported } = usePasskeyVerify({ + ...(routes && { + routes: { + options: routes.options.url, + submit: routes.submit.url, + }, + }), + onSuccess: (response) => { + router.visit(response.redirect ?? '/dashboard'); + }, + }); + + if (!isSupported) { + return null; + } + + return ( + <> +
    + + {error && ( + + )} +
    + +
    +
    + +
    +
    + + {separator ?? 'Or continue with email'} + +
    +
    + + ); +} diff --git a/resources/js/components/password-input.tsx b/resources/js/components/password-input.tsx new file mode 100644 index 0000000..cbc0087 --- /dev/null +++ b/resources/js/components/password-input.tsx @@ -0,0 +1,37 @@ +import { Eye, EyeOff } from 'lucide-react'; +import type { ComponentProps, Ref } from 'react'; +import { useState } from 'react'; +import { Input } from '@/components/ui/input'; +import { cn } from '@/lib/utils'; + +export default function PasswordInput({ + className, + ref, + ...props +}: Omit, 'type'> & { ref?: Ref }) { + const [showPassword, setShowPassword] = useState(false); + + return ( +
    + + +
    + ); +} diff --git a/resources/js/components/site/brand.tsx b/resources/js/components/site/brand.tsx new file mode 100644 index 0000000..8448af3 --- /dev/null +++ b/resources/js/components/site/brand.tsx @@ -0,0 +1,33 @@ +import { Link } from '@inertiajs/react'; +import { company } from '@/data/site'; +import { home } from '@/routes'; + +/** Logo mark with company name, linking back to the home page. */ +export default function Brand() { + return ( + +
    + {company.name} +
    +
    +
    + + {company.brand} + + +
    + + {company.name} + +
    + + ); +} diff --git a/resources/js/components/site/button.tsx b/resources/js/components/site/button.tsx new file mode 100644 index 0000000..e240076 --- /dev/null +++ b/resources/js/components/site/button.tsx @@ -0,0 +1,131 @@ +import type { InertiaLinkProps } from '@inertiajs/react'; +import { Link } from '@inertiajs/react'; +import { cva } from 'class-variance-authority'; +import type { VariantProps } from 'class-variance-authority'; +import type { ButtonHTMLAttributes, ReactNode } from 'react'; +import Icon from '@/components/site/icon'; +import { cn, toUrl } from '@/lib/utils'; + +export const buttonVariants = cva( + 'font-display inline-flex cursor-pointer items-center justify-center gap-2 font-bold transition-all active:scale-[0.98] disabled:pointer-events-none disabled:opacity-60', + { + variants: { + variant: { + primary: + 'from-paj-crimson to-primary bg-gradient-to-r text-white shadow-[0_0_24px_rgba(163,29,36,0.35)] hover:shadow-[0_0_32px_rgba(255,77,88,0.5)] hover:brightness-110', + secondary: + 'border-outline-variant/60 bg-surface-container-high text-on-surface hover:border-primary/50 hover:bg-surface-bright border', + ghost: 'text-primary hover:text-on-surface', + }, + size: { + sm: 'rounded-full px-5 py-2.5 text-xs tracking-wide uppercase', + md: 'rounded-full px-6 py-3.5 text-sm', + block: 'w-full rounded-xl px-6 py-3.5 text-xs tracking-wider uppercase', + inline: 'p-0 text-sm', + }, + }, + defaultVariants: { variant: 'primary', size: 'md' }, + }, +); + +type ButtonStyleProps = VariantProps & { + icon?: string; + /** Icon rendered after the label, e.g. `arrow_forward`. */ + trailingIcon?: string; + className?: string; + children: ReactNode; +}; + +function Content({ + icon, + trailingIcon, + children, +}: Pick) { + return ( + <> + {icon && } + {children} + {trailingIcon && } + + ); +} + +type ButtonLinkProps = ButtonStyleProps & { + href: NonNullable; + onClick?: () => void; +}; + +/** + * Renders an Inertia for app routes, and a plain for in-page + * anchors, tel:/mailto: links and external URLs (opened in a new tab). + */ +export function ButtonLink({ + href, + variant, + size, + icon, + trailingIcon, + className, + children, + onClick, +}: ButtonLinkProps) { + const classes = cn(buttonVariants({ variant, size }), className); + const content = ( + + {children} + + ); + const url = toUrl(href); + + if (/^(#|tel:|mailto:)/.test(url)) { + return ( + + {content} + + ); + } + + if (/^https?:\/\//.test(url)) { + return ( + + {content} + + ); + } + + return ( + + {content} + + ); +} + +export function Button({ + variant, + size, + icon, + trailingIcon, + className, + children, + type = 'button', + ...props +}: ButtonStyleProps & + Omit, 'children' | 'className'>) { + return ( + + ); +} diff --git a/resources/js/components/site/card.tsx b/resources/js/components/site/card.tsx new file mode 100644 index 0000000..bec7b00 --- /dev/null +++ b/resources/js/components/site/card.tsx @@ -0,0 +1,38 @@ +import type { ReactNode } from 'react'; +import { cn } from '@/lib/utils'; + +const paddings = { + none: '', + sm: 'p-4', + md: 'p-6', + lg: 'p-6 lg:p-8', +} as const; + +type CardProps = { + padding?: keyof typeof paddings; + /** Adds the crimson hover border used on clickable-looking cards. */ + interactive?: boolean; + className?: string; + children: ReactNode; +}; + +export default function Card({ + padding = 'md', + interactive = false, + className, + children, +}: CardProps) { + return ( +
    + {children} +
    + ); +} diff --git a/resources/js/components/site/consultation-form.tsx b/resources/js/components/site/consultation-form.tsx new file mode 100644 index 0000000..bb5d618 --- /dev/null +++ b/resources/js/components/site/consultation-form.tsx @@ -0,0 +1,109 @@ +import { useState } from 'react'; +import type { FormEvent } from 'react'; +import { Button } from '@/components/site/button'; +import { + Field, + FormSuccess, + SelectInput, + TextInput, +} from '@/components/site/form-field'; +import { serviceOptions } from '@/data/site'; + +/** + * Compact consultation request form. + * + * TODO: submissions are not sent anywhere yet; wire this to a Laravel + * endpoint before going live. + */ +export default function ConsultationForm({ idPrefix }: { idPrefix: string }) { + const [submitted, setSubmitted] = useState(false); + + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + setSubmitted(true); + }; + + return ( +
    +
    + + Jadwalkan Konsultasi IT + + + Konfirmasi langsung oleh Lead Architect PAJ dalam 2 jam + kerja. + +
    + + {submitted ? ( + + ) : ( +
    + + + + + + + + + + + + + +

    + Non-Disclosure Agreement (NDA) dapat ditandatangani + sebelum audit teknis. +

    +
    + )} +
    + ); +} diff --git a/resources/js/components/site/container.tsx b/resources/js/components/site/container.tsx new file mode 100644 index 0000000..58f69cd --- /dev/null +++ b/resources/js/components/site/container.tsx @@ -0,0 +1,31 @@ +import type { ReactNode } from 'react'; +import { cn } from '@/lib/utils'; + +const widths = { + default: 'max-w-7xl', + narrow: 'max-w-5xl', +} as const; + +type ContainerProps = { + size?: keyof typeof widths; + className?: string; + children: ReactNode; +}; + +export default function Container({ + size = 'default', + className, + children, +}: ContainerProps) { + return ( +
    + {children} +
    + ); +} diff --git a/resources/js/components/site/eyebrow.tsx b/resources/js/components/site/eyebrow.tsx new file mode 100644 index 0000000..3f13944 --- /dev/null +++ b/resources/js/components/site/eyebrow.tsx @@ -0,0 +1,28 @@ +import type { ReactNode } from 'react'; +import Icon from '@/components/site/icon'; +import { cn } from '@/lib/utils'; + +type EyebrowProps = { + icon?: string; + className?: string; + children: ReactNode; +}; + +/** Small monospace label that sits above a heading. */ +export default function Eyebrow({ icon, className, children }: EyebrowProps) { + return ( +
    + {icon ? ( + + ) : ( + + )} + {children} +
    + ); +} diff --git a/resources/js/components/site/feature-card.tsx b/resources/js/components/site/feature-card.tsx new file mode 100644 index 0000000..ed582a3 --- /dev/null +++ b/resources/js/components/site/feature-card.tsx @@ -0,0 +1,57 @@ +import type { ReactNode } from 'react'; +import Card from '@/components/site/card'; +import Icon from '@/components/site/icon'; +import IconTile from '@/components/site/icon-tile'; +import { cn } from '@/lib/utils'; + +type FeatureCardProps = { + icon: string; + title: ReactNode; + description: ReactNode; + /** Small label shown opposite the icon, e.g. "01 / JASA RESMI". */ + tag?: string; + /** Outcome line separated by a divider at the bottom of the card. */ + footer?: string; + iconTone?: 'soft' | 'solid' | 'neutral'; + className?: string; +}; + +export default function FeatureCard({ + icon, + title, + description, + tag, + footer, + iconTone = 'soft', + className, +}: FeatureCardProps) { + return ( + +
    +
    + + {tag && ( + + {tag} + + )} +
    +

    + {title} +

    +

    + {description} +

    +
    + {footer && ( +
    + + {footer} +
    + )} +
    + ); +} diff --git a/resources/js/components/site/form-field.tsx b/resources/js/components/site/form-field.tsx new file mode 100644 index 0000000..d5328f4 --- /dev/null +++ b/resources/js/components/site/form-field.tsx @@ -0,0 +1,104 @@ +import type { + InputHTMLAttributes, + ReactNode, + SelectHTMLAttributes, + TextareaHTMLAttributes, +} from 'react'; +import Icon from '@/components/site/icon'; +import { cn } from '@/lib/utils'; + +const controlClasses = + 'w-full rounded-xl border border-outline-variant/60 bg-surface-container-lowest px-4 py-2.5 text-sm text-on-surface transition-colors placeholder:text-on-surface-variant/50 focus:border-primary focus:outline-hidden'; + +type FieldProps = { + id: string; + label: string; + required?: boolean; + className?: string; + children: ReactNode; +}; + +export function Field({ + id, + label, + required, + className, + children, +}: FieldProps) { + return ( +
    + + {children} +
    + ); +} + +export function TextInput({ + className, + ...props +}: InputHTMLAttributes) { + return ; +} + +export function SelectInput({ + options, + placeholder, + className, + ...props +}: SelectHTMLAttributes & { + options: ReadonlyArray<{ value: string; label: string }>; + placeholder?: string; +}) { + return ( + + ); +} + +export function TextArea({ + className, + ...props +}: TextareaHTMLAttributes) { + return

    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 yCyxY*%11W<10Dho5( z0f5ASfWm}TW1p@;O2MYrQ4FLlI zi2+3cfW~Bpffd7|R5Nvg;|NMBq7wgg1&^(6)-$ui=^UK=^BPA&qoEhq+=V(Mr5LY~ zhHLgeZA1|Nzp?*i3IO=j2nhp#h5MWo#{fV;1E3+{p<$q)AYmb)K3xY1g#nF8!7io- zgGFiT^l69VSI-PAw)oB!6{k9m*|l@9M)J>w-dSo1TpF&ARRA*7=QkKo7yuyP-Ey{u z60HvrV}NT(_b2EO6WQ0%oe04rnyX6Zz@wB6Ee;LObhO1B zl2F+)M($6vsiWJcvb#M z&IIPvxondt8TXwpzFGAbx8r&Jdso5K^>0^>`Gr2`{0_D;GMjJBxKlTWMy=L$@@cN8 zX*Q)=lmV9W38n3huhc9HWy#9+$KsPMZFfpLT5?>+#J?yf(kth??@HcE32w0KmktdF z6B4%EJl7AuYs-uW6kTYgWK1vxnX0fW$mOT#r(gsy;@);EGYbBMzgk*;TTG!1Ak;g; zf1v8OeqC`rMQ&T4B@mY{2AO zFZ!&@5;483h;LFL(}ZL6r*V|!GF?TY!Z-Gv3eQ1)bSe@uCFSaYZdW1Q*NAwPbo!=cBCPrWzV#ASyj7oLeDP%m&9AUHcNQG_=J@nPSV#W7mLU>rA*NJg zLph86dHe&lhcCfg?FJCjj|VqRusT7z$a}F0)EUrVlk6(6+f();M7BdfX&){QKBL7m z-;!iRpKj-1Quf*Sq%?5$dvWAoRc2?sj%@%B4W}xDg8F7Do7_Bb`0_*3%6B@i(mBB~ zC`H7NiGhqr3^4ka4FGl`#Vx||fkT4GJ0ovJ3iF0jH1DGHgVEG{TXnNg3=nKn=b+{? z)O@0E{TW@{D|XIKQcf7D7y`AdOHu!i{%m_2^uvdyf8Plv0M?;Pm}*A4N7VyF8kM8< znx$&1?$yhynfyZ&z9@>-DWWU zZXax=5Hz7W(PVu441P94(2%q(D(_cb*1Le=#tzdS{}Tu90uC-vzQ-3Xli}oKe(;YC_ zi4kGHs6R~WRhhzhA6fpuj*_Mm?rK1J^kM@O+X=T;9I+fR)v=nmv$kI5klkQK10v5X zy$gk*M_>dFyC>1{2fRoqG37%(!-Eh>(s-E_TXAvIn6X?4MS%hJle~R$ z=vwb>$k3jz-ji9hpVfCc_Ko+wm^U&YV;v|RNa?%0t|bnhyyh*X5?+PX{`A$44D zHiv9et!jsDi<$M?z>b>@1&8AkvvL1o+c3S$R`H}^ol>PbowdNy{*AvPoAn0(%M9OE zl;qqm-FGX@F&QZ~J%7)9x>SVWh5fMWK(o}qe@qECfngEh1Aw__OE!?H@wV8~xp#7J z}eab&yUW}_LcaR3Rb+oV1DzpX~f^T{xf3=ga%4cBEONqN^ z4FtTiab?M8#$#sS*BU#tYe8})nbveo^^rSlRKkqFtyY_$ ztYxgWEjt}iL%`%_0`yAtM^SDM)c3)h^+4)`pA10Oesj56hQGcgLsJyk;L%ICxCCiB z3$>$trY)vrt+QzMUw{S$#u#8nNycUv+ePx1guUo%Rq50S&8p|?{#5i+wN4BF0N@l( zi5g{G;|HMNtm|sPnJJ1(bBq0X4NE@kp`$d-YWeFvJ4`nd>|f9j64WLTBIt!cQ7{GPj3VjuUdQ6vq?tQhvPmRyMf2> zM2t*@^%Kg_ds{-w<>wkEmMjIYlfGFgwL7aCs-6VKCWm!}zz570N6AO55GS8srt*hSn zpz;>JCEx(Z)s%J9P?yrugsdqTZ4SN*Ub&xkg`Ft$r04mS*}W3)b-R3*>MZurl$sce zCDTQp3~DbhN?Mz&wWmI1o60es`kxY*H-;?=7d(i^4&!^W7JR+4GzQ7eFqsK*D%uOO zpio+EA`d$PR+=a2zoov6QZ@ zhHKKOomzoLf4!3Ri|na88B(+Q&XW_zSZJ;l3kyDz+r2pJEmQi#qy|vhVeSCcgPQ>w zq#Ig_GR+gQP~Y#K8|j1+c6Q${BHm@4NH5|`<&ZUuS~9xX_P2x))Bb$@1y|#kc0^+; z75X#&6ltxp)4p8#bYJ|FyIY!fe{&2C<4FVg&CJQ+@8fHAW9)nUa|!j_ zc~#^FLfH`*W#a?zV7_Sjxr>`xV81%V7ti};r1$&d3=IAds=bk}}_YlpvpiSY=_rT0s)jvGysXT^{@ z)8ptQs`*_vEbhtMt=3w6`dt(iBUOLmz_kXtVmS}FyKI^}yF;2=FQ1KrvSke80L!Rk zUEaUa4qr}4c4dP8p{2-u08|GIL!-bL#V10F`c~8)r?r3Bh4sE5{^b6FuDsa7vi(Iw zRTjUG0~q1jGc*>ts6@!SpXudZrax}WQ{Q=#C^d3n4hCr0XRD8<&WqlD>jx8jqHu~>`*ZA-x^}6*(5fcM|07kD! zB|0q_KBeI|MI*qz6y}L;0loGrU($EVnqj`&P&1AxlO``n)nw`Cn0|DXEtDY-itx55 z6pFtiPqjBSNr+oPW$~b2rcMd9Mx8{Vg+_Maw+}!7V_7Np2jE}~!tOUKJ3BC;HaeWH zF&JrpuOITBzSP#DNqbCS&QUJYql9rr9nLN6dzY=s*6Gsegtb=dG%q4@zLxEQi+Gwz z_u_CKPMc68Ji$)+*9BWR-5>wff>(8|jgFmw4G)K82X{I)lf8sqerlKMV^*m%BM*vr zstYf}tWmNPJO-UD*ePPdr!acUNfc0uisr=>BDt@#6JN&h;lNZP^Urcn@!KX7YN{pS zgh)O^!_2r#$dWL)_!Nh337qozmbN;6EVvKN3?l? zyLfwMM=^BDdx2%-wJ=ioMP9_LyKX@D!t@z@-yaUm`GrQjc=EA_F>$QUtp^mPW|tDFVYljPF=Px8 zzv75n)6A{18GzFJ@;>KW&&K9*6Ib$0(}FUml?C0QJ`B8QCP7C43@a9q8?t<88CbqY9x^l$U?bpkLY7mcg` zy1@#|X*KPW(qT;QB3Afg&|_+}BP3f)PuI3eRS*;>>MbjhuZy&jiOE~ydBEZbXV!uMpw;a} z;|9ksCH-PNV5PK2X@Pu2E9-+`YdVwry<75Q(pb?s;21c_scEw`rnS=yS}1GAQ~ps~ z;Wl5Gun@|nk5XP|;5Bp?Pf*L^?kMvb;MSrM*QZi&9=7;~aW1nc&G&EJ z$`OMVC-)qSbk1yL>Vn%sMYgSbSxhk^NNYNr4y%7p$$dMgh8{_z&$bisV5cmfdv3F; zEjqt|(rLU#YpjEL0dbrpInJZB_U9ZU35Z2LZjJIx`5wjAO*d1(_IPL&sn#&3>TGbU8f?&H?X3|J2Gn3C5F1nkbYI$0D>qeRjS@Jd z8Y~$Snit{NhWHG^EFZ`HTfpX+6vVbv%jkkAmO}JHNKvKN;lMvbY1u>Hv=06o=B@(V z(6fJluq`EhI_9P)lwW&0kTV7#rrn0{4Jh%M-LIi=Rni!7_ED=CPaQq)99tI4Cs@YF zdx0a$xc8FipQaTjRnWLk%n6CIMoq(IL!T0(?<7O;V8u?+lHU0|Nf@Zb2t)gN`9A=H zvQR3Vn)DQ|_!U19ALHw%VJie(JJEBB*<3a~b9^5}=5u1mVnbt-3HRMd&m@X2{_ur# zq#JanY>GFn$&y|HTC4F3rb}53ncFo=AI(aU{T%L7|Mix(Qlb~6F zFPkD*jzZ)3SG@5qcQcYskZvnvJ8_x~p>Cqed5p4q!NE)-nDPbrp{uu%M%smPK2KHS?HjA^ye2NxeKbkBg)E*S_m>t9i?*7 zL6$$>Ca=wC1MHVv*PUA;?Qyi8{`9WF-FMS;GCK;gmF3pbUXm43U^`E3mZ-o~k}5%2Do8;$~Mi>KAlES-8pYB+74gt#bIIZyL^o@>7JXzO~FCTA@PEDV?X2NuUTQI(WcU(RI7S$e90Za zjd~4-_K!9SjqXJ+yh4iEBN@yoTwc@-F1t=^NBA)giUSd?J!&Jf!$-Z299Zjsp;HQf++5mjws&ZNr-nGts*V$Lh(C1jj%<1)8cAy`tZGiLKGMCkA> zt}kT$_yy>`>_dhbyh@05nr4ti8=j8Z6*LNR*Xj%8RS?(m+RXt>PW50gyLkLYT7T(2 z5Qr?^!PKIRqZFELt)fw)c%NfNyvtYBTtj7H;8@h&9BAyBe{9m@{-_mR-v%2FDY;AZ zRrOBWQ*h;81&l8WDc;_;4F?&G2 z6X7ty9{8RN<|yzayDlR@-*@i1zkuoZpYS)<|CpWV?YA170@Tj;hrT!W>W!p7smA=i+ya&sSn+q7l^rPsDy?d1Jo#Z0Dv&m$va9{ni zDf&IZKrJbf)m5SWoNGA}-Y-*Ctgki_R3I%6as65*Amm=WY15UR+##@0wy87da%d+) zi=InDX!zCwVJPgqulIFZj7+`!Bpz!g{;*w~s8tYmBkT#Au?x4d^QH4m?WeGr$X^Q% zI4~)&`G2fuNxOd8XAi)i+YS28Yf<(!K?axKqdO|tNCL( zegdUAGIzE6?yR#ClL#KhCf74nmOr;%hC-5>FC)FF8!4s#U$tq;x$oFMO)9)3k)9xU z#}9xbj7#FSJaT1N3R@vSK%b`%R$Yp3D|+fwpV(j;Eyc}-`}^P6+qSKbGD#+H1=>% zZSLk(>yWxd;rgDokT2%B%y6|{D-#y#1@}h9yBE2TPnIo5GY_H_0+X36p%|NrN}I_S zyIi|o*if9H$ktKm3RtPT<;=`K8~1E7W2bCmCnLJKx)`>^18O{sW80!&ZK^k2!)15i zfG{bKYzumwC4Uxi{D}@8@}F5>vCD=6C^BM3FjF?~jE&SRa^gWH!%(=7<>Xv_%^HNI z;?Sz`DCpJns>*Z@F_-wqx=t|X(LrnD;9IpuB?ChVL%qu?j&OxjA!Qml6;n{98)8Xt z+du;Jm-t~3BwkG2n;9bpop|Rs9(mWBdx-N_ai|fxrfD-#WUdpDd;X5`k-jUlJd1XR zuO7_f(uje`|F$|<7PoOQb57g2h1e|CZCgzbFM9@#Z#@t z1g#rB**9X4cL0fK#IOOFedUDyJ=*BUYGAOhE($nsws^{A#Vc*)8D;}~AHx`=iyk1WuCt>sn<=rRB|$ZV_mwPh2#(a2cxJ>gmqavK?)@0Caoe!D{+X5U zZv_AbMsb7Yif(AjA%sLeU@m^at(LI(_i(@GA2)w#(I>Y4<2Fr^_F$U8_Y)Q}jevM~ z^wBPvu!&yH0A2yOBd{)kA0_M-jCTe!=r#2N&`Q&36>!}J*FMmp)CDBg z<*Vdx3e$k}!-qKVC4kRUJw-J06?k_DY?D+)z|H&%he47vw-Q@_B`8bkp84zv_=~x% z!R$Dy-@X%#ss^sa6p9b)y6r(5#QFNxP`S^rnaNHKA`IX4Rr%_nQhARt6dlL~qgFZh z=g^6q0*5e`T|U~@E|Nk%KTim{%DVahbgI% zG&gBgv!CR*FguE*|43V~6-q0Z-CL77u?ZDpJocAg(8);%O7aif3mspLOt~y!p)1TR zJ5kw|*zKsMEV|uq&n908%P9-za|Ul4rm1W=sJ$G3ih6Ogqu5i6!RY&L@P6EAy>N4Q zwQ|m0ft84|Dy^cVCU5X$@l>jXu=z+OKk?SxRg@Gy0H%CInPk^o*kjbL0Z_wN)V?Xa z@JGI@qz6`1-F;~B%`9*12|%eG>Zf8-eHJk9CrEv=r1qFm5u#g@w)Z=AJxw4VRT-}T z04NLHZH3p@JrN(izGeK3xn`y5TDLR2cvRFg{-O8n^3Yil%rH;(-lO=&o;0{Nwze1?odx3*-XQI$_dv`+FFeAmefjlb}h`^uh8@2V+XHgwtA%=4L820E2c zp)JHidk{S${P-J3I*TKJ^{tG+go28}u7+&KOAVK*{4FMIpY{WgJF_@A!AWqJtZT%T5b)F^V7}qJ*>SLFyD1zC9|{RL=r( zOQW|$3Bg&~G_WZb=m|7v9;3X?5_#<+bM?2BmEn96*jQ=)U|Ru1kt+iZFGEB{*yEP? zF<%$2*@+zbOKaH9t9<~xOp9m5+h16T!fpqu9YiW`ltTKW(~8HLKLGsa1-iMVH>QTwX$wN~b zyEcp_5;9Gu$nkZAc7^MYtq#Lbo?;{rB_e6vcW;c?%r1<cTYS!zf%(IO%V?=c(TEL+$;Im21A?!{S)dmOi5W0lLTO^z`tPb z0Z3WEg8Ck+E(0|@%LgDquXE|X51D~L*R$vYPBU?wBKg3S zUsv|qn0zH$twM7GDr4mDac_tGv%D5yOLm+M=!Gxan_{LrqwMGV4*FZ@#k05-KcbTR zWT@|^pQl+8k3VXeA2LVep;PaH*ws)HLc*q-zl7YKEcgL%<<~vTb_6_mmkq1OCe%48EknJJ>WWq0$_&ykaDJDTk%n&E3kGPmZB)0ogQ zU220UXR4)NR`w%&c)FgH_o6?vv?eVBVW$pMo25le0r2JB+%)~U>sn$CFx-mwW`a!x z%Cj%lbOU~iq-Lm0<-p3znVmcFTQo|-8Va5nIVHmvx%#U{v+Wyr3y(@LUPy+j6fKBE zzbut(1DD!!YbQo{VL*aVc7^SrMZ5M^Iq?IqCI`f|`v6pI3!5mq$@Iv3iHW=lOT3N; zKtTIB8P#8DETGb(;fyi1h5_L1JISy@nvya9LEb5X0;wv!a<51O3a0J{LhQ9BOVA>( zlMb%BGUR$zM-^Iz$tMtUGDCKD&h~af)NxKDq9slEgN4!CO1AzzgPr>6Vc4$PcOSSJ z&Nq&riakWxw4f`0*-|ET-ucPY4qscE54m_QxHVdvk0K__Mk}P!5KMvy2C(4kg zBB9RUaL4%>ExB7?I5PsIz#9f>iZ_6H5L9)9p(s3Et7+u>9&<&>8l~E$mk0^Ow21 z=x7%}Ru!0&YNcWBV>bA`rsxYx{<8^yIicp?W$-l^4acZ1oH7+>)pAOO%y?=HTN;Hz zMopOIc8FdFWCf`2y(FHi_9TQ^?X06%s($wN1pksRQ9U1hV_qSVB~@~W1dd^k#-dOP z35qCXQhmt=sDO0Y5BPEm=_lp=4?N`Z1iY8?z&@)9OC+fz3kt(4e(WQi)5&=Pror>) zeaHI4&6ozk`!VdaESrRu(LHAJE_Xlh(AOLK=RN?|uk@eXK3nSwRYaCN_~OF7-uVuO zP~QB!+bm@lMTVKK5DgMek8V`yNda(np0sVZW_fA?mWjo&AVW`c0hUM%WC~nN zz3a%pftULOb^vppUh8vPk1!6L*EG@DZw2%KRbJ^K< zGr;;0#ophLFUNN-YNGC*A{Nw@la5=4eo)R$c5Yc}P>mSiRzG+h7S3|j$Y{Zx&-yga z81&h$T#9%KJ-w#|#x6VV)FgcX)M^qK#bOX<8hx=Wh2NnHyxG$pXmrJjvWpEo6X*BI zxVVE}pq^N_`kgkEkaGS#CLSw1qe+O`hH=T&s*ecPvR z7VYlcdk+P>0870qzhC02P5DjrC4Xi`?1CXY=<&N^yjM0#+654`E(*X4;-2nm)8r77r#_Knz>qn%!GEr2SDHW zY!3TORPcqBEd!-PzGY;+NDIWoVl;s`u2EKbG*L-(+Oda|ZbB@@5DbSK;!QRGmaCTK zxS;EIT03!9{~QZfCxkIc((ZPxe&orap;4su{d*11%*1WF98_f zUl!aZaqZjStN1Z7Rlj#ni|^@zpqo!HT66_|x*IUqlowO-1x7#Qh0zlxHxTJ^oVMI! zQQPB@h{9;)?@xa3DNfSndqk!!m0%k^BQ*&oe|K;?85e-z;MLeoKUE`&iz|LmiMY8Y zHR%Ivo|s`r=WSi{zJb8kyiz*B_gFBRlGc9?pNfO&of}h|ySAVxm$>Jn=1k3Z_Dpy7 zq7S6T6ZUmo+wZ_{z5#@@9q~w_`vxGG?hj4<#N@Z`ZL z7aCz}j8%&|BkDoZRd0-SNNCS?<4Lpfg;(KzN>V-s+$+q$VnAc5%Z)tCqAAVbLw|(}M zN2>09h&Gi>R^ok%Zi@Xsm{~65>)bhX=i`h~~_d7EUx_Q5c(6^F)0K za{@bW#1ku;lSqy?QY*(#d20!vw5mUK@aHThf+BqtNt<$O&U7yX zNtCN-Op|^!EgE>CK|^#{LRNvFJlL)gNY!pUp(B`SUrYW-_{`MwN&E99R%KO)lAky; zMwN+uokup6uLg)>5dDC2btiafWp|Z|=S*J^$o zaAiJ+vUQmR@~~`8l(*e%>NqQGKN;-X?#22|X(w0aD~hMrlgon=G3QzO7z$w>UN!Q}M)=8u6O z@ec>+wp>KfLqauQ`)&uRG(ITJUp=05XUGS7T3GTePBt!p1T3mH)6G~Lr6_QfRIuD? zTe<stzRpQ{XCCV` zNhSr!R)}s;fjD7mB8u#9K|uOf2Mw0T;~Rfn=iH4-MBg8lz(!Wpfknx< zAX=n@pJLTf_d!B;VFejgjRAr++c1F#8YUgGu%+tZ5IKW*-!D5f;`|aVec$y})KFE(y0XArF9-E+xrRa}6Dk>o6Hb|hyY?7!@ zMTjq1x04dk@uyc8T(TY#467qS!g9?1q5%gn@Pxdo=MwQfFq2M%|NhO3L<7hSWzIri zo4#XC`b-|M&}Nw&nij%x-r)1^$eGrxf;lUAUf|z#Yt?H^7@Iu{0-p;G_{dE)SrOB0 z`x8}^YQR^b8|Y&hahjjCaAQ{PIas@2I;s!OoBtl`;?3SJ!HTi4zoo?f}O0d-z!$DcRoa}fMU>X z*eW}Ae*Aqgr7K0OO9E?=4RTcx&N#Xt!IEMjLKR@lFpyKPMt*@KIumMC zls8&{QI_@rK=*~GD(V3=1WLhRmc18$E|Qr9el!pcqRh7Fi+KoB zbYp=p`e}8WH4ygQ^cR;FC#pi2Y8#sCL^$jrdv7iT$?lB)Bd^(Sg9H&L zsh`Rgs1$PZtnqXiZ+@tWg(O;Kg(et+XPWHOp~+h2+)wZcJ@y}flBJ9D_;HQ!mr@a% zLt9oxL_Gn1H9f2*d8rM8nXzz*Om4;lY!A)3v3b=OfIE3o%n*d7l@s^Wb0tFt+X{vH zNKn_(uDwG%0gZ${2B9Y9tH1YdR+2N-^Y@XsD@-*}qeD&+J_7ne@|E%aar?dBeB5#j zz!*-b00Xwc(5iJ+-$BdYPzN_BzQkNk@-0KbbsFUU*O1<_DKWa+p<=tW7F;3Jm4h)D zo0$DrE;ivO)JRgh+!}@ACsVVBtdv7`|3aXD87=r=x^ucLp8biZU2tAJi=W#T`T!($ z@*6r&3ES_??X!>muG#VY{2SUpg>%i>XsSl@F^xRs$gzR% z%0z?aFYk8J;UIX_vUMF`gt+@f^0I&+okpjI$d&SF>>mM{%)=KktPpuaSS4))VWETq zXGC3 zo$On8Qg{ppVYlTHOu?VEcZjL(l%sHIBT&b5hwPpOYY>%O|)mP;DTp%`;QLJy-)s;>54QKPJC1Df*}?S5R~HCb~!zUo#a2)q)|i}^^f znfpHiA+A|#xrDxKDYYT77i^9qCN??)7NPz zFxT6pF?4=*;wByKm;qw3I|vz9LTO_03&6OnMI2vb?YQ|MuS6%}R|srlP;S?+9qa_d z#>3O<7~;epI{z{Sh9ihcTPl{9_fJyDId3NnP1sretY8^i4d&rJXym z5B};(B;v-me$D`OM24;Dv`8%=pShx~Tv-v>Ig!O^L>=<6$-q^Zs%{KQpbCXs(SS^F zl_SK1TP+Ic`CayQIcdphk=|7rjyDcu<2bp^%TPr8M_zIKgiYiOIwDYc$j#s@Pi2-C zY?*YSB>E`)R`ETqh$JTb-@GgLR5+O4FIQkT)eI^v=fwUhb*8k^cYLeU)km)A@IgA*&f|=&r1>XA`|q9!c6}Ca}yBNuHDKWg5Xdewl@0<>-D` zmxxH_nPDm={|{1cvY`LcVz=5_1@UdtiL+>?95<4nsujD%lvRjIK@J~L#J8K^+(!we zU+^A1_CkGA9kt^5idm(S>1E0A+Jb4f9N*AIC4QLbOs!kO(_UQD-SQD2JYXZS=L({A z2YeanmQ^}5w6yhicrpe!n}QM;GLph__xA`}xmW_iVX`n2ncoE0hmOkdZN!{4_DXbP zf{6yNd>#9^<>kbXK{@uRqQC|rp~p|B%?vOf<-^xCb{gxiv|2yHHPIf*Vdq9tnIW@L zZbv1}F#8VD6CeI7pWvOjiuz_}xOF4NKg1*+uAGzm3oY}Ng&Q$DvLX$GF^@w~dTw=c zHMi$Cdd~=TW(HShpVac|2pLOyxbUxm2)ht?R&E(TxT})OuVsYIEGG5eN)Y=)Sksex z-B3@GmTIn>1tX*SZHksgOihI6the4<^oiPrU zpE*Fdh7!gg{?@^&Y^%SpZWCwPkEyd(%TW@Pouv?Sz*NcQVOmrx^)KOXiEM?B*9i9z z3j@R#ptij^Rvqv({R{-aLvY;CQAbC#ueGfn_9W<$kV71WI`PGp1*+^gZvUR*Xcoa3 zZBnlcD`QcLyoPQFwlH?U<(qJgcVT@h>l00mp#GZWqM(G_8;sU3y`S@JjMR^mi?Kgb z_RQ?$HJYMc3~D+lQgRJcB%#vG3p#PJ9&9W0@~Lo=9f*wk^?R}@m2V0gd44ox1H}6q zBn^P%_MF`NE{yFZ5hR4k7u7n%*7V)al@a+L2hbk?nb|paIk{i|;*Z~G@+0rq*=+wp z2Zq)mMkGl^mtz!hIT`2g2=^?hFt^5V$~+M?hv`~s3cbwqSma5tH zMnlb+eZnt$>H4vw8&Vv`(*3Ai6X^b%-3rvtmNtO_j{+wAd}7jKHP=eQLoF zQ)35D-SjiT?CukvmwW)i;u#J2tHSf;M{f>{m&rXdp{@r6x@#8NlCK;wg^#4}eWl%m z^;1~n(8DjFh?bd1^QmxXKkul4*5W~FEjLJHQSbP*TF$EFI}VkSYt@V76lz%RcKN7AGW1YZCTTswGqO|j z#7`T-;r&_Z$|TOqB6I5y=fLs&-*Zk*L3n~8elx3!*B*bsbfj=8qiFuW9m*fP7>VvN z!IJp6;j;)Fi1exkG&fh)_dpAi;h|HJg4P9ogq!R@l_kAq5}FL=n3ic-Q-g8oLev|m z?~Y_=STBAH37T+ZmW@8&C+5c7xni_y>y(I_g%-G>)Hm~!`cBf^sOA1eVnAofF{eb4 z7PJ-{lX*X9Wc>|folqjc^{G6!WxLKmk|lcI9h|YDF-Ni0#5*%(I^>L~d;@0jQN-yg zOlXc9FK)`bZyCV*F)3vMWn$Kyr^zBXf1Pz8WektlI6Jg(KXtz9=p&YyZ=T zJjPn`b0HOfAswW^p_rLJ8KPDBhv$L;#K98iZyGqmy;pv58MD9__gMuzWzltYibMPj zd%+~WBTljsksTWL(p`}NrJGK<3f;Y@FKV79f7S4sltmUY^%PH~mB4kVPwgGQIZbtv z!JL1<7nQX}P9@Ijzfhv6Sij(l5|%rP_Ih^73r< zRI1blIC(T;lu}V!B$2TbSjC4pj{nd{S9psX+NQw$E3K)`Rg~zL^*i})Cnggsb6+*I z$U_MgqSo-7>wTgmZTow2%$w7pl_jK^^ z)(FG8qXn6N5x}mNOk6#JGMT3*N)n63VX)J1^#sRCY~d>bk7!Bk_}>*rH#$$rvTZnl z0S%ma2e{b!C1J0^CiL}9F?pT%#NT^xL!)tde%+Y%8T^P|2Yq zYqu1WgE9m(nX^4keNH}a)@bALb!l-n*TgP4Be$FeRKc)9xzo6wf0Go;gnXxi9zB0F z(BkB+{OMK-IMi3gMlls#fO|W1A5cVXqo3$+2qc_s?C}E$qwnT%LAPobWfOVoX_cARi2#K-sQfFac%~Jkx16$(RPKVCyKMcQ-aB$O?19%baFa(-&@h4a&zWGhKGPaG`H`q`dKeTV z)_!_HW}D7wc+z7Mw5Wkl6zF_w)`7o){NF($79(`E4_WuD%BWNTb)~t#X)YNRwl%WK z_coEV8>f+9aAVe`8TcwT3=&3+QFkpZZ^^jEE^^Xfup}9N;mF;XX|9dBU#(d~u*Rhh zFBv<}oOp(iuD20Ahvn~c4#dkDu&D|<*HjM19q?Qn@+^NJhtHs>iK za|{bheCVqmZ@r>NTRnaAO0fV+GDCh&0R#F_$j?(8$!AngNsU!@o!k_fJ-+lY^0vlr zZAb$jKm!V^yi^OuRbIQ0#7nRD2mZH|#pMGvyAAlEIr+Kfm#hH4f zXt4Xwb15KAF~$dAAJJ(;7kE=LDuZ!cv2=(h*r5`nAMh|qEwf%}`A?#eVEc!dh`n0o zJ5o%zdYKzRh4N?@Ou?WNzj*9W@&Tv?1La-!1;7p)Tu)tV<2WRYHVC)tgp0ET>X#q5 z_r3&1zU=s>XJe*cH~YC@pGp_O4Vk~2c0GkNDE}D#J@l_gi%ETY8evr{Eb=Mj9u69H z9G!GMe!6&_E(eLD)Z#+%kwo-D6HIAdEfv;hq7og}v^2stE^Uj3w>1DgWs_94tBbG+ zMZ)<<_9VFBsdUQ#Ti>yJ210ifwXsBbcTIZJJOJan(}E+D=D`nv=9v>AJ9?^eYjh0z zwrw#g7k9{hR-a{EF(j#ExZlyLyX{<6V(n63(WaO8dG8=+oTm*_E7?)TPCYi)2KH1U z|A2IU1HLlkWPsS*UUR38pzF;^5bn=IB$WrR{_ti(dn)sQzJO2@%Z}55)$dJRvye?z zve?<-iBM|aDwKG%FdNPdl;3t`bMPYr5e&Gt>*L99XU+Df+{po{BK$Zhg2MkNp?;910^9XHQeoHQ;^37jCY9ZYEoe}SV*?D zI=)v^75)pctH9uH96<;0)$B!B9Pb|=HWdFFM=TOQ^r5P7w+9)8%&Td~zHM_gBC!Rs zuSHX+Pb@RQaZc(bcI5mI0H{D$zgKG1fdo>nMq--j+e%i}6b`DO1JoPgbBATv72&7J zHYRsJT~K~C%;@EdW$39Y06BehLa^DpJx@r3eQLDVR1GGddt3&QeF=2^wBA1 zxP*B8qHO#J-g^ZD_f3hh))0#vq^Dh`s+bcWwd?W!&W%yh!!qkxF={{X+? zWijg>9ynf8*-pWsTPFl+W}VunYa$my_IhMoxpKsja0N9UWL)|8lWTo~)i(g`7^_^2 zTcTg%Sv$vc9})$l&r3I`0MCVn9b=M`Geo;fKGfYE0)tF2H*g)bYFB9_*zW-sNFC5+ zk53SprG)Of2}}+S0T1PVN+b<5iiVbg(WJ~BMcLT0k)^uZq+z#9mvWNHoix$*c1nlV zi!Q1Hrnb9xCz7^l!yleD01?)bW^LUqEr22v(~~SQ_AWs02}K_7F7r! zG?0c4sLR{AtM@=6&~y_5uP8Nqebg?snbyE1=L%!PjqfX$h6*XBLZ-9fK0Tt zwzF5yQcS_DC4&bt0o2m9RskdclLigWlmgVi59(P7gw zczkCJHMw<3J^AzqK68bYc1R(BHva$sG1usDcDN7oYW=|GSZ*!XPuH)eEw-NAWyG1}iB-~c$V3S8$cliD9HWCsq*B?=)kiLJ94p3#qN2|5$AEXtZh2~Y`* zu5etm5_!oh=j{Cw2_7D2!gi7PVzi58QT<>I?eZU8B;%=YcQs;-7keTz{{VD5{Q>?M zp>tcg0bDij_(47ZltP!Y?Ar+$dVqMctv?_7ntvaiumg;Rx@R6*{F5!fVjZ++&WFyG z&Kt@#Db=RcDrM>EdT$S1H4wEGpas+kF$2yvz+}a-?Ja0=(D3d|$AFSIwa;@!5&FCP zlNYpo8J0~|f)rO8Qk81Ofhc5YMTm&-1jP8GgL9&3%GQBib`8+=4xcLF|Qyi{Qf8|LZ^>d0p(?ec6 ztexMh(Z6+577?GI`M>PE%yTU*yBwqs6s=tR-B5jTErL(-cd%USL_grqcP|&62=^US z4wQ1VY1_+NlW!QdE%|<6`MFo~U=GP1O#|ks=DE?B`}Nv5Z)I!zy47@Zd=>gOA) zH^o(d7GpS#7iy~4&9T_GmwkT)0}-N~Rc1!&PsHP_E>-n<{Ri{J*ConhmmQcs4pjU= zW&9XomrkTj+7Ei?D@tZJ{{VT#ilDStm-4e(n4L0Ddi&`xL_yxd;y1vgJ(5vk7Vr~0 z{;OUC145(?;7fV^)|+n(e6YALXLwB>u1yYw2+s1u)16RKU^v=ji;cmw#l&?z8Em23 zZk2pRyX>N?NN5(Yt5g2UKTBY(-3aWs%L6hk5q+c1dJ*Hk2x(Ll%}a`koz^2(`hbZh zE;hKlh=b>N4pQAhCSdKMslN7eO@FDI`j}NDjG-!e)aDJ4Y5E% zxV4vY1U?^6&*$TUg1J?vmIw3wF;Y~3nK^Hit5w!jMw)4^qqlSb2oNQgQ<7|pEI?xr zj6fVhD?tlZ;u)G0==Ky>?6s|4{*za=?83P<6ay2hO0JdDrc|(;3|f<^N<3GJ$oP2A z^~IG^hJL;!Tp@Xiht_dgMYJ-q@9_LaDx@yz@HQy#-5~%Znux459V!-^vec=6d$Lyu zF2z9&fI2`3YHhKawQn!Ud5_h`U{abTf3(#^z?~*Wqft!S>Zh*IaJiL*`EOq|!&u*aw+bWTDwTOSC|H)I#FMj$!uA6~Kw1cF6CKFY?J(PrOJ?u=*2 zT2Naoip_#mYMi)c36Atz%un&~!nxDA6&B#=2-HUH?;BcT*f4o0ZfHxKTZmFhY^q_6 zIM|qA4d&mD7-1ypm3RnO4CbLpKvgbfj-qT!xpI1wbNX{aT*nBv$HW`6{-_9gV|4jxYMZ8TEOeYweZ zF_R#AZypjL{cu*0Qqls{cPYYyD7vgFlc>h2=qzQ4Vn8Gd8;cBCP;9xc!y};lf1U^e zsYBT&!hRR}2>dWj0$AF;kjOY?I$AXYB}lL$Zd86aqny&xEnSUvU~7t_%p5$udW|&I zT423IS^F?H)u>!}U=h4EfPE7ZM(4;}D!f;`8xP0C(6WP9w(hvm%W-x4qic*Z~mrD32|%UaJsyarPf| ze!mFam_5(VmsxILXg!TOVqi@ytu0^SV@A0j<^=i0g6uFq+<&W&+#<6V{{V*{qX*co zE9P^o4|g#GZEseXCP0D|(HluK;ffgW?fpa2{^@}xDdR>v*1!6o`JNe>KKP+b_|edX9z*Vm_;BrQhMzO`O4(ex3wAWkfsomX!Y)7Q^^K$- zEE&bzUVVZSIl&k~cO}8) zYPK3^FH54a@VR6s9Ayi-lDVtPjrXciQZ3yJYs>*4Zqr~t9B`KSF6!%wrg&)UnE8J~ zacso!RmwT9&BAi_Ets3c0aTD6-}^Y;1ZwL$NgNBgC?UMmHF9}DwMvXUMKSmnAHx&d zQQ2R!BQDUiRh7SKr(iE_Z4!L8#CEu@G2+7 z00OS?P9UjTo0AHxNia{{BWUyKioLed6vT485~HM`h}6d5MuZZ7bZa1d0N)l0yQ_Ih z>;XflC?SHh$503aTHX*3o;ZQHRHttdSc*xtR#rXLuot4VmIA~xx zXe9Vug#AbK#D{CD;xtgd4`t9ufXWyW3>#d7*7mm8DAfdtOdJn0skFBGqFd4kKOOJ# zBNZ*JLLfJxPP_`LpoUSrZF%#Khr~!GY%mA3yJDG*;hTi}%Y06e7NUfH@dIfevfK5> ze6YX#iqek}ANYl&@IGOtu@q@3-p&E~Q(PoqoBYr7%^RwjZ?2 zN6ZiFj%0I>)>XR559kReh$d8@?8pE_Ntv{4!(sFI3^vZR4N6`8N!U`Um*M$x!%Zrp zHv&wb8`QDrBL*eZh6HO*<;?J=tctmil@x1OL#PHm_NHlq(!ErjLJjer=S{+sfw+D) zhwL3GCsf`AP_36!Nq`I53YKk8tg8Xt z)2ODDDo7zilTsO&1PLYReOW3D_W@@tQkx=8gAv`mmr)8@{X+Z%U`9ZS*ow89$+m{p zRY6fBd4~huV?KLcFXRi?MAlspx_Nq9NxKCEm<53Mq@5#8fCQ7YVvcsG>}HBwpE02K z6u_Sa7b<#seMT3MC!x`6e79bsBD5e=s6cdQxsxaxQi<5Qs68g}=jR2hei9Cd=-`ax z5_i45J{>KDM4S_asehcgIdw6oIzc*h`_a=>T6|*<#__=@;7Heg<(l&kFOb%gG|O!_ zI+Q^9emBFdcuE$Xd>8DW12D28!gU=n?)Z`5eFvr3Yqcp^8=&xB@$id4=y-URN|kGpTK0`GcG^MFB0&bwT)z`qbt_XKGPM%AgpEJh+y`V*tEZx)U*2#4rdJ&g zdJ9@hfjknfW3kf`&R~u7liox3Qm)WC{{R9YW(8Tnq)}JG01P7@;(%d{Krwks4dkiu zj+iKM=9hD7^hNkr3l5c-u%`6TH8kwfr)t`i6eNS$!ji$e^BQ1IrM8EOLOF)OA@o^{ z24(STDvICgdlYc_=YB+S88 zW(Dim83+}A=bb}%xRGP%Fh-IL7>bMEP+Z5!NfF=u8R zK=2BT$nFk4C-zMIJ2_AGDNpZKbN-&vn7|z857+DyEn`3M$C)XXqN!QYmtRb`XntX< z@8$>dTdf>i?^M@PPOW2q@~S_rRi5iM@C7O&pW~NL`>|Z{4gJacqIFXpy?`G?D~a(M z!HTi2PML;vu#pA^X-E^-NbvH+wb7Acy+38nj!nP0h2gAB!0L==^as_1rIMog33K_CERgRm#0;CP%z<=9;7 zB9*XsPt8ag+@RjbhZyAqO!Lt-sFep=6Rbfs2udUtj?kb-2287|y9QMRc&AB)5(XPP zk1bD!*&Wy>#g8$$?Eo7dx(^g1+P4QZnvSg_Qa+s|kTjH;l^cR11?ag0+WO!})erFm zWsi>QP=1PRjVf7csZ+Klqb8ObLW**rF;jCQH0lH$EY`eXwms6=EzxI912DilHMsEP zrRQE`6+%;{<<$VvCjM{;3}8;>j`zXiWolM*vS!dA3to^^)lC{;!)aj$tWQxEBzeSQ z-xbp0-mb5T?}_sj5h9LWf-qsYQVNh`t9Pd63jw(z*b`uV>hnp1ijK66wx}mP))N${ zj}R#&eGi{O)6WI`vv`y0hxx}1n$hH_@ZMsml{-ZUyAqHEGwVz+Fn@G|)MC$wIk{~3 z@k5UgSp4)nD^En%U)tqR0ZKF!U%U%6%nrRafh9)5JHX}+j{g8D99G-9Tz;5XJy5!y z&~uG-WmD9m#iAg1v*4zGd#sRlM7@C+aX!8%DtZyq(IWS0z`juaW*FV&SM|%Z1@idLQ(E z7R7^AGle}qTc~<`*+=0xno*rh+@nxmyZ&=Md=twZOS7u^&R=8_boJP=+u$+OyE?I# z;e{LnA9z}NdY?QA`y$3{t69J_pBO)f=kpi~cSSoPl<8Di{?R}aeL{Q(L5rNHl7L*^ zYr0(BR9jd#>Id>4jw{r#@I)Agjw|+SnVr}%vjrL+A(1mXr)I=UTmsiF(jd) zJTbfU{{Z<@{^kBy8QAzDGjZY;$Id(?Rmf%8G_^`f2@7^;q^(hHJ1nvDNZf&p*dALU z2a4Imus$G0;bwUk5D6efS8rbBD36HzF|GDkXs$yx9I^s6R0^vsyXu?wr|E9EfGbsN zwfNFvh&|{E0a2&`0SqN%ZxemTmI~4=p_@iHwIFIah&rYQ(m<2*{{VbiGotA?(Hr3T z+jpU$%n~oQ^S|c!hYm^_BZ(6q4d)#(-Eu&WyNY#d zv!|bD{Ii~q6Gyb}V8|6*&Qh|w15T5Mrz;h8x;d2HR*g^&lkaXc z3CY4qiG8wG*B?*$TNsETj-JEZjr%m_LJ0-r2Ve=iGKMfUHSIU?kC1Uhgv1O4Xco(s z;OkX;Kw+0kz#Hleewt6L`C|$AiXbP1RFwIffq+;^_dy3t8>l`%3G4BJrv&+ePFU$? zp3rzQ(iG=gm!ytBWdd02CYzBFHzr3;tF0UEmU(XJDd@_qDT0c7)l_Mc&@K{x!Uv|r z=rQ_~gV<;)e8ZYnK(PM++EN6X;f9XYZJ-tcR>15D+YSef5~3nON|mzz0Buo`fB{+u zzXE8b&u4NOTcVM0CVR#&1R%CD4}uF@h}0tP;FV~CL=egW?!<0!Z~_a7tyQWuDXCYe z#f^`-s^OS@>VWJ3zh6vABi?zxVhn5&&7=&r^@M!Tr9 zoKl&x(Wp=F7XB2FVjG`{Qbc?Lhb@>{TWLC!L2BivPylpN%!E5Jp44N4cT&V3TRnbbAZJMc6a*AT-Ni%K8nf#j@ zxlrzsdDtpkZzr4WT9ekM+8LKxRIK#dNr|RH4NB3eNmZ4CK-&jy6@XX?XLO8?(4f_6 z>5)>j9afD*n|Lz=GJj_l>RWp%erffoDwh!AG(xg9GVaJ?sb*3n6(45=NFW=Yvw`(5 z%nMyW9jRaQQDq_VlHxuqK3XAdTrh;7if!H$<%!h0kOiQT0ye_|lx@!UN%e)on;0GS zs@b!7T6E~;ilS3(N?oZa4gt&5)JZ@XNic6W$C(aup72Q{S_f^y_Q8#8agYEySsVN& z)-l8lIdY@#9VX*qVlQlZsIMrs;Bi&fJ1;eFJM97L3R=>e_6R7bs0~0t2n|M(JN?~2 z^lRS(iwxMyvY&|A;Eg^x^JL6E0Yi^1d~`xH*_E*bmn+^fWVea)!I&#f2opFyh`Zve zu36p!2i9O}8to30BCWC+pUpN7g_oh0J;q=CUSj+H%8bAy-)UnWmG63uI>uhr5-NU%gbTvG>kfi&q zVSQR>voQdHwgl;z!%jM;qr%H0b1+y%>GM%wdrY~FAx4lI-+FZf@;-Ok*w4igCR~oH zTUZF)25z!4Yz0E4S18F%D*(ztQo=9fA8%XFOJXB?K?X+xqG(>=L`)!mJJ2c|GP(oy zcGarod?WU;r}@Z^#bf^fr_48Mn>WW_s)e`hFY`FKnWtpCpm5z*Ze$|S{-JsQ00G7G zp%~OPIf(v9{uJ@uVvejRs&gaskI(oGcd@I8wEh&RD$n9Lze5puU znyR5CRSPPKSP&G24h5rMK^W#wKnJdu4P=-ge0$+042CYP-NdRh# zfxZ}Qj670~ib1$kIDTc4k^rS6TIz%(uqsNGbYe8?S+FbvBK+i&vfB1#WuvuaM z04z5_&?y)49VR?1(MqJ+pNDYuBu=3{0TaKN>G8ozpaE$M!Oc{p$d^>?$N&ixf+D#P zJM1L8Nz~F{Tm)HBSSNFO_orWTQ3GHGo!op=4=?g#u?j&FK$#FGH{TXBH<}5F!*I18 zHSE(jkgkhDvv$=ft1D#cop8cR7DA*E9pSgHMP__umnPll@CTREH%MID!*dCks+qG` zW|e@fDz>_spcU5A+Kz&-WZDNzRt%X3RatwH<;|P5y1mH!nsXIJAV@600$>3rsUQF_ zSHCW(Kw4(@pX{abRXaCrW?+wEhoqH*IWsT0!5#iqO5P^A``M(@LIE>h@Wc?I|r5dRc%F(Wq)FhE`oJP}%0-h&b}S z83r;yOpbT}jSY($*!eG8jh6`?j195~v05GpLZ>$5dlaXb)0}h+3!2QyP}6#plCeTr zL%lJscPmn4h9v5~EMb+-h?cjNZF-QEjo3b@2>>qnqu$R&2CCJSbgKKbhr1*1U&P*U zo-y*ZfsQtKl++B2l2|A&pm|e`1z30V_{|9({jbBQ!8L8Q&PnB3eq&eHX>vg1~-+DT?>X_3c-76 zrn#(-jpavTuH=xV#hCQ~ffHffYk_FIT67rdkdEZ6jU8A$fnQ%FVasmNz-pNA|Dxdw^W zm^8@}RH%p*NR=Q+1woL&iyINV;S(Mq!{Q#FveXmc*nhTf$M-|3wL;-kIcE1&2xct%xK8K61W3TVDeay6jO!>zLt3F!VrM zgw?m(RJi~{0djPXlej+thl4Nlk9C;mfuWJ!%l2!R>WsJRJ+)H3zv}VYHm!Y$uc(OA z+2{u0wQ9DQz7{exP1Kf)%bUvU)i5G1hpubg@n!R?^jb&gx0y5J#h8~&#Eg6rK4r$19XwcId4vNRv;Eui&#Ko`HzQ8ZpS6ZYstPk zeIfkCm=vqn1_2rY20Ou*Yg|l^FgL-Y?Ke~>_FbZvgVOFw)-=y}loR(B?t6?QO35=| zHnt`3vHG|o#fp|8m5!jPHyfzW3stmras;=Im_R`DBhES+3?zJ$2c)Oixm;?^BrSK5 z?+q(9F>dMA*K7HB6k#Jg5FOGJ@N%VD$+K2y)IgNIzq?LmBg+LCXvV<+<0W?PQH~I& z@3;9J{{Y}HK@jACW^v-X{{Vw8?K%Gd0}FhyZme=t>k9FB0Pv`9;D4SwAXV!MmZvQU zoi#qcUiK#_QPveouLM!i$HBk<0Bm+q$#+;)8o4wRzTISB=5aYf?CxFU=m7QvZ{z%M zDFDii6NxB>f8B3Gg$m##?Gwx}9mSmiX;Lm6n_KY*SMbD-%{H?9;HNPyqSa)Y%+RHT2xHKUEL*B+uFxZX&Uxc8QIQ$Y z)O%AUY1072g72w779b5WObNaRkThmjE-&n@FOBmRb*v7yQf!Q_6o>#Y)EpECbE`-o z&c<|53^LHP#rQFWR(pwB!LA-L~Vd``X`}tY2@I1%#cdn=^KW#+5Y-YbpYhtOx|bMLK6= zq#SW4f+IjXt!I$AeG`b%qgCnE%QMz*d=$Uz3pcUONT!^#|~L1+q@oU3MDvn^UiiAq%7kYomlq$<#- zTU1nNYIOrsB;x&GEI-&>TdSb;WtUlE!{jnSi@AgL8N2w3TbFQ06NNW{+$f zr6%tO&}o1~fTKYl-Xcsw`lFf|g8{Qce>H$H;qVy?KDz9pRK%tV45gM z)p8&(7q?HkA|&c!Ol#wI!3rsvD{7TY=jfQhn6_bR7gzV_kp+QWLLA*}MeIeRao_7Q zH}nr**&UcDU#W5QA9Rn+f1(*>L|n}!(8QmzB(p}Vp3p=BV0D~N`uPJ`{r>=D%Q_j4 z)I9$H<^9q|d-OA|%E-COAn7S4kufbgg7&K>0a17};~29)5XKFdz*B%WKmc(iC}fHk~^j>nsRi+Y=$|DO*oxA3Pvu1 zGf4QvpceNXY$Cir^j*zSs%sY|$3>$_zvZnlXUtjx^_d1RtN#EHVasyma$-Njvbn&C zTcE4eT;-o&nf&vNnlX&B7N#qrQl^Pks}>5>YSwlvrE&cO zCK51am9?!bZXQeZcBfe8Qk4sZvCM zZuLjTI`~NO7;VoD)n>J}wN6pxL|X3op4BOeB!ya3>a{{?ieW-lWl2|MmhUnWuA)M+ zkFC&ByQ0;1%6yBLtC~u68R^mNb!s6?0BaQr){WXE0n=<_^p+|}VJ?hWy}Xw9Md4W_ znO~r~|rSDl*lX^+*z{cnVAbex`jq4C51``bJsY=D27$(HG_1wlTOi#~5`{ zJTCp#1)t!|r!Fi*8M>{bFzaKu+H88`+C=*Wc!92SOY~XJeV52Z}MmIg*NHw5x*U^y!&mBptT` z29X{WHR#+YCCoD&W%I$2X1dd|3|V#Kk%qZ$nqDJD&nZH0RfuB9W4Oaskzyo!BQJ@$h}d0U znkF7LK0wJ`lpW1oc%vNQ$yBK3YSGK)(>q3+D5sjGOf5RVqOoONZvk0~L1QH*(*l@T zpDbbWvm>~)@cDSI#YD)TmN#YrjNiuq3TdB3q&{C;Gh7jtt5!PVoWo2TgVgZ8(p%y(bQ?`gLt6k)% zxIXET1c){&dW&_j^Taq>vt3I46sfHnM4389!Hge1o8pC_0<71P?Kf5GsV*b{#d6N1-wJoDdL(cTaxExtX%&xeUqMQ#5rdBm2t3yc(@2 zvk(X@MEkKM4d6RMrk0=W4?dNSX0wIuYEai2wZs0gl2(0XRF`q8bgCkUYHEmpCIJs- zfY>S%nbuOSLz}7`tt_^p^r_Z*i$Juf?HG!VwB{vd}r8>eFSe0jgDk{h%-;!$)`!!|wE)a5PkrVQAbFoT;`_l`4AGsdpH$8i``i z6#=x`NRuM~%0aYz)+rKBY6nd}bc3P0XEGYf#Gok31W8aC#6cv52BPSjzXU=7AXRv$ zCg&CsO?$@v|Nr|XeM(e*{aQ#t}`lYy)w-8M`iY@ zQNUHph7F`@)>WWMIJ9hI#f@vlM8;T&YqYW4u+D4FBfUb4*`Ri0q)B5*481yfjmZ?s zsbUFlc-+nk23L5Yx!KqUC0{L{MOdjyvoK$?2~wRkrPK$c^tCx87S-CJV9-E-Tby-J z1%%>y&gk)kGm>#|xo8f{vz4!x13rkEsx$ja*y(8ZU+;C{yP^FdOtEe*4A(+mhi`i7B3+bICwL}79NsM?$ z!7JvS)xW-={THx~Mlv|{{eoNLIdf5*qB*@0q|Uw0(!oez_S-sAwk>M@8FyZGl ztkVQc&^P($l&k)jS-`|pM9>2&wINecg93F{(;LYKZL}OV-im9$?Uf&zY-jsms&v0h z3ev$TJ3=*9CbI%aj_RaT+;!9-^t|FvL1}$y^!?F?Oh=$}1Izvqg#9lY@2YG60H@nh z*K3d!lxl74vTcO_0MZ;zl6lsNzt2Di_P_ONk>B)}sB^EJ8A^tgRiuYPE196n-y={O zO6v$|%S`JF0(Io*r#lYVy1|*Gom-R8325zd}KSJr|v#!==wtnHgO;Jsr`+9l6e|g+O_J`G-$S4vmaws=Au;D zqMJD+NfsAVb2oDfgPRX|o4+kkx?2+lHWs!gSqAmdA%2&>+cKO&u356R-O_^B*Q$+V z1hZw0HBiAOO*ii{ohCL0PTm4Hhds{+Pyk+I6OuR@z(wZFXx{_Jn)x$1p9eXqflz8w zJtt%*@bvM=s9>f5yqvDN2`cBa-fn!NRIa7I+M%c1b4{1ADoxkk2lbI?8g$L|TIQbo zoPa*J_Df|fj6azp(!S{b02TJC?@))STof##DjKXvDrRc15MTna15+K&EfYa)*6Jnf zJht{#GCtDWGgL%#3iOPsSy+MrI>=M3f>~6N?u)@Amk8Mf9(I_69QclAjufrrIpVXe zdPguRQ_LD-qA*=dw5rWLMn&n8TEGHSh>iJ}W;0-iE-pz9rE!(bqctI_okpO{gINeF zE7c86)4JffCBePBhAvJF9M}V%MwRqIF~1b%Fd8>r={MRvPR*(16HulqBQRp5nzE>B zO8AR-00a*l+!^by5bfxJ;mK|EgMTa=gO6(j_nv7VC_CtOCFwNyYFBQTwDj=Cl!y9m z@GBk>{bqN#Cy!_x4vj7)U36)tncU4iBTQ?r3l3IRb`7YB%2T{5sCi*)s{X3EqRM8MrM~q6r4@pkdyrpz;h1GJS* z6xc4kYf7Gw2-A%WOm1{fYd0c-&B4miD<1s-I;_)$W#r(rVY z>1rswEX74;)G2}@dz9k)YycDG<~(t6s6usvMPK1H^)qV-d!5*T70WMsy8yP8WdWo^ z6B7k$<6ABRdtXj)k6^hc$mOfOW=fT5(<}vARKTkA%~%DK-6BociG`UUA3SmM3Edk; zm+fn9xEPErdEyY>di@UQWzKDP z!C1$%o{MOc;qNY+wBC>GUt9s?Q?$(&kA%*tpi_mA?^Qgb1Om0d!jH8%yz zh=L%2px$A(T|(e;JP}E#7=A7YCUU2A`e04nFzu8)LQ2eT(Qg1h3Bf6g0FVyJ$0?l$G}(6`QmEA_t4VE0a|+5kjt-`3 zA${Ql+(zJgiz3bjwPj3kHPYq1ERV7t^b(F{qC58}p5Ze(yJc}AdV!?dteC{-GQ3QFAYMTnh;6`^vM zDy3?lt5>O+r(TK@X*QQiXr*+ju&B`}=)r0C7Gh*!QvAK9fkiSIoYTp%!E;X``mILP zR!X!76j*80pfdK0QFTDS-X0K6sFl5IKnRdKsc|GF`g~nAGa7|%8A^6b8lkRDrDR<| z8xRGC7z0X6k~0z&v70pka_yK3uzO0(+Eqlc?owzGEMRFD=@AqLgGDx7uIm0#MMf;@ z)eeK*?P|y|XD?GBSU3v{r?W!=e$vp&zGgRyd6;Qk`cMa|)amMB498U1_f%{yd<3a8 z6Y-nObW@bEx`ZwBFJSqKZ`@rbqP<8(5Q+_2CJ}z>4(OTcP7Phi8uL}Ng#iG%N9`>j ztM0T7Dv2yeiPO|x*d1%4C_SB2RWhS%cN<7CX;37OBGP_10dcg;S}8L7KnqVVlgkMA z8#7RK4^+i7ymwc$5NCf(V&MsrX{J2GM}Xhnm!!rtMFcQ$qT}LrM>#V+P&(BDiPu7& zS3^4kp&FS41OTkE28oNEc@LD#D#%}XsfCsyXL5JE3}YOG zk_Mm~R-N?L-}yJ@zNhwE$#sgNF;dVj1)?rIaOXx~B*Z*1yjPX!Tzqi?^{w#^QKl)7 z@F5DZHqe>ivX9uI$`I8&3ZK z6ESaGeCh|avRi%?^@!f%7!q$w!Xf0Jy+Da=m zL}L{mu$1hJNvQ#uAbZ$uRshXX5Inj~I2Ct<^DFjCPg!7Itui+uLRHcM+(AG^<}En$ z@?qL!F9NpuFG(E4Ff{AG)gy6C?OB>?yQfg5und?Je?u5)(C=%{ zN?h8lmzn-06sbHsvpiMS85vM7bSRUpOBEzKjUWvK>TFmyv|H?i=XOKA(9S1aq#Z`! z$OM37>zJS4_+ae-rCvxY_FtDX6;wJ?sOn}INe4-T*P$?G0K^&MjOBZPDn=SvKyw;M zLO72Gt=g=D3DCXbw`(keAZ!GZU~W%_gmN&qLOoVY@W|KpntckjPk=k+ldu%(Q|+@I z`jx3Cc&=JXsj7`_A`2@Ebqpq*V;M8EZ%yEP)r>EG9l0ywcH|C72Qkqs@1>JaXKI>t z6^Nz)S5;-G)2q8ovEC*dOHep9fPXlou}m+K&L7PHR&u-<*M7~En*j8fPTlK2b_K!H zxSfc>3)+Grax0O}3kF(D#s2_qnP!+LQ8|Dj$6@7jY*fe*1TOAHa-4aMS`^(Nc7az) zMI}1R8F&D;%BQRVy>N~zwG)Ut1*w2;N!Zs7NlDyiiN<2JW+PQ1G*e@Gn%L7ZH#!8d zfJlM1Qq;iP?5Dz23b6PRaKx4)e}PCs zL#B)lZCYQqcK-nTo^l|M_?CCi?^L(I+Zosq{{Z5){{Y25iWQ2!{{Wy$e%CmcX;OqZ zVwCD3Dn+AAY<4$~jtkL|b!>i>WFMNhP0S^hJg&L~Y2=xGymG3mFx_l@eC~nFu(?!7Dro#m8ul(Dkvj^I8T_py?sF5eBx$1D^O@)~D)2V1&tIG8q%^HrB zn4NUg4Q8VP>sb_QLm;lZYK35Ji7%masgm?kRpk|@nKTP_vQ)gID zM~yHyCgJ&os=1-MTBpyMWqRh4)1^rZ4RsN8mTMLwecp>2NYu=9%Ne^yik6_s@&=-i z>Q#Vv)(Zri>KYIUxPg0b7`3WUOq}CRvUXKlGgyUG%g}O^m{F#P!kSd3syjeId2kt= zS;G}l!VF;rw2Rif5a4!88O+<$I@OV>>QWVjCaD6zxd=#;(^P<9!4_k=E_G0FTCB_| z1t(bw0bKw&79ozxO|HF7_L`n$NDE!ye$*?_rZUZ&t4p#By^n21qEjuZ0Ht24Bxq*3 zDR^sdWKI@0yFOh{6zIgr*5u8nB(=#D>CicWu8QUBib0%aXqE|1My6DDU|7_MeKD#I z94~8#BpdKRIA;N)fF2x4Hm-q771Jc0Pzctww@G80 zijUgQHj2#7vRb0$)y|Tqw4!qo!bB8gbP7THy8#5G`02onh5M(WbuhHVm<3OE>O%{x7%q>EnD6Nqh@0j>w;sOk}r4eAvx6IduLCswGLZHklkSzz>;*x{49TS`tj zVD)p9oYWePI#o;5EM(GA-CH>?-2p=ox`;1P0WJl3qi}b4OjcL4x45Ew=}Lo^WbGZv zajlh5G4C{uB!VOuo{`fL3riXY1=Bb^OMP_-eX5Uq$J`3j{GQP4xh$R*_e_Rflw`F#)6-2;X&JYf!e2 zWE@_bD16G+E$*dMqnXSH*2lChTvMqaXr!Rjs>+I%AZh^_w9&Qf7KBE{khFes_I$3t zXH^i}OFFB7e|kmHg{Ew8a%3+Yq#Z&t<4%=3N6QWz9E zT$S$X15`s>4Fb?8Z%aAZiL2AkxteW}#R+u)@#A z<#>(Scc$aO=V6h$_ayEi!CsMFXlcv#x=9Q)2`U2%9iw^J#qiL0cEu)GTcI3P4i#CM z(I!JUnG?B#)57=gz~!d2yO2hL-0;!Fr;aU|%hj&M(cUSARvn^{%3X8_8gz(K3_%Wk zN1tGpD27r7zdkG1Ji#=lFegeI?lh!Zld{bLSm_G35eHa5egKC+c)xBSNVUWZZgH86 zaI)d5*}#GTY0*1!(R%_|o};}N+TEOwoEuxm&Ei@P!FmXZ;=YgeJDm#Pks>s-k|Y*V zM#FfGy5q}A?y1?T`Ho|XJkj;6$~WA2@L$m$SffCq)S>`Z0EhrYjg6*8#&P#fiHipK z+ddw(9-YhJnCIde_eC)_52_#SD=1!rFquGFJV4xhB7PXp{8NN<_(LO4!DhLRDZYf5 zM~Q1l_>Fiki23uFYEf6X3dRMAi%5VD{{T#UI|&&km)uBefL}dkIbri{T%jkjq}hta zo|QFJUwHkaC@f9FEV~^<0|evU;Tl>z0?Wk6*3djn4KG!jSLMW2dXD4;aZgP!S=rlG zkOOHSbg{S^ZPZTeSfX4Q(Zco7WX*@5T;s;HQ5=A*Xlv~<;(({7rBrCFwB4$9N{h2L zqkT>yJG+*4Tv-euqcw`q?WI~mEE98rPF-(NzjAKM^MxwSUXoK*3rjUoDw=vobp2nm z2+#<%YMOx)1$){_2L;%9B5ZOw$94iQfxEvzw}v7)3)s=Y#2WNj4=D3fpi!b*Swe43 zf>!SUn<|j#=e!DO3L?@ye6Wio9V^@~9~|U>2-fS!q1oPH0culNWYe}r5=bC#w^9$4V!@m7q=8Vug$g~+2RB(0p6f1Y&HmyE0QXR>mxSp6 z(G2WptdD4K`$20-1H|6zD6PidNGCB-QKW*Tq>V>?B}gq2LF#XN7Y9b?G>vZW<_h`Kh~&WnqiQ9Gy*4bMGY@e= zE2tI#%IaD7g!}lO27!G402cwyOSL@J13-l`7y5_}&%uxV_EYtr&GD6hHyav%#4V1HW>V<~KcHDfE)ZA}AwUL9z_6GE zP4j-Bn45I>M0pHlVZdzj4)*^5?OQmbni$V<_F1~sDVwO!ec%s>jKw;T(_uZC0!Rdr ze+>t>JayypBkHqalc}3A9KK-v5FEuJ5i?;b6a!^YZeZFy(<5W$h8T26OGM~byc;i2 z)j+QeC6T+`*3+mkfK2y65D5faTNZP}1-oTP<8+S7-P7h{o9Y)<&FCn*5Nk8){oQd2 zM3M#MFNL}}Snq{Q*m)W8ib$2SC5=aIS_@dfV7iPB z=^g0Vk3eh&-wa7zOWfBo)L@FtNJb2^CI}EWw%g(Y>Rsi=qFcUz2Xe=*z$mruV{7Wz zMl7jHOtnWxLrz_(vefrlH7iQks<2xL_a^?hf(FV$wZ(amyBBe$s~tosDuh@mLJJ?- zCP*7;IN&HyUB=Zs*A>=Sl_0U3RT@R3-89LIe%Hietrx!VXQKnpzELEy^N~o0}GiVSsb(>*#zb%upb&-c<4I1nF zA^b;$)Ko0WLhUl7Z6jtoi-Qn%@WmM;NuX4|7qnRjZf`Rz-<_@eF>o|NcIq* zx~j9pu|2{}k|35-0!S%i7>6{~f~?02qAf9HI7JE~v(`~kqJZ@B)hZc4P_SCyKn%BCC~s0C+Ll3`GTRT*^0CcHm3C)(92~(8Y8=`Q)U6Tvxy$Ku38sf zrBoX=V{QRw3znBxnBg$cc3|IhQ zoiw}0#16>7^(ObW*aVoYyC)&&@cYb2MR=7enRG)+rBh0mdFicZr833ZG(r$|VW5~B zG?*My2}uqB6S5{J25{{TVI`w*w;oldDrJ(Uf!@{LBuawD2EEKobnuRVW06CB6QD}m z!OOW!ziF6idYFlns^N(QNF+4Dh3Nu4Fw-38c5N!=HNB!1JI*<^tYr~t01d@$V@T9* zEJ=j{tT)tR;u~jVB;VR9emTYE`&BJT(1t;B#iS6ysq0mX5LwoD7K4T3h_^zVnqc}Z zUF9SKx6OwMb;60##hAf=D2n85lGz>gN%HYKa%*gNSgK3}vC1xC35jCn9j^V)CG(v0YXK zkje=r0E_(a-a1NUb16QIi!_(WBV0zFbrtHD(v5R7iSwMUsDCurHLAUm;z$qd_DL7NW!Zu!xDPOr;k1J+Yg;0rFo@F#8 zK~|ioDokB9HkVeARI>=uL52q&Kcq0=9X4B7X$#wK6nQVC`3KtwLO#)epSn-s`S{}- z4~m}#?9sT71)YxQ#$sA+pq}-;(&q2hGF6xzT0p+Vl%BhJgW@st82VmLkm#wy&AFB0 zTi;%5=Pu~+gU7@wuh13o7q+VGiW$a`%vm)-44@G^kz!&Eqe}La<_?x5K_W~AUCH5pSs09+eLPWc zuVz;n0MTTg&Uot6&DRx1sA3flyQr5S=`+<;M&v7zw9li);me_EZk*3{i_Sqf>s$`K z$OpB2^EP`hlpd+?CudDdxD8UBKI$NdV(n!Bl1`8XfYIpokIOK;c%F1lt2-9@#5gpq z3!Jhv^0ljI%8Z((MG_vUs?Agy2E9R5>eMxL8jDV&Q<_UsloExI5Iv@Ttp5PNVYN}N z9)5ZzV{nPD*83#p)0nYc-V5j68CIz}6zgJHQgt`lYo?UI7w@vQK}_MrYw~zB|&&36dQDiHfA#qr)+%w ziD@u6ok(H%e9~g&YSFB{vbq$R4hSF>Wf426Cd3k^@rTVlhc6Y9+|kGj^slnics~Gd z_$HNDtl5S?k3=^s$T)UFd-g}j zE1&&nSI-Q)<>;kqQk|fz<%*3=N`<3KO7^5l`&5X64t6^hFu|uKhZ^3i_vPTU`a1^v zTb$OrR*c(U@Cw((4B+0|^D64>b^wBhLrDRG|5=U$3|9 zz2+WH8arK7lsyV{f(nWlD~asU3m2$TM!g`E?`stFoDvL2XtIumtxhirOM23NA(=Mv z{{XV|%;Yl}#ArEex>jZFw{ToEprTliqg@~>(ODr_)Dlj9Bc(cwLvYV;#&UyS&pqik zh3K&?O~f$hH6r;G<;}d8`p#F1=D@mf3XB9?_SLE}fw_qWVm9%{OEHEVOc4{IXdcUH z*hb5RlvcKD%9bO;@+Oj~stSgF*$v`!wJ2}(0x!Jd);>`oIS&dyHRIyLm_W`r<{p)* zpmIdhFfXor_S@482|#cc!7l7GoWeljh39fj7rCE~!wiW9tmom}8nm8Z?qqmbk9Q}T zCI#j5*~k;{jAY^74km9F`vt3vjEpp0!|2tX@m%_|=C5jujJ6<^?HTqkMTbx^uG;~= zeC6TUe@_b-rn)Lsd+09-(@9niu6*g%2dwk2|dFvJ)vnx-`N zX+JYe3-21f6Nt4ST8lABuQbR#2uB0b0n-P_dU%TUjpnV8@Al{qL6_NB0*LX zRFEZD+=d5mV{Nd6l^`u?*L9;AF}OX$Kq*bkJaU_(!D7q=2Af_?LI5U7-e&icibWHe z;87>UHSHiJ-1blh3r|tC&g@AWz&lO4dEvIY#gvQM0id9(lPW}z4_z%Kd_jv%_Mce9 zf)2`swYnw4`Grsc1Lv+hiHk23yZB^O< zsHRqc_gQH--l$-Pt3PLOkY%vAw~coB{>jeFMuE3`4-WNLgYfBBW~fq>_uduWp))B? z7>06VT)Kq~sqF!-=T!hTLSr*oanp%b^Ld17hEaPoEENz`Aj~wER3(cv%NUylPyhlN z2p#LBAe{z*MN1+hx6lWr#c6A4f>KT)*Wwn_4C5+fr8B^S&Wd-v|BUAq!aIGBFY$Q1UF95Hm>Xl zbuxESCknDUa9VOqT*nQ{+5Md6#Z0v`qNR;V3KL9ri~^li0g>Z#Al&bZI8x8MMtHtL zh!dtkpLhZ43^ADUiLrnVI2BSBLC+Zk5AK*ZLYifKLu)8Bbr)g}LLIcV8;vET1Cq+= zaMWgy%T5ot);6>Q1ZkTC-XR9YF3EKSqgk2UmAc$LRHHMY0f%)-V*uX81n=^|GnWDY zDbWyPgNughS{zZC>!JY_HMv;Vs-nv&(!hdCbP6WcvcL>Mp^iK#c_xJJbDq}zt337K zm^fWJ%T!V-Qk_5Q+wV@Ma59&zlx{sYJJaaH9 z1YILjqSPvZL?HkH+?Bibrq|L|Nwf)rt=9HTNZ|)&wJG1(r!>$RXs<-o*IcByrr>*w zq5DQzhG`ws0{sRsIztU9n&Nd(zq<5Y8HtENQnu~Y!1!8AB?g#@vlAU5pa;;6$l_5!6wOUn_RP6wy^Vx`} zPNLj^DvdT~)92a%CKuUoCw?P={&HTHN0%^59)R-Tc`KP-VX0HIuS%KJ7|_hE54YvXN>WVroT&-|s!Ig?RpH3rO6 zVhb>euR6QMsKBWwRrI3+;$s?fJ~Gl8>OamZ(U&#-p`y%_mFiKgR=#Vs%M(*oB&$lj zDvzOq7Si;9DG>)%+SZxI?2-quv9JTCyAktPjEJ^JO7mLit8&K|sM+VusM0A@Z0XdC z?@~qV7qn!t8Kak3BmqAR8PR0J2!{Uv2=23~tL15US zC)SpC?Ee7ShIX>j&C#SDidI6#nu@RXRR*!3>#DH;1`2)kB5p8jWYlx(XDC%%&RH`Rnyq@tm^3P7-AW}hTB8a^rBO-Mg+=b`M?jj2 zF(oNv^n7k%j#AN0Zd(K!y55D2mhVVCvNlLV&SLD;LC_1@^!M^u=MLbRq+ZZuUok?U zR-;f-E}9ITMX2l0SQR=;EC6S0dV?%ZIXb``Hy2+zUN}KB27aiyr(?LTdRlkL^8rpA zDihd&Qle;3N~054D+1b{TUZBCBI3dhF&`FeaR6D$HS!vHFG&>nIy5=PyF^zlPt9eV zmCI{dr6sd5ckZ!@aZOc~Y7nkKsC5A#t7#$)@wxXpfRT@uksobURrk}oL893Wh&893R8M|0^dk;sifSry~L74#Ko`(@Ze$_ zA>4z1A?%r(6L?3&HU+iwKIst+HZ+4&fOU3&q3$SY8cOOl8G)Dzp;)Lb1&uwUV#r=> zWh4T8R*S%EQ=yTkP*5!OOPb9(Dg_k_(Ik{&5vc@fWFE|d?F`IY9%~ZUO^PwO)Bpv% zw(VD)uc35g%))egWr>#O7YCo!@f@J{WuiDMe7(y_oYhycMW^0F1cnvM$|VL29hE4R zp46}|Kstn!t|JxsI%Z;BzcE}%`YOYR{{T=0?qfrCy`6l8SDG6~i6ZN!uEnWRbwE@p z)RoEQRV5;aVyq1^LHLzpBJUWB&jjs`>{-0%CD@HCKWA4$5XSSzN<4 zN-oq`va2fw4E0)wWU4CdrIteiNji%dD>L-8@Xq!C3v&VA%S!sFW(qepj{5j%{{Sd9 zTiAGPxn!=0t18OWMx=27DJfIDNs%FKz4sOW09wf>^%`t99kk(ec$!3S>shFzt zR*h;6buLeA8HjdbbShM~f}p{G5SY6YsUPBqNi4|gIsgDXJbX&V#B>|j(DLShH6)(@ z0N_D=ukh!|)W`~93uUsVszWo?(c!MTlj$QJ!)flo>?A#aABvWLw0S9$f5~eOd^q6T{*JT>7 z8;HQXN1UA&6O-a(HRXU=vWXg$88#;7`<|EI8+5$os<}*wV{k-BP;o0Tm$~-aHz0Jgn&*czV|D1%s477OZU`gDgCPAeuCP-_E^&IbE7L}6Rdhxm4z`;>pBr8y z0+rbqTsR`b7?wt`@id?K@uy0lqSeTFPx&ON*R{n$Mf#Cx-q=zcOXO~Rx_GCtI4I(O zSD#-6TQ$O}hAA}IYzSf}sf|bhBKDcF^TFGQ2ZB-9Qqxwm%KTZiJJZyqnPdQ#0V8AL zXKxHkz;V}QR(4ya_PV3Zb;sT(`_za20{}R79vcw)L`0mM4==LT&djq$EUna@U&z&T53>OYqN=#6~7A#hy4Jaf_Ik1~3xi-YUO3)2T=;69?GzZ;S<2)3*I_erI z(guw>W4fU0gcBr^%QYO!JCoodt$t8BozWc`k;Dyv(06|~LiqM>pM4dEood2$5g`hj zfW`+-mobA!XHu7xv|BG;PzPr4Oy$T2G%NK&>PsCrP>M>Vz?LUf$OZt@ z)B#TAli+Jy_1cjm0uNxlb+Ht1r z10#Y?;blB8A&l4o5dz+X2Kgdnt=EkOqxX&lKT}V8w%wN~uOAr*NYzBT=}?s-L~5mZ z5N_QrG~c=byTEkir)shFQ4@=B`G)zZ{S)UW@QRhPr!`BqTKQHK9+eKz5lW*MR@X=x zf=gBmB1i=N!W%CW*pM)b4%YkDt{K7c<|c^XjsF1a9?cUiT8PWR2exHy*Fg-b&rt!@ zNVd_HsZbOE)DY93E*#0o*LJ=M`0)XUFek$7caz&cRMwKcPfJ zBUY!FY9pWk0EX>MNYt<8gNC4wP>AQoPL+M%wI;3|?bd-S+wmSDmQX^yI&^Yin@Q}S zDUhZk&ZlHV7*?4TI7gp?Hu%~4lB)S44c9~Be&|;+`*z`k8dRT)XLS}QRZPLE2`dDX zoTN0ap6abIrbu9JS=f3%5xcTC`QUZ$NSt(A5KofxDf&SoQF>#7Go^DHE2S)@I*=e2 zHJ32eTI6aj%Orrad_~C#8QEatpr+kq76vaBf}V@r~C;iaX0w zIi;gnl)rgGI|Q8&R%-<&0n#sx2<4E(7}h%Lm5=9=%9bdE#qWD^leO#KoVX9PI(cNu zeyNx_EUQ+{Q!iL40gX0h)WMpQqf{D3qQYT>-&dZ*V4pkX>!Z%_)|woywC|r8J3!E+7>h(#EY!)>-&v58-Qm<@YtM>dc1Me=S}k5*6^)T$sU?$mV*KocQK$dlm^Nb7&5 zb!QZ-tjsg~@^vF#mPhSQ-+Ie?(Dm}&1`Pl$nlb!1J}05lcq zm@_otx{^+$9^ptPM=@6}4`-!Vu+~%>fz@QHm0;*JmXJ|_=t-FcmIhCw^&XY{?@Pgn zlM7}o3Ez#50*@}_8;S8sr?dEM3Qz>XuA&>Bu)y*7~HkN1^CGv92`C^e}NL= z`I?VRtJEX`Zqb;9xF!kJc8Gy?Xc*@J9broxOk@(dtk9ZW3igE#wr2n;+&a@x3jzxb zZQ3gd&;uzrk-mzj;nXJH3+({Y%9>RHdP`QE&|b=jEVNYxLtC(^U22f3j%ie+%#_0F zmei>}5a|QB>#p_PTT<1B5?K)gxKPsTiSPRa!^=FMR<#;c0i?QxTDt!LSch74^#vaD zky(l`PW3mPD%8Lsn=27Kamr(NA)y){Kcd{j!zZO>EFd zrly&yX@+D{+JH2JGr!sf1H78)R9B`^$4VKY91?7gHM@O${MXPv&p$oq>tkOoJwL1`?16kQxa%Y_DTHht8%#qP~rL+4m{SY&>m{O|2DYt0k zBf6t2DkyCX+O-Ez?5(&8G{7Ku+*2o;5Y}Ye5()YK%X&VS!odM8b(=R0da3R;!DF0>P=sjn$<|CPdC2Z%1I9b2>LX z_nN*t0tfPzJiR&6C$c3C9l(6ely^7mM};qZ(5IHQ*j9A_e~Gj&s2?0eoezL}y3Cmm zbBOl3L64?-Lb7#*rFj?{XbT+w0A$cP ze=hX(0L2~#k^&lSe(RzI3ggBOpe0$B<^#>w6=NG}#>qpPxJjn8^!tckymuPH3y&V{ znM6!&Y+gTzlgIb_pw4>@XyJcPvMub#*&}C`rCOPad0I5cr`pv8wbdd*CNyTG!s&;?(g&G9^PDa6nZC-Q8mT&sYdTm&tF3_`gKq;O@i=Bq z(+zP!f!SUhQ`ZjXF;!SqYC5J8qbdjy-C!J@T2JSEXLUuDK&?}V5?*32fkf!%P`v6M z_MlbI?1d$u!85Sf2qO6EC?&wGLo-zM7BFT3n31vmW9yAD)t7u18C3-D7B_+~(_%&T z_|7=!xCBRs)+MyLYunx+b?~wHkB$Q=A-2?LgG;ixSjcZTwu z0QI#hpLUr3)~AJ!xTM=tK|293a0g4lsg}hu+(>9eji9{p(F)J;8KUJ> zA}w;GOpxDfJ=y)J*2i;Uw!{siuP>sboo&!*e^o=BIN4TZMkU=99>cn;sDLA4+M~oM z@i>T?pHeg%D`Fqj+gf!ZiaSq>P*WzNAQ2%uCYb02FkF0&FO}Q^4rcKxEZ;uRFEUCf zIzp{L#f)wal_PkOAjS8`2;EAiR^M_PndhoHwIvBL6Hw^_41yFF8{Cry!{9*~;#Ewo zy8#HL%wREdN}HC|J+8W{HC)1%RR_Sug@!C!rCJbu8?RM2{;7J0+(&!CZq}g_;40N{ z6h_el%J}SnD|N0_>GKUmCSooR*ib^P9SBLW+Uq-?0|qg{aFmVKsmZ>@_||0?Hpm%;`G`e#rE71Y5#MHZyLL1+QZ>6yP)#g!~H~ zyQ{rt9LHScDvES-bsZTOv|^>jId&7-u+sV_Lg(Ov%l%`IJzAnBm__tGr91O}SX zR+Ak|UW&7enL3lT8mQCw-U@{5P~a7Dmy^g zfFOYpqMdB9XdCw?cGd3~40#l!$rv^Yhb_+>IbKB(R4WDsqSk7n2r3e-N_CY8VRmJx ztO!z&r(7I7gl|gi#YPXqX_JL}TBP9Rsne_4RHslST7sB5f-w*g$(^H0AOsVoWQ=4@ z(dDE|dIB`_TeyCd4;@ZjNILl-{5vICX{9=}Nw50OUDZkhG{aI>5S`MY1k@}5i6y5| z!DKBiE)MMFaPzGfMVYJ&b53l{J8)0j2a4CHoy{g$nw31lW!kT2MQW#QMXCUe+ES`e zfaSZTN!GxaU`Amrb{(QkNGEefwAE>lMkU3X0yql*@e0>6aAnPh?G00$_eDY)ogT|m z)a?5=T3``UqiGb$P^{5-QBgls0Xr-89c6}}`B}d_@EpcetGuIIL0O4NhFXeLtC{YO z>l=`4V?zw+=Fn^WA2NIOSFtD5$WTB(YPmE3Jos3NQY0S?sJ1x<`KMQWeF&}laY z#_BZrEO+#bkL-{SdEGbiUl`7t6?gfXUa+?m8n1}Ysqv`UmbiI=HE1d-BG%FZCXWF5H7!6uVus-Qn zDppR?q8m8K>sua6HN77#nxoxlu2+=1g5(i>EFW<*T(OJs|+N~ z_?i@rTB;R8lgXmY3biRgXaZ%8NS#drBGCZgEogIz>mA{Ge3MUcYXf?gc#*01LwS>u zGfainj!|AjiYVf)n*c_sQYJx@w%b|Q0nAc16g1(`{9dQeo?CX>Hs zsKk-n_lP;m_}f%s>)FY=K@BfztuMzGKUPOeK~Bju2|p;N`)kLtxYo&*RrinxeBOR z`*o+tT77uArx1|DZa5M}6ArN~~+1sb(8Otdo8DZOJ) zN&Q-te6T>l+M||7r8i=Z)SRNN6sDE?TELqTZ2(y(=DH|*e`WOl02lV)oH~*(ZmiC# zX`$??>3~_a9ZbX^2!fKLyE`IkV^SL-l1Z*xwRd5eGrMC?6_0cO0O^^QIVx zDFsy{OVX!N=qoe;$XqK*>P8}LLBL%U)5+HLj?6geL%>$cPAnb~k#%m2QRiUzolu@H z{{a0H&+02ymR_^cs9KxSC$lh&mST!o43Y~|l5YwIoI4~KnM-p>4qZVl`xLV-WR&ko(&90p~ zf$4U&07FunC}k>p>8LKXog!96#rB_5t6E)LKC8jF2e>l${VfULTt`5w{{Xo`(|xr; zKZY$ldCNPT3Z@ortVln}ge!}jEtsOhjjmn^-k9jPuz`<-`GL^)AF)eW8j4U2KoQXTpU?2d&@0Oo&TAoJZD36PMl5MU z4NY$WqkG%|>tpl>6j!A!Oun1y4gKGknFH{}PP!@CR{ePD)%3??6-sk!Xth2xqyXE4 zB1GCY>+tD?3?w?jWJ(C5!B@+x)Hc-YSb3X+@B`!rmKY#3AaSB##sB^>=Awylhg%AcP!u%eMRne{OkZ2qqNWkc8uMp9aQ|k z!zs0D`lP7r;1Wr0?fi^dNszKUKsAxXG%LiwTv3q?L?(?uX|N(@tz9cAO#O59f(braQnfaub zqQU#*7Cq)6mG3ihrG(nzWOxf<;Z>r^H+t@ff58A!ORBWM))^K(Tn6!oQ!$F>JeBfy zt2{VmhxU)C&4o0p0C-DjnLT#I9LHd+(9hIV8Ga$5nx!=XS%{`wODIut2BHBo1f6~Z zt|W`yQs~%R=Qzbj5Y9*@NYaAiZ*@U9-~yp>DxDe!p}&BVf6^HJF>73&y#qiI+^;Fs~*KF9K-jVk=r;d5V=(+RY#ZuPz<6^yjH~rwh$OB=sdq* zo58(~#1}l}8v5|{E9hQb<10uVN(pG#u^a*DGYhR)eK#}%9n|I4VG6zjFA0He~nvmnkOn9-@9IY^BVFW4t(iXrG zW2HxpjqzN%Qoem`t6X1+sbXod8=E32xd2E6fdu{1WEqlV;*A7uiuaGwQ|GcCBARMD zjcy%#GcePkgGEnyY)pkS1oS5v_{N<8+ltue=?0|l!Ebz#krf1228{-^Q(zy%?EgwyQy1C(-lx5L3^6Vpv7*wrM+~6q)G1~k?4oI>XHF*SN~JU|jRp(qR_`eq zm6dR%bgVht!LJ?uroEQDSs&SJj+{373r_qSCzVP}O;6RG0VL=wrrLG=nh;5l3e~2= zW$%F{J9LM8?nHBoG_5<9Rn01u7NC2q6AMk*2ohk?A?m9Ub!vU07PBody3U>**<33^ zg)p|$g@udpk7abK)IE`1WU$pv7y}mp>1(E9z>--(kVJzX#vEg^)57u7;96apGO^BT zrP<~RNk^s%BkI!1K{`s*Q)?f%zzHK85fbM3uRT3A{o{(gmG-1+jXBx_G2JS)X)vK* zQQNd385|Q5bSuT#oa2rd4}jOWTrtjelD7NChs{~ZIAwaPm+Yz2XlJQYx1~s!Ay{@m zv0%yq!@Cv%L3U7O;;FZ(@>Y!Ix8>}PJO2PLmlb>e0920MDm4K{f>okTDnqd>DY`Lw ztEwuyv=myE88YMz3`;deTt;#b9cP*Tf68U^w>UXzqO=-%`1>z-kF_yL%Vm+CjYJ@t zwNL9v;hR>R!nIaZf(ok^ypTkhBOuJ$lB{yu(FROjS6nxg^WWF#q8#Ye;8M>zIe;kV zBAK1LxrJ7yaWg@5TRx=zxmJ>e8uaE3BTa13JB8@N7d24`!S zc_KWy%eB$_Ds}7jDmTnhrB;bi5)skXr7{GCS5+UlaSsh5$QRwZv~F`v2O96$IA(c* zr8KB2{;O48LaWrO*>E(lI*PDuas&nKVKr(Yih+b(25Q}CHxyfB(pcuMcHz}Z>u09R zN}WA9V6Ls%piNqZCQVHePjC~`WtfrSUOW6yWXHyTWDAA!WUJH3E@jrD_H|OP>ZCF@ zj_V%H&X}NqWPpmLMxN2dOPnyUTz2G!+a{xcJ3&qb zR;J~3zk9x{t7IImc8yYD4Mn2Vm)u0Ay75HU4$p>*q%pQhiztP?z*Iu*tY|b#BemfX1M($O_7u%Q18+Mv=w_p zQ7P7=A+6kIsQsu_0)rp{oCYglb?AWnLo%D(ccr77aY(qR$xUj&U0^hkuc6if1VLL9 zH=HygX**tvG5CiDlbC^fFWl+G2DQ^6nN7Br4XIJ$5T z)PFbEW%R!@`+mx2vd@*xR?0d)r5dUV4@uRSB~ZDArBandFu{U@HkyhRi!nr6(OWEe z<+qy}+W3vD#EmrVV(J^c7SstNc#&XW+zqhG1)>}yh~AvUh8v5X@Y4-oO@O~#4eijQ z#{F8a@cshT0e^TSih3Zs8!H~}!A7AZP02b&_)+sVHwN<-v>Aqc%`$KXyU}dN2ue&6 zvbY<~CJj?pcfCtdrn3M8sDgk8($Eeqhn!1p2so@Op{A8ehX-ox@lC4Om#BkNC~55K zH+fVT5Ougg-tL_u7@B6pESlwMTs#k**;)zbTolx5u1=)XUiqh_B9(0=mP?n@qNxTV zpSlgn2T4>M4l+ET>3i+A+HSUCkaT3?O0!j0d+)B^NlP`xDpW1rAU2jOB!X6Smhmg8 zqHHImV^SCdO<4HMYq3&hIt~F*sg-Z`+xTGikWdtl5o_Q2ZR3etxuko;sr+q-J1JKZ zfN4@yG|k{#-@7sg&Nl0cT`3x`b6FKh3=G;W7VCLGfdUfXcUm^49g=n2#n#=}_^<8H2kx8I^)6zeW=gS-okf4fc zF~D+Q(n7+;29Y3YfqQrktajK5z@Bv=CL?Zul@>y~JzAqt(4hn@z*v@5h|&q2M|O{U zt|WjO6bBbLi_uMz&nc@>k9AdP4J)~Tz$hLkXcpKF@EHeW0p6H^jP56pLGxMg7}HUu znOjf>^qQ)&vbCW+-lOX)PO{<$cnn3gnPU)ML!_+W!Dfn0SSlr%a+4 z3nY`&Di4`*K4f}gwp7xzI0OFg!0P`1us_ogm@dj!nRiukuGUckbrC&bVn>~Y@gx#7 zTszk}%F4!2*bf3cX2%g#x`Rh$6&%rmw;+ju;yi}_1blj8R|N6P{G*pBty-sjv_cjt zpt&Fp;ybZeiiBxYECua35@IHEi(>!*#O{0-ti$wn7C4zC@!GDD4d+2gnm3K%Meu!^-Cewe&|N>2UoahieQEhcix;N(;^W11na6 zsgb7i-hu6F(^q$-)Zhx0l~}M!h!q&=BUK>Mq@W@&7_3Zk^;ow8*J#sJLF8+2d-(B7 z^uI-69|z_z4IsByG#eGncaHBwe}dJhz@gUBFk7hj#E-5u9vU@XafQTDOx!CjOp?2P z@H_bnS`GSq1{QS$!&H1_1E~P_qF{*Yd-#YwW7cO9!$m{Ig`e>bUTTE0!oa+2Oc5sH zY)JT?hYz*jEa%2uvduHxu~S(JT$MiQEJ*T@BG-dA5PIS4;;m)6BYG)l^8Tm{tQkZ` zm$@D%MxXU!rPQt&dxdi?$kh+KP4|$*00ABy^XYY;Oi;=O4MX?+>kMaN}JeRXt z%uxRT#A=Gv+fsIP>C*tk)R9S*l!=vOU~Se2&vrSD1)?F8?{r#~q75aTJa%D&4+ z;e1I`?DO9JqO~_}%A>?U)TGmLW4TZe-O!H2uw2(dA8&`#i2H=-mCd0gc`EIf&$6;mcYESz? z`R(eJKlG(aibAHET3LVkidkxvT}((M_MxH_sWDMQ5V0ggGOj7qP}JQ6H+}nB0i;uKWXP1i}QrHU#IN`cu>xo4|Z<>AgOaMb#F9!i0ZYecb{177>@ z9P87956AiDretfV6xuJg&~~G0 z^bxeJI*ScVf71>m>P?AlMnN6ZAY4bAU5cTYvq7j`fs(Hv6Gox?wGVb|ATc^%{_)p0 zj+m`Is=?8}yTx@&g=TW(r7_y~2?+~UlT$39hF1)$PGph_PeugdEI;B^A<_IO(9UNo zP*X~c9jYZ%6;`S;uw>CjnX3JQlsD{Z(PBxCgw~kXQ9cNT(n!!+(ciE0=94qIYFdKT zr&lRZNCA{eG1<2m^f%_&RiOxIwrZ4{hjPkSzIh@TYi-ne`EJc8D&2FZVAm7r0M?2wa zA%%?i+!f4*dxt`dwG7r}pz5jF1VBd6?7^q6xCr^p2$S^?6`JV3LrGro9L`>>EmiE< zLY8{MvYK}=i<*RpG67J_?+H7Y?F~os$ynq%5ns+~Jf98|_8F(Be__-0x?Ogz;)DF0 zo|mx2Tz|>GL`I7EUG)m>esralVhvi0QI;w$Us%>)f(Z-;k{N&w=2WmdkVW}^vr-3| zKjy@GS@J@7pSAAMR+gIe>7iXT>(u)(5_IUAgR?i(k)hrVD*%h^sTl*~43v!$8K_RWmTHyFsv=S#0_`dm}iwEH$g zRKA6!P4wuct!Yz5L{KS(lQqGIE%<*vsc9PLjQMoEPY?L+RCuokdd*go z$s6Ozf2(4oaS*WO;it`gEROjatl zW~bSn@K8pjD5Qxh%zLME3(^uj!I+5h-o$Dzk<{0Y%gAH85+*UyVCCxrb#Nk$a~cb- zU+}T|S;5p^d!%~K(kC1Aym&gMzEtDlnmau3OGYuQ@iPDfr2ds3pYe zZBDBMiPWgd8b}(g1_XvUbTa-emU(_t*#UGoi^n7$<49h9j+kBIO#1I4Ypxj19Hmql(vBEJsRyW@ zu{*)o?TI4ADF(G%oaB=NB+PCj?Eg%AXR zgb7at`-nIc*_dh?NzpN=M(lp-orm6TkO4S>zKZUkETLRFnW(GLV){VAJY!*D zdBGi_LLH!^$ma)XRtzK{G2o&gd`IGT#5{IFBuBJY8JhZLpi&u|NLJJciSHTO+Je|L z-}Z(eHv1)6&dYBbl)8*XMJCrBNwl7=ez<7tkq28}W?FQIhOvgrq)LBNZD(iCs544wXO9VGi(Gvm?KsF>!+s(0DgQtOBhqE|ZWn_ZDx4Q#W&ZX%cSK)|p(^Vn5&`lJ% zUbEABjhdv3PGxn}1){(xr%z9Lr4v~~%q$9(Vm!bdk#e4B4L&;5$N_1S-C$icmAu+a z2_p8sCMGo6CL&k1h451^IM>v~I9*%lr%Vl_Z5Hsh8S0zKCDyx|ZRD;qSTbfywNkID ztsoQ@3do^g!Z2V!Hd284k(G+WG3T^A*P`hDl9mScb>Bq&%6#=ss(qj|D-z786}u|P zUA5@9a8XjKd&E2$&{THWlSJk?28(YK%a!=87$%Nb%baq%faW{A6E<6jC~FSs@Q8wJ zXRn+{5#fQ5X;@XFjv|_NV~cX_DrHGJitozf~PAx|lA zAy#^l2jd^t0WM53FqrslYGb$q7C*C1+@JESN2vpQ^~P+$&ew;E*M-b(oO}}v1${6m zFdhuZnuzKmqrBR}Jcy7X0vZmkPKT4TS6P!#~qWc9~&xOm2qgX3rH6*{@( zI><+W1MYp)%lazSs=Au0*H3lDT-IWyi^bNfB{&-uractKC;eTl_*+M~0sE>RjSkV| zpAt{jlxzAf(4kD!8a@3wa`cP1zr0kkI0P90uV_DH&M*G2B!<3aaOlWm8V_VwfqO5c z6Id=KL~Ewh>Vpbf?5Y6th%yv1_JEi$04y1CkIj_)@861QJTm~W60bIXtxQVR?buXG zMvVk&kJ~v^rB1Cvf}JLIWeRIGAiAKjEsYE~mHW1ZU7a)=kT*V7v+)wd%>lD@LtRe5 zorjqVHujyCWeHa`RT{tR8F5V{_H;tmrp_q>RjL(DU8QCk$k(T`Mr9h9SBDbFfy+kE z6QQf+uLYHiW>$yJMtseoz;=b#IvbxFrHgUiD#tUJstAX#RQsc|sG_MNRPMVF2(^ea zjm9uFjR%tRGRj>m+%_cm9aW5`aal;q(lqO_9n~d(Dy~_m20hcDk^#C9J3GM=Z}lA& zK?HUNzs-;g#|5bx5h^(k1`xXNIvwjj~o~gx>$o*RL7I*6Ezx=3&?7#sDFWV zKl*+cjN^i^h?A-%mF1^UR-ILHtE^qobjcc3ss&3M{h_9LjZ~9F(sSi*XDF>z`zoas*ezNrUGzg~6_5g? z&%IDo6YGIJybf9TbYfUW z)RMW=n<~_FsB(1sHA;$=Dx%k=P}MZ__vyE0uB9PjvoH?b+lf0E*6C?!WplMH)71lh z3~19ewf1CzJ)1JYVn&bw)dOpj1AU3XjTEJp>I$R6kUGgB_F@%_W+d(cv53@3G7Rsi zW0V7Xqr4xMQlWmvsMM(pl~mJU%wkTVEolm>pb|%X-Y89Oiq?a%Rw(|rLW@ue6n4h9 zXj-cy5lvN7v!zf-ks-|{sI6eirvQ8`k=dQflaXR%frX9YZv2wXesZf(kk+A1irJE> zu2r^%Dr*k(T3EOwlcsmSR@Mq>Lv|tZn{Zk`Dtk*x$|yZLG-<6zu71T?S^F}NQ&}vID3q zuneXZN;)J4FBr zg#RYcm_G2j4b13BpD2kPi#49o@=KJMD_4adc@UL43_uRU+DjC`w_7 zkuk9%d|G}9xfXmqDTn+JuxH(=q3`{IMP;My26aWgA zCQJ}wJTS`zol;NGXoh9kl=mQmV`&%h2V>#a@WTmIdx_AbQ9I>a9{AEq#*;3gL9~Ho zxSOuW6=mOYlT^IP@M{s;DUE{MHpjY7k_qeG1R1t0=PH1RW%9}oeIyCB&i?={zJ5ob z$>gjnijOpj2Tyc#9o+;005wpT&r-r@$8X7I~`j$Gnr$n?t;p6>X?BLFVH~r@QV}*31>XGuQRz|3PBQgf(%@G;=@o? z2&B!C;bnWxqM6bee$7}Jn3-pLjmCqx7#Ve{Ntkg7-@x}x1q+i!w` z8Wjk#sOBm#V|XCNynqM1OztEOl42(o;H$-1%G5wXxv{t#&yJ=WZDI4p4eX>+JIOi? zQMdw|i;z!1It}&t+Z1)uyK2`QFNRW4uB}FDMRg(_RMm-dO?6aVOf-#EJE%wlR6&NZ zJObbc6uF$s!2p>zmgvTJP*qq6k9b_k7K|N;5-8&ZK?^|kb;T4-BCD;c3bfqDsO;E1 zJMOdDxDa8Hk6a;&7Ta2QCw8efdpBVDP)*-0o6J()4vOI_3;Deof;>R+#$GG3{Wc(b zEqon0o$Vxg>Ys8f2qJsJB5fl37LOkuyJIoMY_*{iENuiy^D(52yhybF03RAFt5ni0 zakt$iev!5Jz{yt#g(?WjRrD3u>z_`te;&S=8F2?ie4y@yRi#N-jRL5?kxQD(9 zg^IqNL4~`d_l@r?f@a#Wn(;@uJjVhTm2(~M?Hrl7C0o|$vA?8XL=H&6m1>s`*LG$y zeb!xMjfoc|+snpqB54pN2IRVeG?_w2yrEhnWh%v-{oODK2fA3m!p2se(Sr(j%JHnS z!shEzp`Zeq>gf-unj%J>A_B*Hz=;3}P{#Ls4JXME$Q#91;#}dCDiV)xRh&r_>9>r4 zDlwr+>97QoOq&93Aeaz59?=8D{jG779f3d2^@Mv%=4!Qbbk@49IxCjUyQH{UuCJG- zhP^s$i%^AXfmO{)dy=P05$P~dwUH9dTwKw0u-5AQxfP9zd32yZ;SF)CI-LNz^V4OO zXSvmf56DvcLI?af1Z3<`wIfN|9hE2DJ@KhcyWTqj3!X=s{aW3fY;3ZBF_#Y$05{p; zLrT3;-?rS~sX-a3tunPj_aT7~P1;N8OM5RI5Ws zVwGzE@UkHaMeZa7279cKR&0ojsQdL8>ZuKrOC;CYc~x zT0vwI#K2mB0jcvN4@W+23eB4hlTb8S)@zq*Aniiyrt*7AWIBluRkRZX8yVZK8V(0U zlcR9gg0GX$0toR2b9N}J@mh5O?dhhleeA#3)MERc0Us{RVjPsDOfP)&r4h09 zSIpOZL(y@U;8a>WDxu&0m1Y@tnXpqmn~~x(3Qt7oj=J1^RAdL?KSf)O@e1lfR!z32 zSqZhSjC;&Kd0mv)$+5-7a8-4U2t_zAw0B4XqtgONSNm#z78)x7ye_8$5LgPhkcDfE z@$+57%{WmD*)bpqlc*3Nl5R9DqCtr&$TH}ejm6re>e-f78c9-y#28@1sE8xfU(XCQ z0us(8r$lEV%nzaT)HKVWr(IJ@>!;GtN~{tYQqV_quXQTsHPi^cAr>j09hMq99|cyo zGWSY~uEK1rpn+(T+Q03w8?Mk%8&3sJz2fMU8!nTE+7eDQi|{P!)2fcZGO04GU>Q=k z?!S!PNRTE3krIn(0d!8v@Ji569?De$Ls5;$q>MlOxqVAa4;H2bOoJB8>f9E$TE};P zJCQ0}B)a{EWK}`;TTNl<+|+(_M%^(@j-eLs;dj*s&vKhV27oF(=E}a4>QN5&`}Aka z7Z30CLUV6%=$CUGu!Lw@r4HIFtRIW5xA8%P2lsj#=kCnc-unH|!6i6}%Z;3b+g>hA@)+Rg@kQnt7{M7*O^0{!P< z9#E|j^V_ZjZ-GT=ZxL$4zFmQFNdW`WRY134rfV~$K7SKPh%Y1R&R*?=D#a@=C3JeWB;LtS?PQ^@} zBYDIS4vON&s@;BbuFxe^cmzN%X(fSmGY#$Wo%3MUQVAE5kl}a@l zqJ>`dS~;53!<%Z=q@9S6Z_*N-w;i3q9)v9nJE~lxVh#9$v`QJ`Z8jS~H~Jg=w~0M6 zi)n0Tv`&NpCE5&kNQ*~KszhyR@H>H&Ko!iUY1iE)fwzeAwa3!~AQVuD(#72_Gc^6*ei8|WmcX_im6=+ z5k;ywr%cs(6Q)!bRTh{nZQY|+9OT`rG_+|*7a8XhK|&nRr%5MCl`tHJ&?*)}_nkql z1|Z7-Xy7s%%VkmWwS!jxvd%B<6Dh5oovSfMrwFXaLlA85rj*E$q>wh$K?fTV;Uxe7 zC|#_nF_2j#l4`W%l(_!@IrgiTOuYpHg<2|&QIxnSh65t(7$wLs#6Z1a2=lm|0bOfHg5|{r30^;oK-?_BA!dW#io; z086006tikINhAm*K_=?31;c;vq%075EA?x^?AuLMQ*A66M8TSM2Hs#z zGSjITj8r0Rp+`7Pc1;y2)vTx86I6f}Lln|J?5L0mhU&0Lz+UmFq{A3=a4H^T=1R30 zwYgw|-bBX61p*46H~bd)?L&L6bW-TXn_ch)5`^ zLp!2%foo{s9@J=NA$4h~{{Tv<(q`a2JXPm+^xfdUWw~OT(xmcf)$FN_XmmLN026I41ejWZ z(oDuKWi2Fdv@r`@(0I~A_JhcJY1FJyWfps6`z8=nOKeMk)8IID6kic8s*zPdXWas-Noe3Lj^IYb+XH(Q5Dk-G| zX)mWy9pC}gs6g)kz>P+3V7ZX8Dx7;H4MptBIdrBVv2OOJ5T*kK{nOqAo10>wu5hga z8JOYZHAP@G2(rlp>0{ln^05HP+j#5QMQ#&ED cK*i7%CXCXmrB7bMtex$(Gc$Zq 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 literal 0 HcmV?d00001 diff --git a/public/images/probindo/logo-paj.png b/public/images/probindo/logo-paj.png new file mode 100644 index 0000000000000000000000000000000000000000..250f92ac684a45133c831cb8d321cad5370fffa5 GIT binary patch literal 12907 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 literal 0 HcmV?d00001 diff --git a/public/images/probindo/map-jakarta.png b/public/images/probindo/map-jakarta.png new file mode 100644 index 0000000000000000000000000000000000000000..4b367982c36d4021402dfaead25fb380123eca9e GIT binary patch literal 121671 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 literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..ee8f07e --- /dev/null +++ b/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..e4e6c82 --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,269 @@ +@import 'tailwindcss'; + +@import 'tw-animate-css'; + +@source '../views'; +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; + +@custom-variant dark (&:is(.dark *)); + +@theme { + --font-sans: + 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; + + --radius-lg: var(--radius); + --radius-md: calc(var(--radius) - 2px); + --radius-sm: calc(var(--radius) - 4px); + + --color-background: var(--background); + --color-foreground: var(--foreground); + + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +/* + * Probindo public site theme. + * + * Tokens are CSS variables so a single set of utility classes + * (bg-surface, text-on-surface, ...) renders both themes: light values live + * on `.probindo-site`, dark values under `.dark .probindo-site`. + */ +@theme inline { + --color-surface: var(--site-surface); + --color-surface-container-lowest: var(--site-surface-container-lowest); + --color-surface-container-low: var(--site-surface-container-low); + --color-surface-container: var(--site-surface-container); + --color-surface-container-high: var(--site-surface-container-high); + --color-surface-container-highest: var(--site-surface-container-highest); + --color-surface-bright: var(--site-surface-bright); + --color-on-surface: var(--site-on-surface); + --color-on-surface-variant: var(--site-on-surface-variant); + --color-outline: var(--site-outline); + --color-outline-variant: var(--site-outline-variant); + --color-primary-container: var(--site-primary-container); + --color-on-primary-container: var(--site-on-primary-container); + --color-highlight: var(--site-highlight); +} + +@theme { + --color-paj-crimson: #a31d24; + + --font-display: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif; + + --text-display-lg: 3.5rem; + --text-display-lg--line-height: 4rem; + --text-display-lg--letter-spacing: -0.03em; + --text-headline-xl: 2.5rem; + --text-headline-xl--line-height: 3rem; + --text-headline-xl--letter-spacing: -0.02em; + --text-headline-lg: 2rem; + --text-headline-lg--line-height: 2.5rem; + --text-headline-lg--letter-spacing: -0.015em; + --text-headline-md: 1.5rem; + --text-headline-md--line-height: 2rem; + --text-headline-md--letter-spacing: -0.01em; + --text-headline-sm: 1.25rem; + --text-headline-sm--line-height: 1.75rem; +} + +.probindo-site { + --site-background: #f6f7f9; + --site-surface: #ffffff; + --site-surface-container-lowest: #f7f8fa; + --site-surface-container-low: #ffffff; + --site-surface-container: #f2f4f7; + --site-surface-container-high: #eceef2; + --site-surface-container-highest: #e2e5eb; + --site-surface-bright: #e6e9ee; + --site-on-surface: #0f172a; + --site-on-surface-variant: #4b5563; + --site-outline: #8a9099; + --site-outline-variant: #d9c6c8; + --site-primary: #c81e2a; + --site-primary-container: #9e1b22; + --site-on-primary-container: #ffffff; + --site-highlight: #be123c; + + /* Tokens the app (shadcn) UI also defines: override inside the site only. */ + --color-background: var(--site-background); + --color-primary: var(--site-primary); + --font-sans: 'Manrope', ui-sans-serif, system-ui, sans-serif; + --font-mono: 'JetBrains Mono', ui-monospace, monospace; + --radius-sm: 0.125rem; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + + color-scheme: light; +} + +.dark .probindo-site { + --site-background: #0b0f17; + --site-surface: #0d121c; + --site-surface-container-lowest: #080c14; + --site-surface-container-low: #131824; + --site-surface-container: #171e2e; + --site-surface-container-high: #1f273b; + --site-surface-container-highest: #28324a; + --site-surface-bright: #333f5c; + --site-on-surface: #f1f3f9; + --site-on-surface-variant: #b5bece; + --site-outline: #8c4449; + --site-outline-variant: #4d2327; + --site-primary: #ff4d58; + --site-primary-container: #9e1b22; + --site-on-primary-container: #ffeceb; + --site-highlight: #fda4af; + + color-scheme: dark; +} + +html:has(.probindo-site) { + background-color: #f6f7f9; + scroll-behavior: smooth; +} + +html.dark:has(.probindo-site) { + background-color: #0b0f17; +} + +.probindo-site [id] { + scroll-margin-top: 5rem; +} + +.probindo-site select { + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%234b5563' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.75rem center; + background-repeat: no-repeat; + background-size: 1.25em 1.25em; + padding-right: 2.5rem; +} + +.dark .probindo-site select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23b5bece' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); +} + +.probindo-site input[type='checkbox'] { + accent-color: var(--site-primary-container); +} + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.87 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.87 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.985 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} diff --git a/resources/js/app.tsx b/resources/js/app.tsx new file mode 100644 index 0000000..e7c45c5 --- /dev/null +++ b/resources/js/app.tsx @@ -0,0 +1,41 @@ +import { createInertiaApp } from '@inertiajs/react'; +import { Toaster } from '@/components/ui/sonner'; +import { TooltipProvider } from '@/components/ui/tooltip'; +import { initializeTheme } from '@/hooks/use-appearance'; +import AppLayout from '@/layouts/app-layout'; +import AuthLayout from '@/layouts/auth-layout'; +import SettingsLayout from '@/layouts/settings/layout'; +import SiteLayout from '@/layouts/site-layout'; + +const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; + +void createInertiaApp({ + title: (title) => (title ? `${title} - ${appName}` : appName), + layout: (name) => { + switch (true) { + case name.startsWith('site/'): + return SiteLayout; + case name.startsWith('auth/'): + return AuthLayout; + case name.startsWith('settings/'): + return [AppLayout, SettingsLayout]; + default: + return AppLayout; + } + }, + strictMode: true, + withApp(app) { + return ( + + {app} + + + ); + }, + progress: { + color: '#4B5563', + }, +}); + +// This will set light / dark mode on load... +initializeTheme(); diff --git a/resources/js/components/alert-error.tsx b/resources/js/components/alert-error.tsx new file mode 100644 index 0000000..a9eacd3 --- /dev/null +++ b/resources/js/components/alert-error.tsx @@ -0,0 +1,24 @@ +import { AlertCircleIcon } from 'lucide-react'; +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; + +export default function AlertError({ + errors, + title, +}: { + errors: string[]; + title?: string; +}) { + return ( + + + {title || 'Something went wrong.'} + +