From 6744b2113051452f6330adaea80d9ee8f82644ae Mon Sep 17 00:00:00 2001 From: NaysKutzu Date: Thu, 23 Jan 2025 11:27:56 +0100 Subject: [PATCH] PUSH -> Laravel --- .editorconfig | 18 + .env.example | 66 + .eslintrc.json | 28 + .gitattributes | 11 + .gitignore | 26 +- .prettierrc | 7 + README.md | 66 + .../Auth/AuthenticatedSessionController.php | 52 + .../Auth/ConfirmablePasswordController.php | 41 + ...mailVerificationNotificationController.php | 24 + .../EmailVerificationPromptController.php | 22 + .../Auth/NewPasswordController.php | 69 + .../Controllers/Auth/PasswordController.php | 29 + .../Auth/PasswordResetLinkController.php | 51 + .../Auth/RegisteredUserController.php | 51 + .../Auth/VerifyEmailController.php | 27 + app/Http/Controllers/Controller.php | 8 + app/Http/Controllers/ProfileController.php | 63 + app/Http/Middleware/HandleInertiaRequests.php | 44 + app/Http/Requests/Auth/LoginRequest.php | 85 + app/Http/Requests/ProfileUpdateRequest.php | 30 + app/Models/User.php | 48 + app/Providers/AppServiceProvider.php | 25 + artisan | 15 + backend.conf | 36 - backend/.dockerignore | 1 - backend/.gitignore | 2 - backend/.php-cs-fixer.dist.php | 91 - backend/Dockerfile | 54 - backend/app/Api/Admin/Dashboard.php | 76 - backend/app/Api/System/Settings.php | 38 - backend/app/Api/User/Auth/ForgotPassword.php | 63 - backend/app/Api/User/Auth/Login.php | 86 - backend/app/Api/User/Auth/Logout.php | 34 - backend/app/Api/User/Auth/Register.php | 89 - backend/app/Api/User/Auth/ResetPassword.php | 105 - backend/app/Api/User/Auth/TwoFactor.php | 88 - backend/app/Api/User/Auth/Verify.php | 50 - .../app/Api/User/Session/Announcements.php | 25 - backend/app/Api/User/Session/Emails.php | 84 - backend/app/Api/User/Session/Session.php | 198 - backend/app/Api/User/Ticket/Create.php | 103 - backend/app/Api/User/Ticket/List.php | 31 - backend/app/App.php | 293 - backend/app/Cache/Cache.php | 146 - .../app/Chat/Announcements/Announcements.php | 162 - .../Announcements/AnnouncementsAssets.php | 98 - .../Chat/Announcements/AnnouncementsTags.php | 98 - backend/app/Chat/Database.php | 255 - backend/app/Chat/Tickets/Departments.php | 146 - backend/app/Chat/Tickets/Tickets.php | 155 - backend/app/Chat/User/Billing.php | 126 - backend/app/Chat/User/Can.php | 29 - backend/app/Chat/User/Mails.php | 165 - backend/app/Chat/User/Roles.php | 146 - backend/app/Chat/User/Session.php | 99 - backend/app/Chat/User/User.php | 428 - backend/app/Chat/User/UserActivities.php | 100 - backend/app/Chat/User/Verification.php | 120 - .../Chat/columns/EmailVerificationColumns.php | 32 - backend/app/Chat/columns/RolesColumns.php | 30 - backend/app/Chat/columns/UserColumns.php | 66 - backend/app/Chat/exceptions/EmailExists.php | 21 - .../app/Chat/exceptions/UserNameExists.php | 21 - backend/app/Chat/interface/RolesInterface.php | 25 - .../Chat/interface/UserActivitiesTypes.php | 33 - backend/app/Cli/App.php | 235 - backend/app/Cli/CommandBuilder.php | 36 - backend/app/Cli/Commands/Addon.php | 109 - backend/app/Cli/Commands/Colors.php | 40 - backend/app/Cli/Commands/Decrypt.php | 37 - backend/app/Cli/Commands/Down.php | 47 - backend/app/Cli/Commands/Help.php | 70 - backend/app/Cli/Commands/KeyRegen.php | 73 - backend/app/Cli/Commands/Migrate.php | 135 - backend/app/Cli/Commands/Rebuild.php | 80 - backend/app/Cli/Commands/Setsetting.php | 61 - backend/app/Cli/Commands/Setup.php | 102 - backend/app/Cli/Commands/Up.php | 45 - backend/app/CloudFlare/CloudFlareRealIP.php | 29 - backend/app/Config/ConfigFactory.php | 91 - backend/app/Config/ConfigInterface.php | 43 - backend/app/FastChat/Redis.php | 54 - backend/app/Hooks/GitHub.php | 58 - backend/app/Hooks/MythicalAPP.php | 168 - backend/app/Logger/LoggerFactory.php | 91 - backend/app/Mail/Mail.php | 69 - backend/app/Mail/services/SMTPServer.php | 69 - backend/app/Mail/templates/NewLogin.php | 74 - backend/app/Mail/templates/ResetPassword.php | 73 - backend/app/Mail/templates/Verify.php | 73 - backend/app/MythicalSystems/Telemetry.php | 30 - backend/app/Plugins/PluginConfig.php | 139 - backend/app/Plugins/PluginEvents.php | 138 - backend/app/Plugins/PluginFlags.php | 60 - backend/app/Plugins/PluginHelper.php | 67 - backend/app/Plugins/PluginManager.php | 72 - backend/app/Plugins/PluginTypes.php | 49 - backend/boot/kernel.php | 75 - backend/composer.json | 63 - backend/mythicalclient | 25 - backend/public/index.php | 55 - backend/storage/.docker.env | 9 - backend/storage/.env | 9 - backend/storage/.gitignore | 7 - backend/storage/addons/.gitignore | 1 - backend/storage/caches/.gitkeep | 0 backend/storage/cron/bash/.gitkeep | 0 backend/storage/cron/bash/permissions.bash | 2 - backend/storage/cron/php/.gitkeep | 0 backend/storage/cron/runner.bash | 26 - backend/storage/cron/runner.php | 0 backend/storage/logs/.gitkeep | 0 .../2024-11-15-22.17-create-settings.sql | 8 - .../2024-11-16-23.58-create-users.sql | 120 - .../2024-11-20-21.41-create-mail-template.sql | 20 - .../2024-11-25-23.37-create-billing.sql | 19 - ...12-25-22.03-create-services-categories.sql | 13 - ...04-create-services-categories-features.sql | 13 - ...12-25-22.05-create-tickets-departments.sql | 13 - .../2024-12-25-23.50-create-addons-types.sql | 18 - .../2024-12-25-23.51-create-addons.sql | 13 - .../2024-12-25-23.58-create-services.sql | 22 - ...-25-23.59-create-services-prices-types.sql | 10 - ...024-12-26-00.08-create-services-prices.sql | 18 - ...4-12-26-00.13-create-services-upgrades.sql | 13 - ...-12-26-00.27-create-invoices-templates.sql | 11 - .../2024-12-27-22.03-create-tickets.sql | 17 - ...12-28-22.04-create-tickets-attachments.sql | 12 - .../2025-01-13-23.57-create-invoices.sql | 19 - .../2025-01-14-14.19-create-announcements.sql | 11 - ...1-14-14.20-create-announcements_assets.sql | 11 - ...-01-14-14.21-create-announcements_tags.sql | 11 - .../2025-01-14-19.53-add-supportpin.sql | 1 - .../2025-01-20-00.21-ticket-service-null.sql | 1 - .../2025-01-20-01.01-fix-enabled.sql | 1 - .../2025-01-21-00.16-add-ticket-prio.sql | 1 - .../2025-01-21-12.50-add-status-tickets.sql | 7 - ...2025-01-21-15.04-create-ticket-message.sql | 13 - backend/tests/HelloWorldTest.php | 22 - bootstrap/app.php | 23 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 78 + backend/composer.lock => composer.lock | 8441 +++++++++++------ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 108 + config/database.php | 173 + config/filesystems.php | 80 + config/logging.php | 132 + config/mail.php | 116 + config/queue.php | 112 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + database/seeders/DatabaseSeeder.php | 23 + docker-compose.yml | 88 - frontend.conf | 11 - frontend/.dockerignore | 1 - frontend/.editorconfig | 6 - frontend/.gitignore | 30 - frontend/.prettierrc.json | 9 - frontend/Dockerfile | 13 - frontend/README.md | 39 - frontend/env.d.ts | 16 - frontend/eslint.config.js | 24 - frontend/index.html | 15 - frontend/package.json | 53 - frontend/postcss.config.js | 6 - frontend/src/App.vue | 22 - frontend/src/assets/main.css | 66 - frontend/src/assets/sounds/error.mp3 | Bin 30672 -> 0 bytes frontend/src/assets/sounds/info.mp3 | Bin 24624 -> 0 bytes frontend/src/assets/sounds/success.mp3 | Bin 12528 -> 0 bytes .../src/components/admin/LayoutDashboard.vue | 436 - .../src/components/client/Auth/FormCard.vue | 38 - .../src/components/client/Auth/FormInput.vue | 58 - .../client/Dashboard/Account/Activities.vue | 96 - .../client/Dashboard/Account/Billing.vue | 209 - .../client/Dashboard/Account/Layout.vue | 57 - .../client/Dashboard/Account/Mails.vue | 111 - .../client/Dashboard/Account/Security.vue | 88 - .../client/Dashboard/Account/Settings.vue | 208 - .../client/Dashboard/Main/Announcements.vue | 392 - .../client/Dashboard/Main/BillingInfo.vue | 28 - .../client/Dashboard/Main/Header.vue | 26 - .../client/Dashboard/Main/ProductList.vue | 48 - .../client/Dashboard/Main/Stats.vue | 18 - .../client/Dashboard/Main/SupportPin.vue | 74 - .../client/Dashboard/Main/TicketList.vue | 76 - .../client/Dashboard/Main/UserInfo.vue | 39 - .../components/client/Errors/ErrorPage.vue | 53 - frontend/src/components/client/Layout.vue | 53 - .../src/components/client/LayoutDashboard.vue | 254 - .../src/components/client/layout/Footer.vue | 22 - .../client/layout/NotificationsDropdown.vue | 57 - .../client/layout/ProfileDropdown.vue | 65 - .../components/client/layout/SearchModal.vue | 143 - .../src/components/client/layout/Sidebar.vue | 180 - .../components/client/layout/TopNavBar.vue | 75 - .../client/ui/Card/CardComponent.vue | 28 - .../components/client/ui/LoadingScreen.vue | 37 - frontend/src/components/client/ui/Modal.vue | 37 - .../client/ui/Table/TableTanstack.vue | 211 - .../components/client/ui/Table/ViewButton.vue | 9 - .../client/ui/TextForms/SelectInput.vue | 145 - .../client/ui/TextForms/TextArea.vue | 27 - .../client/ui/TextForms/TextInput.vue | 31 - frontend/src/locale/en.yml | 487 - frontend/src/main.ts | 27 - frontend/src/mythicalclient/Activities.ts | 16 - frontend/src/mythicalclient/Announcements.ts | 16 - frontend/src/mythicalclient/Auth.ts | 265 - frontend/src/mythicalclient/Mails.ts | 16 - frontend/src/mythicalclient/Permissions.ts | 3 - frontend/src/mythicalclient/Session.ts | 73 - frontend/src/mythicalclient/Settings.ts | 95 - frontend/src/mythicalclient/StorageMonitor.ts | 90 - frontend/src/mythicalclient/Tickets.ts | 38 - frontend/src/mythicalclient/Translation.ts | 10 - .../src/mythicalclient/admin/Dashboard.ts | 15 - frontend/src/router/index.ts | 110 - frontend/src/views/admin/Home.vue | 70 - frontend/src/views/client/Account.vue | 72 - frontend/src/views/client/Home.vue | 46 - .../src/views/client/auth/ForgotPassword.vue | 124 - frontend/src/views/client/auth/Login.vue | 151 - frontend/src/views/client/auth/Register.vue | 171 - .../src/views/client/auth/ResetPassword.vue | 158 - .../src/views/client/auth/TwoFactorSetup.vue | 166 - .../src/views/client/auth/TwoFactorVerify.vue | 115 - frontend/src/views/client/auth/sso.vue | 74 - .../src/views/client/errors/Forbidden.vue | 13 - frontend/src/views/client/errors/NotFound.vue | 12 - .../src/views/client/errors/ServerError.vue | 12 - frontend/src/views/client/ticket/Create.vue | 249 - frontend/src/views/client/ticket/List.vue | 237 - frontend/src/views/client/ticket/[id].vue | 151 - frontend/tailwind.config.ts | 11 - frontend/tsconfig.app.json | 14 - frontend/tsconfig.json | 11 - frontend/tsconfig.node.json | 19 - frontend/vite.config.ts | 51 - frontend/yarn.lock | 3235 ------- install.bash | 184 - mythicalclient | 25 - nginx.conf | 146 - package.json | 38 + phpunit.xml | 33 + postcss.config.js | 6 + public/.htaccess | 25 + .../addons/.gitkeep => public/favicon.ico | 0 public/index.php | 17 + public/robots.txt | 2 + resources/css/app.css | 3 + resources/js/Components/ApplicationLogo.tsx | 13 + resources/js/Components/Checkbox.tsx | 17 + resources/js/Components/DangerButton.tsx | 22 + resources/js/Components/Dropdown.tsx | 130 + resources/js/Components/InputError.tsx | 16 + resources/js/Components/InputLabel.tsx | 20 + resources/js/Components/Modal.tsx | 71 + resources/js/Components/NavLink.tsx | 23 + resources/js/Components/PrimaryButton.tsx | 22 + resources/js/Components/ResponsiveNavLink.tsx | 21 + resources/js/Components/SecondaryButton.tsx | 24 + resources/js/Components/TextInput.tsx | 41 + resources/js/Layouts/AuthenticatedLayout.tsx | 179 + resources/js/Layouts/GuestLayout.tsx | 19 + resources/js/Pages/Auth/ConfirmPassword.tsx | 56 + resources/js/Pages/Auth/ForgotPassword.tsx | 56 + resources/js/Pages/Auth/Login.tsx | 111 + resources/js/Pages/Auth/Register.tsx | 121 + resources/js/Pages/Auth/ResetPassword.tsx | 100 + resources/js/Pages/Auth/VerifyEmail.tsx | 51 + resources/js/Pages/Dashboard.tsx | 26 + resources/js/Pages/Profile/Edit.tsx | 43 + .../Pages/Profile/Partials/DeleteUserForm.tsx | 124 + .../Profile/Partials/UpdatePasswordForm.tsx | 146 + .../Partials/UpdateProfileInformationForm.tsx | 118 + resources/js/Pages/Welcome.tsx | 366 + resources/js/app.tsx | 28 + resources/js/bootstrap.ts | 4 + resources/js/ssr.tsx | 33 + resources/js/types/global.d.ts | 17 + resources/js/types/index.d.ts | 17 + resources/js/types/vite-env.d.ts | 1 + resources/views/app.blade.php | 22 + routes/auth.php | 59 + routes/console.php | 8 + routes/web.php | 27 + storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tailwind.config.js | 22 + tests/Feature/Auth/AuthenticationTest.php | 54 + tests/Feature/Auth/EmailVerificationTest.php | 58 + .../Feature/Auth/PasswordConfirmationTest.php | 44 + tests/Feature/Auth/PasswordResetTest.php | 73 + tests/Feature/Auth/PasswordUpdateTest.php | 51 + tests/Feature/Auth/RegistrationTest.php | 31 + tests/Feature/ExampleTest.php | 19 + tests/Feature/ProfileTest.php | 99 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + tsconfig.json | 20 + vite.config.js | 14 + yarn.lock | 3453 +++++++ 320 files changed, 14271 insertions(+), 20761 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .gitattributes mode change 100755 => 100644 .gitignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100644 app/Http/Controllers/Auth/AuthenticatedSessionController.php create mode 100644 app/Http/Controllers/Auth/ConfirmablePasswordController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationNotificationController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationPromptController.php create mode 100644 app/Http/Controllers/Auth/NewPasswordController.php create mode 100644 app/Http/Controllers/Auth/PasswordController.php create mode 100644 app/Http/Controllers/Auth/PasswordResetLinkController.php create mode 100644 app/Http/Controllers/Auth/RegisteredUserController.php create mode 100644 app/Http/Controllers/Auth/VerifyEmailController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/ProfileController.php create mode 100644 app/Http/Middleware/HandleInertiaRequests.php create mode 100644 app/Http/Requests/Auth/LoginRequest.php create mode 100644 app/Http/Requests/ProfileUpdateRequest.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100755 artisan delete mode 100755 backend.conf delete mode 100755 backend/.dockerignore delete mode 100755 backend/.gitignore delete mode 100755 backend/.php-cs-fixer.dist.php delete mode 100755 backend/Dockerfile delete mode 100755 backend/app/Api/Admin/Dashboard.php delete mode 100755 backend/app/Api/System/Settings.php delete mode 100755 backend/app/Api/User/Auth/ForgotPassword.php delete mode 100755 backend/app/Api/User/Auth/Login.php delete mode 100755 backend/app/Api/User/Auth/Logout.php delete mode 100755 backend/app/Api/User/Auth/Register.php delete mode 100755 backend/app/Api/User/Auth/ResetPassword.php delete mode 100755 backend/app/Api/User/Auth/TwoFactor.php delete mode 100755 backend/app/Api/User/Auth/Verify.php delete mode 100755 backend/app/Api/User/Session/Announcements.php delete mode 100755 backend/app/Api/User/Session/Emails.php delete mode 100755 backend/app/Api/User/Session/Session.php delete mode 100755 backend/app/Api/User/Ticket/Create.php delete mode 100755 backend/app/Api/User/Ticket/List.php delete mode 100755 backend/app/App.php delete mode 100755 backend/app/Cache/Cache.php delete mode 100755 backend/app/Chat/Announcements/Announcements.php delete mode 100755 backend/app/Chat/Announcements/AnnouncementsAssets.php delete mode 100755 backend/app/Chat/Announcements/AnnouncementsTags.php delete mode 100755 backend/app/Chat/Database.php delete mode 100755 backend/app/Chat/Tickets/Departments.php delete mode 100755 backend/app/Chat/Tickets/Tickets.php delete mode 100755 backend/app/Chat/User/Billing.php delete mode 100755 backend/app/Chat/User/Can.php delete mode 100755 backend/app/Chat/User/Mails.php delete mode 100755 backend/app/Chat/User/Roles.php delete mode 100755 backend/app/Chat/User/Session.php delete mode 100755 backend/app/Chat/User/User.php delete mode 100755 backend/app/Chat/User/UserActivities.php delete mode 100755 backend/app/Chat/User/Verification.php delete mode 100755 backend/app/Chat/columns/EmailVerificationColumns.php delete mode 100755 backend/app/Chat/columns/RolesColumns.php delete mode 100755 backend/app/Chat/columns/UserColumns.php delete mode 100755 backend/app/Chat/exceptions/EmailExists.php delete mode 100755 backend/app/Chat/exceptions/UserNameExists.php delete mode 100755 backend/app/Chat/interface/RolesInterface.php delete mode 100755 backend/app/Chat/interface/UserActivitiesTypes.php delete mode 100755 backend/app/Cli/App.php delete mode 100755 backend/app/Cli/CommandBuilder.php delete mode 100755 backend/app/Cli/Commands/Addon.php delete mode 100755 backend/app/Cli/Commands/Colors.php delete mode 100755 backend/app/Cli/Commands/Decrypt.php delete mode 100755 backend/app/Cli/Commands/Down.php delete mode 100755 backend/app/Cli/Commands/Help.php delete mode 100755 backend/app/Cli/Commands/KeyRegen.php delete mode 100755 backend/app/Cli/Commands/Migrate.php delete mode 100755 backend/app/Cli/Commands/Rebuild.php delete mode 100755 backend/app/Cli/Commands/Setsetting.php delete mode 100755 backend/app/Cli/Commands/Setup.php delete mode 100755 backend/app/Cli/Commands/Up.php delete mode 100755 backend/app/CloudFlare/CloudFlareRealIP.php delete mode 100755 backend/app/Config/ConfigFactory.php delete mode 100755 backend/app/Config/ConfigInterface.php delete mode 100755 backend/app/FastChat/Redis.php delete mode 100755 backend/app/Hooks/GitHub.php delete mode 100755 backend/app/Hooks/MythicalAPP.php delete mode 100755 backend/app/Logger/LoggerFactory.php delete mode 100755 backend/app/Mail/Mail.php delete mode 100755 backend/app/Mail/services/SMTPServer.php delete mode 100755 backend/app/Mail/templates/NewLogin.php delete mode 100755 backend/app/Mail/templates/ResetPassword.php delete mode 100755 backend/app/Mail/templates/Verify.php delete mode 100755 backend/app/MythicalSystems/Telemetry.php delete mode 100755 backend/app/Plugins/PluginConfig.php delete mode 100755 backend/app/Plugins/PluginEvents.php delete mode 100755 backend/app/Plugins/PluginFlags.php delete mode 100755 backend/app/Plugins/PluginHelper.php delete mode 100755 backend/app/Plugins/PluginManager.php delete mode 100755 backend/app/Plugins/PluginTypes.php delete mode 100755 backend/boot/kernel.php delete mode 100755 backend/composer.json delete mode 100755 backend/mythicalclient delete mode 100755 backend/public/index.php delete mode 100755 backend/storage/.docker.env delete mode 100755 backend/storage/.env delete mode 100755 backend/storage/.gitignore delete mode 100755 backend/storage/addons/.gitignore delete mode 100755 backend/storage/caches/.gitkeep delete mode 100755 backend/storage/cron/bash/.gitkeep delete mode 100755 backend/storage/cron/bash/permissions.bash delete mode 100755 backend/storage/cron/php/.gitkeep delete mode 100755 backend/storage/cron/runner.bash delete mode 100755 backend/storage/cron/runner.php delete mode 100755 backend/storage/logs/.gitkeep delete mode 100755 backend/storage/migrations/2024-11-15-22.17-create-settings.sql delete mode 100755 backend/storage/migrations/2024-11-16-23.58-create-users.sql delete mode 100755 backend/storage/migrations/2024-11-20-21.41-create-mail-template.sql delete mode 100755 backend/storage/migrations/2024-11-25-23.37-create-billing.sql delete mode 100755 backend/storage/migrations/2024-12-25-22.03-create-services-categories.sql delete mode 100755 backend/storage/migrations/2024-12-25-22.04-create-services-categories-features.sql delete mode 100755 backend/storage/migrations/2024-12-25-22.05-create-tickets-departments.sql delete mode 100755 backend/storage/migrations/2024-12-25-23.50-create-addons-types.sql delete mode 100755 backend/storage/migrations/2024-12-25-23.51-create-addons.sql delete mode 100755 backend/storage/migrations/2024-12-25-23.58-create-services.sql delete mode 100755 backend/storage/migrations/2024-12-25-23.59-create-services-prices-types.sql delete mode 100755 backend/storage/migrations/2024-12-26-00.08-create-services-prices.sql delete mode 100755 backend/storage/migrations/2024-12-26-00.13-create-services-upgrades.sql delete mode 100755 backend/storage/migrations/2024-12-26-00.27-create-invoices-templates.sql delete mode 100755 backend/storage/migrations/2024-12-27-22.03-create-tickets.sql delete mode 100755 backend/storage/migrations/2024-12-28-22.04-create-tickets-attachments.sql delete mode 100755 backend/storage/migrations/2025-01-13-23.57-create-invoices.sql delete mode 100755 backend/storage/migrations/2025-01-14-14.19-create-announcements.sql delete mode 100755 backend/storage/migrations/2025-01-14-14.20-create-announcements_assets.sql delete mode 100755 backend/storage/migrations/2025-01-14-14.21-create-announcements_tags.sql delete mode 100755 backend/storage/migrations/2025-01-14-19.53-add-supportpin.sql delete mode 100755 backend/storage/migrations/2025-01-20-00.21-ticket-service-null.sql delete mode 100755 backend/storage/migrations/2025-01-20-01.01-fix-enabled.sql delete mode 100755 backend/storage/migrations/2025-01-21-00.16-add-ticket-prio.sql delete mode 100755 backend/storage/migrations/2025-01-21-12.50-add-status-tickets.sql delete mode 100755 backend/storage/migrations/2025-01-21-15.04-create-ticket-message.sql delete mode 100755 backend/tests/HelloWorldTest.php create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json rename backend/composer.lock => composer.lock (53%) mode change 100755 => 100644 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/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/seeders/DatabaseSeeder.php delete mode 100755 docker-compose.yml delete mode 100755 frontend.conf delete mode 100755 frontend/.dockerignore delete mode 100755 frontend/.editorconfig delete mode 100755 frontend/.gitignore delete mode 100755 frontend/.prettierrc.json delete mode 100755 frontend/Dockerfile delete mode 100755 frontend/README.md delete mode 100755 frontend/env.d.ts delete mode 100755 frontend/eslint.config.js delete mode 100755 frontend/index.html delete mode 100755 frontend/package.json delete mode 100755 frontend/postcss.config.js delete mode 100755 frontend/src/App.vue delete mode 100755 frontend/src/assets/main.css delete mode 100755 frontend/src/assets/sounds/error.mp3 delete mode 100755 frontend/src/assets/sounds/info.mp3 delete mode 100755 frontend/src/assets/sounds/success.mp3 delete mode 100755 frontend/src/components/admin/LayoutDashboard.vue delete mode 100755 frontend/src/components/client/Auth/FormCard.vue delete mode 100755 frontend/src/components/client/Auth/FormInput.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Activities.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Billing.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Layout.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Mails.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Security.vue delete mode 100755 frontend/src/components/client/Dashboard/Account/Settings.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/Announcements.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/BillingInfo.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/Header.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/ProductList.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/Stats.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/SupportPin.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/TicketList.vue delete mode 100755 frontend/src/components/client/Dashboard/Main/UserInfo.vue delete mode 100755 frontend/src/components/client/Errors/ErrorPage.vue delete mode 100755 frontend/src/components/client/Layout.vue delete mode 100755 frontend/src/components/client/LayoutDashboard.vue delete mode 100755 frontend/src/components/client/layout/Footer.vue delete mode 100755 frontend/src/components/client/layout/NotificationsDropdown.vue delete mode 100755 frontend/src/components/client/layout/ProfileDropdown.vue delete mode 100755 frontend/src/components/client/layout/SearchModal.vue delete mode 100755 frontend/src/components/client/layout/Sidebar.vue delete mode 100755 frontend/src/components/client/layout/TopNavBar.vue delete mode 100755 frontend/src/components/client/ui/Card/CardComponent.vue delete mode 100755 frontend/src/components/client/ui/LoadingScreen.vue delete mode 100755 frontend/src/components/client/ui/Modal.vue delete mode 100755 frontend/src/components/client/ui/Table/TableTanstack.vue delete mode 100755 frontend/src/components/client/ui/Table/ViewButton.vue delete mode 100755 frontend/src/components/client/ui/TextForms/SelectInput.vue delete mode 100755 frontend/src/components/client/ui/TextForms/TextArea.vue delete mode 100755 frontend/src/components/client/ui/TextForms/TextInput.vue delete mode 100755 frontend/src/locale/en.yml delete mode 100755 frontend/src/main.ts delete mode 100755 frontend/src/mythicalclient/Activities.ts delete mode 100755 frontend/src/mythicalclient/Announcements.ts delete mode 100755 frontend/src/mythicalclient/Auth.ts delete mode 100755 frontend/src/mythicalclient/Mails.ts delete mode 100755 frontend/src/mythicalclient/Permissions.ts delete mode 100755 frontend/src/mythicalclient/Session.ts delete mode 100755 frontend/src/mythicalclient/Settings.ts delete mode 100755 frontend/src/mythicalclient/StorageMonitor.ts delete mode 100755 frontend/src/mythicalclient/Tickets.ts delete mode 100755 frontend/src/mythicalclient/Translation.ts delete mode 100755 frontend/src/mythicalclient/admin/Dashboard.ts delete mode 100755 frontend/src/router/index.ts delete mode 100755 frontend/src/views/admin/Home.vue delete mode 100755 frontend/src/views/client/Account.vue delete mode 100755 frontend/src/views/client/Home.vue delete mode 100755 frontend/src/views/client/auth/ForgotPassword.vue delete mode 100755 frontend/src/views/client/auth/Login.vue delete mode 100755 frontend/src/views/client/auth/Register.vue delete mode 100755 frontend/src/views/client/auth/ResetPassword.vue delete mode 100755 frontend/src/views/client/auth/TwoFactorSetup.vue delete mode 100755 frontend/src/views/client/auth/TwoFactorVerify.vue delete mode 100755 frontend/src/views/client/auth/sso.vue delete mode 100755 frontend/src/views/client/errors/Forbidden.vue delete mode 100755 frontend/src/views/client/errors/NotFound.vue delete mode 100755 frontend/src/views/client/errors/ServerError.vue delete mode 100755 frontend/src/views/client/ticket/Create.vue delete mode 100755 frontend/src/views/client/ticket/List.vue delete mode 100755 frontend/src/views/client/ticket/[id].vue delete mode 100755 frontend/tailwind.config.ts delete mode 100755 frontend/tsconfig.app.json delete mode 100755 frontend/tsconfig.json delete mode 100755 frontend/tsconfig.node.json delete mode 100755 frontend/vite.config.ts delete mode 100755 frontend/yarn.lock delete mode 100755 install.bash delete mode 100755 mythicalclient delete mode 100755 nginx.conf create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 postcss.config.js create mode 100644 public/.htaccess rename backend/storage/addons/.gitkeep => public/favicon.ico (100%) mode change 100755 => 100644 create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/Components/ApplicationLogo.tsx create mode 100644 resources/js/Components/Checkbox.tsx create mode 100644 resources/js/Components/DangerButton.tsx create mode 100644 resources/js/Components/Dropdown.tsx create mode 100644 resources/js/Components/InputError.tsx create mode 100644 resources/js/Components/InputLabel.tsx create mode 100644 resources/js/Components/Modal.tsx create mode 100644 resources/js/Components/NavLink.tsx create mode 100644 resources/js/Components/PrimaryButton.tsx create mode 100644 resources/js/Components/ResponsiveNavLink.tsx create mode 100644 resources/js/Components/SecondaryButton.tsx create mode 100644 resources/js/Components/TextInput.tsx create mode 100644 resources/js/Layouts/AuthenticatedLayout.tsx create mode 100644 resources/js/Layouts/GuestLayout.tsx create mode 100644 resources/js/Pages/Auth/ConfirmPassword.tsx create mode 100644 resources/js/Pages/Auth/ForgotPassword.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/ResetPassword.tsx create mode 100644 resources/js/Pages/Auth/VerifyEmail.tsx create mode 100644 resources/js/Pages/Dashboard.tsx create mode 100644 resources/js/Pages/Profile/Edit.tsx create mode 100644 resources/js/Pages/Profile/Partials/DeleteUserForm.tsx create mode 100644 resources/js/Pages/Profile/Partials/UpdatePasswordForm.tsx create mode 100644 resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.tsx create mode 100644 resources/js/Pages/Welcome.tsx create mode 100644 resources/js/app.tsx create mode 100644 resources/js/bootstrap.ts create mode 100644 resources/js/ssr.tsx create mode 100644 resources/js/types/global.d.ts create mode 100644 resources/js/types/index.d.ts create mode 100644 resources/js/types/vite-env.d.ts create mode 100644 resources/views/app.blade.php create mode 100644 routes/auth.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/.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 tailwind.config.js create mode 100644 tests/Feature/Auth/AuthenticationTest.php create mode 100644 tests/Feature/Auth/EmailVerificationTest.php create mode 100644 tests/Feature/Auth/PasswordConfirmationTest.php create mode 100644 tests/Feature/Auth/PasswordResetTest.php create mode 100644 tests/Feature/Auth/PasswordUpdateTest.php create mode 100644 tests/Feature/Auth/RegistrationTest.php create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/Feature/ProfileTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 tsconfig.json create mode 100644 vite.config.js mode change 100755 => 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..8f0de65c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..6fb3de65 --- /dev/null +++ b/.env.example @@ -0,0 +1,66 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_TIMEZONE=UTC +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +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/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..fbeee927 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,28 @@ +{ + "env": { + "browser": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:prettier/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react/no-unescaped-entities": "off" + }, + "settings": { + "react": { + "version": "detect" + } + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fcb21d39 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 7b524f85..3847c0df --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,24 @@ -dockerfiles/mariadb/data -.installed \ No newline at end of file +/.phpunit.cache +/bootstrap/ssr +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +.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 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..f03e24a5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "singleQuote": true, + "plugins": [ + "prettier-plugin-organize-imports", + "prettier-plugin-tailwindcss" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 00000000..1a4c26ba --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +

Laravel Logo

+ +

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

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com/)** +- **[Tighten Co.](https://tighten.co)** +- **[WebReinvent](https://webreinvent.com/)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Jump24](https://jump24.co.uk)** +- **[Redberry](https://redberry.international/laravel/)** +- **[Active Logic](https://activelogic.com)** +- **[byte5](https://byte5.de)** +- **[OP.GG](https://op.gg)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 00000000..d44fe974 --- /dev/null +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,52 @@ + Route::has('password.request'), + 'status' => session('status'), + ]); + } + + /** + * Handle an incoming authentication request. + */ + public function store(LoginRequest $request): RedirectResponse + { + $request->authenticate(); + + $request->session()->regenerate(); + + return redirect()->intended(route('dashboard', absolute: false)); + } + + /** + * Destroy an authenticated session. + */ + public function destroy(Request $request): RedirectResponse + { + Auth::guard('web')->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 00000000..d2b1f14b --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,41 @@ +validate([ + 'email' => $request->user()->email, + 'password' => $request->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + $request->session()->put('auth.password_confirmed_at', time()); + + return redirect()->intended(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 00000000..f64fa9ba --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,24 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false)); + } + + $request->user()->sendEmailVerificationNotification(); + + return back()->with('status', 'verification-link-sent'); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 00000000..b42e0d53 --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,22 @@ +user()->hasVerifiedEmail() + ? redirect()->intended(route('dashboard', absolute: false)) + : Inertia::render('Auth/VerifyEmail', ['status' => session('status')]); + } +} diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 00000000..394cc4af --- /dev/null +++ b/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,69 @@ + $request->email, + 'token' => $request->route('token'), + ]); + } + + /** + * Handle an incoming new password request. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request): RedirectResponse + { + $request->validate([ + 'token' => 'required', + 'email' => 'required|email', + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function ($user) use ($request) { + $user->forceFill([ + 'password' => Hash::make($request->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + if ($status == Password::PASSWORD_RESET) { + return redirect()->route('login')->with('status', __($status)); + } + + throw ValidationException::withMessages([ + 'email' => [trans($status)], + ]); + } +} diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 00000000..57a82b58 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -0,0 +1,29 @@ +validate([ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + return back(); + } +} diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 00000000..b22c5441 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,51 @@ + session('status'), + ]); + } + + /** + * Handle an incoming password reset link request. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request): RedirectResponse + { + $request->validate([ + 'email' => 'required|email', + ]); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $status = Password::sendResetLink( + $request->only('email') + ); + + if ($status == Password::RESET_LINK_SENT) { + return back()->with('status', __($status)); + } + + throw ValidationException::withMessages([ + 'email' => [trans($status)], + ]); + } +} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 00000000..53a546b1 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,51 @@ +validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + event(new Registered($user)); + + Auth::login($user); + + return redirect(route('dashboard', absolute: false)); + } +} diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 00000000..784765e3 --- /dev/null +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,27 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..8677cd5c --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ + $request->user() instanceof MustVerifyEmail, + 'status' => session('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(); + + return Redirect::route('profile.edit'); + } + + /** + * Delete the user's account. + */ + public function destroy(Request $request): RedirectResponse + { + $request->validate([ + 'password' => ['required', 'current_password'], + ]); + + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return Redirect::to('/'); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php new file mode 100644 index 00000000..2ae5c6f3 --- /dev/null +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -0,0 +1,44 @@ + + */ + public function share(Request $request): array + { + return [ + ...parent::share($request), + 'auth' => [ + 'user' => $request->user(), + ], + 'ziggy' => fn () => [ + ...(new Ziggy)->toArray(), + 'location' => $request->url(), + ], + ]; + } +} diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php new file mode 100644 index 00000000..25746424 --- /dev/null +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -0,0 +1,85 @@ +|string> + */ + public function rules(): array + { + return [ + 'email' => ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]; + } + + /** + * Attempt to authenticate the request's credentials. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function authenticate(): void + { + $this->ensureIsNotRateLimited(); + + if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + } + + /** + * Ensure the login request is not rate limited. + * + * @throws \Illuminate\Validation\ValidationException + */ + public function ensureIsNotRateLimited(): void + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout($this)); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the rate limiting throttle key for the request. + */ + public function throttleKey(): string + { + return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip()); + } +} diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php new file mode 100644 index 00000000..3622a8f3 --- /dev/null +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'lowercase', + 'email', + 'max:255', + Rule::unique(User::class)->ignore($this->user()->id), + ], + ]; + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 00000000..749c7b77 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,48 @@ + */ + use HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..96e9f6c0 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,25 @@ +handleCommand(new ArgvInput); + +exit($status); diff --git a/backend.conf b/backend.conf deleted file mode 100755 index 20fb6f7c..00000000 --- a/backend.conf +++ /dev/null @@ -1,36 +0,0 @@ -server { - listen 80; - server_name framework.mythical.systems; - - # Root directory for PHP backend - root /var/www/html/public; - index index.php index.html index.htm; - - # Location for the PHP backend (handles all /api requests and PHP files) - location /api { - try_files $uri $uri/ /index.php; - } - - # General PHP script handling (via PHP-FPM) - location ~ \.php$ { - include fastcgi_params; - fastcgi_pass mythicalclient_backend:9000; # PHP-FPM is running here - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - } - - # Location for the frontend - location / { - proxy_pass http://mythicalclient_frontend:80; # Replace 'frontend:80' with your frontend service - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - - # Deny access to sensitive files - location ~ /\.(ht|git|svn) { - deny all; - } -} diff --git a/backend/.dockerignore b/backend/.dockerignore deleted file mode 100755 index 6e925e22..00000000 --- a/backend/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -/storage/packages \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100755 index 8556db75..00000000 --- a/backend/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.php-cs-fixer.cache -.phpunit.result.cache \ No newline at end of file diff --git a/backend/.php-cs-fixer.dist.php b/backend/.php-cs-fixer.dist.php deleted file mode 100755 index 49b97e4a..00000000 --- a/backend/.php-cs-fixer.dist.php +++ /dev/null @@ -1,91 +0,0 @@ -in(__DIR__) - ->exclude([ - 'vendor', - 'node_modules', - '.github', - '.vscode', - '.git', - 'docs', - 'caches', - 'logs', - 'storage', - ]) - ->notName(['_ide_helper*']); - - -return (new Config()) - ->setRiskyAllowed(true) - ->setFinder($finder) - ->setUsingCache(true) - ->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()) - ->setRules([ - '@Symfony' => true, - '@PSR1' => true, - '@PSR2' => true, - '@PSR12' => true, - 'align_multiline_comment' => ['comment_type' => 'phpdocs_like'], - 'combine_consecutive_unsets' => true, - 'concat_space' => ['spacing' => 'one'], - 'heredoc_to_nowdoc' => true, - 'no_alias_functions' => true, - 'no_unreachable_default_argument_value' => true, - 'ordered_imports' => [ - 'sort_algorithm' => 'length', - ], - 'phpdoc_align' => [ - 'align' => 'left', - 'tags' => [ - 'param', - 'property', - 'return', - 'throws', - 'type', - 'var', - ], - ], - 'header_comment' => ['header' => $header], - 'phpdoc_order' => true, - 'phpdoc_summary' => true, - 'phpdoc_to_comment' => false, - 'phpdoc_no_useless_inheritdoc' => true, - 'phpdoc_no_package' => true, - 'phpdoc_separation' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types_order' => [ - 'null_adjustment' => 'always_last', - 'sort_algorithm' => 'none', - ], - 'phpdoc_var_annotation_correct_order' => true, - 'single_line_throw' => false, - 'single_line_comment_style' => false, - 'random_api_migration' => true, - 'ternary_to_null_coalescing' => true, - 'yoda_style' => [ - 'equal' => false, - 'identical' => false, - 'less_and_greater' => false, - ], - 'ordered_class_elements' => true, - 'no_useless_else' => true, - 'no_extra_blank_lines' => true, - 'logical_operators' => true, - 'no_unused_imports' => true -]); \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100755 index 36b02562..00000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,54 +0,0 @@ -FROM php:8.3-fpm - -WORKDIR /var/www/html - -# Install system dependencies and PHP extensions -RUN apt-get update && apt-get install -y \ - libpng-dev \ - libjpeg-dev \ - libfreetype6-dev \ - libxml2-dev \ - libzip-dev \ - libonig-dev \ - libcurl4-openssl-dev \ - zip \ - unzip \ - git \ - cron \ - && docker-php-ext-configure gd --with-freetype --with-jpeg \ - && docker-php-ext-install \ - gd \ - pdo \ - pdo_mysql \ - mysqli \ - bcmath \ - xml \ - mbstring \ - curl \ - zip \ - redis \ - excimer - -RUN chown -R www-data:www-data /var/www/html \ - && chmod -R 755 /var/www/html - -# Install Composer -COPY --from=composer:latest /usr/bin/composer /usr/bin/composer - -# Copy composer files first to leverage Docker cache -COPY composer.json composer.lock ./ - -# Install dependencies -RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --optimize-autoloader - -# Copy rest of the application -COPY . . - -# Add a cron job -RUN (crontab -l ; echo "* * * * * cd /var/www/html && php mythicaldash schedule_work >> /dev/null 2>&1") | crontab -RUN (crontab -l ; echo "* * * * * cd /var/www/html/storage/cron && php runner.php >> /dev/null 2>&1") | crontab -RUN (crontab -l ; echo "* * * * * cd /var/www/html/storage/cron && bash runner.php >> /dev/null 2>&1") | crontab - -# Set permissions -RUN chown -R www-data:www-data /var/www/html \ - && chmod -R 755 /var/www/html \ No newline at end of file diff --git a/backend/app/Api/Admin/Dashboard.php b/backend/app/Api/Admin/Dashboard.php deleted file mode 100755 index 0e480698..00000000 --- a/backend/app/Api/Admin/Dashboard.php +++ /dev/null @@ -1,76 +0,0 @@ -get('/api/admin', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - $session = new Session($appInstance); - if (Can::canAccessAdminUI($session->getInfo(UserColumns::ROLE_ID, false))) { - try { - $github_data = new GitHub(); - $github_data = $github_data->getRepoData(); - $activity = UserActivities::getAll(150); - $userCount = Database::getTableRowCount('mythicalclient_users'); - $addonsCount = Database::getTableRowCount('mythicalclient_addons'); - $departmentsCount = Database::getTableRowCount('mythicalclient_departments'); - $invoicesCount = Database::getTableRowCount('mythicalclient_invoices'); - $rolesCount = Database::getTableRowCount('mythicalclient_roles'); - $servicesCount = Database::getTableRowCount('mythicalclient_services'); - $ticketsCount = Database::getTableRowCount('mythicalclient_tickets'); - - $appInstance->OK('Dashboard data retrieved successfully.', [ - 'core' => [ - 'github_data' => $github_data, - ], - 'count' => [ - 'user_count' => $userCount, - 'addons_count' => $addonsCount, - 'departments_count' => $departmentsCount, - 'invoices_count' => $invoicesCount, - 'roles_count' => $rolesCount, - 'services_count' => $servicesCount, - 'tickets_count' => $ticketsCount, - ], - 'etc' => [ - 'activity' => $activity, - ], - ]); - - } catch (Exception $e) { - $appInstance->InternalServerError($e->getMessage(), ['error_code' => 'SERVICE_UNAVAILABLE']); - } - } else { - $appInstance->Unauthorized('You do not have permission to access this endpoint.', ['error_code' => 'NO_PERMISSION']); - } - -}); diff --git a/backend/app/Api/System/Settings.php b/backend/app/Api/System/Settings.php deleted file mode 100755 index fe7082b3..00000000 --- a/backend/app/Api/System/Settings.php +++ /dev/null @@ -1,38 +0,0 @@ -add('/api/system/settings', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $settings = [ - ConfigInterface::APP_NAME => $config->getSetting(ConfigInterface::APP_NAME, 'MythicalClient'), - ConfigInterface::APP_LANG => $config->getSetting(ConfigInterface::APP_LANG, 'en_US'), - ConfigInterface::APP_URL => $config->getSetting(ConfigInterface::APP_URL, 'framework.mythical.systems'), - ConfigInterface::APP_VERSION => $config->getSetting(ConfigInterface::APP_VERSION, '1.0.0'), - ConfigInterface::APP_TIMEZONE => $config->getSetting(ConfigInterface::APP_TIMEZONE, 'UTC'), - ConfigInterface::APP_LOGO => $config->getSetting(ConfigInterface::APP_LOGO, 'https://github.com/mythicalltd.png'), - ConfigInterface::SEO_DESCRIPTION => $config->getSetting(ConfigInterface::SEO_DESCRIPTION, 'Change this in the settings area!'), - ConfigInterface::SEO_KEYWORDS => $config->getSetting(ConfigInterface::SEO_KEYWORDS, 'some,random,keywords'), - ConfigInterface::TURNSTILE_ENABLED => $config->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false'), - ConfigInterface::TURNSTILE_KEY_PUB => $config->getSetting(ConfigInterface::TURNSTILE_KEY_PUB, 'XXXX'), - ConfigInterface::LEGAL_TOS => $config->getSetting(ConfigInterface::LEGAL_TOS, '/tos'), - ConfigInterface::LEGAL_PRIVACY => $config->getSetting(ConfigInterface::LEGAL_PRIVACY, '/privacy'), - ]; - - App::OK('Sure here are the settings you were looking for', ['settings' => $settings]); -}); diff --git a/backend/app/Api/User/Auth/ForgotPassword.php b/backend/app/Api/User/Auth/ForgotPassword.php deleted file mode 100755 index 5239f07e..00000000 --- a/backend/app/Api/User/Auth/ForgotPassword.php +++ /dev/null @@ -1,63 +0,0 @@ -add('/api/user/auth/forgot', function (): void { - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - /** - * Check if the required fields are set. - * - * @var string - */ - if (!isset($_POST['email']) || $_POST['email'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_EMAIL']); - } - - /** - * Process the turnstile response. - * - * IF the turnstile is enabled - */ - if ($appInstance->getConfig()->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false') == 'true') { - if (!isset($_POST['turnstileResponse']) || $_POST['turnstileResponse'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'TURNSTILE_FAILED']); - } - $cfTurnstileResponse = $_POST['turnstileResponse']; - if (!Turnstile::validate($cfTurnstileResponse, CloudFlareRealIP::getRealIP(), $config->getSetting(ConfigInterface::TURNSTILE_KEY_PRIV, 'XXXX'))) { - $appInstance->BadRequest('Invalid TurnStile Key', ['error_code' => 'TURNSTILE_FAILED']); - } - } - $email = $_POST['email']; - - if (User::exists(UserColumns::EMAIL, $email)) { - - if (User::forgotPassword($email)) { - $appInstance->OK('Successfully sent email', []); - } else { - $appInstance->BadRequest('Failed to send email', ['error_code' => 'FAILED_TO_SEND_EMAIL']); - } - - } else { - $appInstance->BadRequest('Email does not exist', ['error_code' => 'EMAIL_DOES_NOT_EXIST']); - } - -}); diff --git a/backend/app/Api/User/Auth/Login.php b/backend/app/Api/User/Auth/Login.php deleted file mode 100755 index 6950f5aa..00000000 --- a/backend/app/Api/User/Auth/Login.php +++ /dev/null @@ -1,86 +0,0 @@ -add('/api/user/auth/login', function (): void { - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - - /** - * Check if the required fields are set. - * - * @var string - */ - if (!isset($_POST['login']) || $_POST['login'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_LOGIN']); - } - - if (!isset($_POST['password']) || $_POST['password'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_PASSWORD']); - } - - /** - * Process the turnstile response. - * - * IF the turnstile is enabled - */ - if ($appInstance->getConfig()->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false') == 'true') { - if (!isset($_POST['turnstileResponse']) || $_POST['turnstileResponse'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'TURNSTILE_FAILED']); - } - $cfTurnstileResponse = $_POST['turnstileResponse']; - if (!Turnstile::validate($cfTurnstileResponse, CloudFlareRealIP::getRealIP(), $config->getSetting(ConfigInterface::TURNSTILE_KEY_PRIV, 'XXXX'))) { - $appInstance->BadRequest('Invalid TurnStile Key', ['error_code' => 'TURNSTILE_FAILED']); - } - } - $login = $_POST['login']; - $password = $_POST['password']; - - $login = User::login($login, $password); - setcookie('user_token', $login, time() + 3600, '/'); - - if ($login == 'false') { - $appInstance->BadRequest('Invalid login credentials', ['error_code' => 'INVALID_CREDENTIALS']); - } else { - if (User::getInfo($login, UserColumns::VERIFIED, false) == 'false') { - if (Mail::isEnabled() == true) { - User::logout(); - $appInstance->BadRequest('Account not verified', ['error_code' => 'ACCOUNT_NOT_VERIFIED']); - } - } - - if (User::getInfo($login, UserColumns::BANNED, false) != 'NO') { - User::logout(); - $appInstance->BadRequest('Account is banned', ['error_code' => 'ACCOUNT_BANNED']); - } - - if (User::getInfo($login, UserColumns::DELETED, false) == 'true') { - User::logout(); - $appInstance->BadRequest('Account is deleted', ['error_code' => 'ACCOUNT_DELETED']); - } - - if (User::getInfo($login, UserColumns::TWO_FA_ENABLED, false) == 'true') { - User::updateInfo($login, UserColumns::TWO_FA_BLOCKED, 'true', false); - } - $appInstance->OK('Successfully logged in', []); - } -}); diff --git a/backend/app/Api/User/Auth/Logout.php b/backend/app/Api/User/Auth/Logout.php deleted file mode 100755 index 9d2b3e46..00000000 --- a/backend/app/Api/User/Auth/Logout.php +++ /dev/null @@ -1,34 +0,0 @@ -get('/api/user/auth/logout', function (): void { - echo ''; - try { - setcookie('user_token', '', time() - 460800 * 460800 * 460800, '/'); - if (session_status() === PHP_SESSION_ACTIVE) { - session_unset(); - session_destroy(); - } - - header('location: /auth/login?href=api'); - exit; - } catch (Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to logout user' . $e->getMessage()); - header('location: /auth/login?href=api'); - } -}); diff --git a/backend/app/Api/User/Auth/Register.php b/backend/app/Api/User/Auth/Register.php deleted file mode 100755 index c14b64a2..00000000 --- a/backend/app/Api/User/Auth/Register.php +++ /dev/null @@ -1,89 +0,0 @@ -add('/api/user/auth/register', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - /** - * Check if the required fields are set. - * - * @var string - */ - if (!isset($_POST['firstName']) || $_POST['firstName'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_FIRST_NAME']); - } - if (!isset($_POST['lastName']) || $_POST['lastName'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_LAST_NAME']); - } - if (!isset($_POST['email']) || $_POST['email'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_EMAIL']); - } - - if (!isset($_POST['password']) || $_POST['password'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_PASSWORD']); - } - - if (!isset($_POST['username']) || $_POST['username'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_USERNAME']); - } - /** - * Process the turnstile response. - * - * IF the turnstile is enabled - */ - if ($appInstance->getConfig()->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false') == 'true') { - if (!isset($_POST['turnstileResponse']) || $_POST['turnstileResponse'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'TURNSTILE_FAILED']); - } - $cfTurnstileResponse = $_POST['turnstileResponse']; - if (!Turnstile::validate($cfTurnstileResponse, CloudFlareRealIP::getRealIP(), $config->getSetting(ConfigInterface::TURNSTILE_KEY_PRIV, 'XXXX'))) { - $appInstance->BadRequest('Invalid TurnStile Key', ['error_code' => 'TURNSTILE_FAILED']); - } - } - - $firstName = $_POST['firstName']; - $lastName = $_POST['lastName']; - $email = $_POST['email']; - $password = $_POST['password']; - $username = $_POST['username']; - - /** - * Check if the email is already in use. - * - * @var bool - */ - try { - if (User::exists(UserColumns::USERNAME, $username)) { - $appInstance->BadRequest('Bad Request', ['error_code' => 'USERNAME_ALREADY_IN_USE']); - } - if (User::exists(UserColumns::EMAIL, $email)) { - $appInstance->BadRequest('Bad Request', ['error_code' => 'EMAIL_ALREADY_IN_USE']); - } - User::register($username, $password, $email, $firstName, $lastName, CloudFlareRealIP::getRealIP()); - App::OK('User registered', []); - - } catch (Exception $e) { - $appInstance->InternalServerError('Internal Server Error', ['error_code' => 'DATABASE_ERROR']); - } - -}); diff --git a/backend/app/Api/User/Auth/ResetPassword.php b/backend/app/Api/User/Auth/ResetPassword.php deleted file mode 100755 index ac70b2a5..00000000 --- a/backend/app/Api/User/Auth/ResetPassword.php +++ /dev/null @@ -1,105 +0,0 @@ -get('/api/user/auth/reset', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyGET(); - - if (isset($_GET['code']) && $_GET['code'] != '') { - $code = $_GET['code']; - - if (Verification::verify($code, EmailVerificationColumns::$type_password)) { - $appInstance->OK('Code is valid', ['reset_code' => $code]); - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_CODE']); - } - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_CODE']); - } -}); - -$router->post('/api/user/auth/reset', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - - if (!isset($_POST['email_code']) || $_POST['email_code'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_CODE']); - } - - if (!isset($_POST['password']) || $_POST['password'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_PASSWORD']); - } - - if (!isset($_POST['confirmPassword']) || $_POST['confirmPassword'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_PASSWORD_CONFIRM']); - } - - if ($_POST['password'] != $_POST['confirmPassword']) { - $appInstance->BadRequest('Bad Request', ['error_code' => 'PASSWORDS_DO_NOT_MATCH']); - } - - $code = $_POST['email_code']; - $password = $_POST['password']; - - /** - * Process the turnstile response. - * - * IF the turnstile is enabled - */ - if ($appInstance->getConfig()->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false') == 'true') { - if (!isset($_POST['turnstileResponse']) || $_POST['turnstileResponse'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'TURNSTILE_FAILED']); - } - $cfTurnstileResponse = $_POST['turnstileResponse']; - if (!Turnstile::validate($cfTurnstileResponse, CloudFlareRealIP::getRealIP(), $config->getSetting(ConfigInterface::TURNSTILE_KEY_PRIV, 'XXXX'))) { - $appInstance->BadRequest('Invalid TurnStile Key', ['error_code' => 'TURNSTILE_FAILED']); - } - } - - if (Verification::verify($code, EmailVerificationColumns::$type_password)) { - $uuid = Verification::getUserUUID($code); - if ($uuid == null || $uuid == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_CODE']); - } - $userToken = User::getTokenFromUUID($uuid); - if ($userToken == null || $userToken == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_CODE']); - } - - if (User::updateInfo($userToken, UserColumns::PASSWORD, $password, true) == true) { - Verification::delete($code); - $token = App::getInstance(true)->encrypt(date('Y-m-d H:i:s') . $uuid . random_bytes(16) . base64_encode($code)); - User::updateInfo($userToken, UserColumns::ACCOUNT_TOKEN, $token, true); - $appInstance->OK('Password has been reset', []); - } else { - $appInstance->BadRequest('Failed to reset password', ['error_code' => 'FAILED_TO_RESET_PASSWORD']); - } - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_CODE']); - } -}); diff --git a/backend/app/Api/User/Auth/TwoFactor.php b/backend/app/Api/User/Auth/TwoFactor.php deleted file mode 100755 index aa507d93..00000000 --- a/backend/app/Api/User/Auth/TwoFactor.php +++ /dev/null @@ -1,88 +0,0 @@ -get('/api/user/auth/2fa/setup', function (): void { - App::init(); - $appInstance = App::getInstance(true); - - $appInstance->allowOnlyGET(); - $google2fa = new Google2FA(); - $session = new Session($appInstance); - - $secret = $google2fa->generateSecretKey(); - $session->setInfo(UserColumns::TWO_FA_KEY, $secret, true); - $appInstance->OK('Successfully generated secret key', ['secret' => $secret]); -}); - -$router->post('/api/user/auth/2fa/setup', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - $appInstance->allowOnlyPOST(); - /** - * Process the turnstile response. - * - * IF the turnstile is enabled - */ - if ($appInstance->getConfig()->getSetting(ConfigInterface::TURNSTILE_ENABLED, 'false') == 'true') { - if (!isset($_POST['turnstileResponse']) || $_POST['turnstileResponse'] == '') { - $appInstance->BadRequest('Bad Request', ['error_code' => 'TURNSTILE_FAILED']); - } - $cfTurnstileResponse = $_POST['turnstileResponse']; - if (!Turnstile::validate($cfTurnstileResponse, CloudFlareRealIP::getRealIP(), $config->getSetting(ConfigInterface::TURNSTILE_KEY_PRIV, 'XXXX'))) { - $appInstance->BadRequest('Invalid TurnStile Key', ['error_code' => 'TURNSTILE_FAILED']); - } - } - - $google2fa = new Google2FA(); - - if (!isset($_POST['code'])) { - $appInstance->getLogger()->debug('Code missing'); - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_CODE']); - } - - $secret = User::getInfo($_COOKIE['user_token'], UserColumns::TWO_FA_KEY, true); - $code = $_POST['code']; - - if ($google2fa->verifyKey($secret, $code, null, null, null)) { - User::updateInfo($_COOKIE['user_token'], UserColumns::TWO_FA_ENABLED, 'true', encrypted: false); - User::updateInfo($_COOKIE['user_token'], UserColumns::TWO_FA_BLOCKED, 'false', false); - $appInstance->OK('Code valid go on!', ['secret' => $secret]); - } else { - $appInstance->Unauthorized('Code invalid', ['error_code' => 'INVALID_CODE']); - } -}); - -$router->get('/api/auth/2fa/setup/kill', function () { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - - $session = new Session($appInstance); - - $session->setInfo(UserColumns::TWO_FA_ENABLED, 'false', false); - $session->setInfo(UserColumns::TWO_FA_KEY, '', false); - - header('location: /?href=api'); - - exit; -}); diff --git a/backend/app/Api/User/Auth/Verify.php b/backend/app/Api/User/Auth/Verify.php deleted file mode 100755 index 6860f122..00000000 --- a/backend/app/Api/User/Auth/Verify.php +++ /dev/null @@ -1,50 +0,0 @@ -get('/api/user/auth/verify', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyGET(); - - if (isset($_GET['code']) && $_GET['code'] != '') { - $code = $_GET['code']; - - if (Verification::verify($code, EmailVerificationColumns::$type_verify)) { - if (User::exists(UserColumns::UUID, Verification::getUserUUID($code))) { - $token = User::getInfo(User::getTokenFromUUID(Verification::getUserUUID($code)), UserColumns::ACCOUNT_TOKEN, false); - if ($token != null && $token != '') { - setcookie('user_token', $token, time() + 3600, '/'); - User::updateInfo(User::getTokenFromUUID(Verification::getUserUUID($code)), UserColumns::VERIFIED, 'true', false); - Verification::delete($code); - exit(header('location: /')); - } - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_USER', 'email_code' => $code]); - - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_USER', 'email_code' => $code]); - } - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_CODE', 'email_code' => $code]); - } - } else { - $appInstance->BadRequest('Bad Request', ['error_code' => 'MISSING_CODE']); - } -}); diff --git a/backend/app/Api/User/Session/Announcements.php b/backend/app/Api/User/Session/Announcements.php deleted file mode 100755 index 964fa88b..00000000 --- a/backend/app/Api/User/Session/Announcements.php +++ /dev/null @@ -1,25 +0,0 @@ -add('/api/user/announcements', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - new Session($appInstance); - - $appInstance->OK('Here you go, cuz i heard you want some announcements!', ['announcements' => Announcements::getAll()]); -}); diff --git a/backend/app/Api/User/Session/Emails.php b/backend/app/Api/User/Session/Emails.php deleted file mode 100755 index 97b433db..00000000 --- a/backend/app/Api/User/Session/Emails.php +++ /dev/null @@ -1,84 +0,0 @@ -get('/api/user/session/emails', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - $session = new Session($appInstance); - $accountToken = $session->SESSION_KEY; - $appInstance->OK('User emails', [ - 'emails' => Mails::getAll(User::getInfo($accountToken, UserColumns::UUID, false)), - ]); -}); - -$router->get('/api/user/session/emails/(.*)/raw', function (string $id): void { - $appInstance = App::getInstance(true); - if ($id == '') { - exit(header('location: /account')); - } - - if (!is_numeric($id)) { - exit(header('location: /account')); - } - $id = (int) $id; - - $appInstance->allowOnlyGET(); - - $session = new Session($appInstance); - - $accountToken = $session->SESSION_KEY; - - if (Mails::exists($id)) { - if (Mails::doesUserOwnEmail(User::getInfo($accountToken, UserColumns::UUID, false), $id)) { - $mail = Mails::get($id); - header('Content-Type: text/html; charset=utf-8'); - echo $mail['body']; - exit; - } - exit(header('location: /account')); - - } - exit(header('location: /account')); - -}); - -$router->delete('/api/user/session/emails/(.*)/delete', function (string $id): void { - $appInstance = App::getInstance(true); - if ($id == '') { - $appInstance->BadRequest('Email not found!', ['error_code' => 'EMAIL_NOT_FOUND']); - } - if (!is_numeric($id)) { - $appInstance->BadRequest('Email not found!', ['error_code' => 'EMAIL_NOT_FOUND']); - } - $id = (int) $id; - $appInstance->allowOnlyDELETE(); - $session = new Session($appInstance); - $accountToken = $session->SESSION_KEY; - if (Mails::exists($id)) { - if (Mails::doesUserOwnEmail(User::getInfo($accountToken, UserColumns::UUID, false), $id)) { - Mails::delete($id, User::getInfo($accountToken, UserColumns::UUID, false)); - $appInstance->OK('Email deleted successfully!', []); - } else { - $appInstance->Unauthorized('Unauthorized', ['error_code' => 'UNAUTHORIZED']); - } - } else { - $appInstance->BadRequest('Email not found!', ['error_code' => 'EMAIL_NOT_FOUND']); - } -}); diff --git a/backend/app/Api/User/Session/Session.php b/backend/app/Api/User/Session/Session.php deleted file mode 100755 index 08eb35d6..00000000 --- a/backend/app/Api/User/Session/Session.php +++ /dev/null @@ -1,198 +0,0 @@ -post('/api/user/session/info/update', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - $session = new Session($appInstance); - - try { - if (!isset($_POST['first_name']) && $_POST['first_name'] == '') { - $appInstance->BadRequest('First name is missing!', ['error_code' => 'FIRST_NAME_MISSING']); - } - if (!isset($_POST['last_name']) && $_POST['last_name'] == '') { - $appInstance->BadRequest('Last name is missing!', ['error_code' => 'LAST_NAME_MISSING']); - } - if (!isset($_POST['email']) && $_POST['email'] == '') { - $appInstance->BadRequest('Email is missing!', ['error_code' => 'EMAIL_MISSING']); - } - if (!isset($_POST['avatar']) && $_POST['avatar'] == '') { - $appInstance->BadRequest('Avatar is missing!', ['error_code' => 'AVATAR_MISSING']); - } - if (!isset($_POST['background']) && $_POST['background'] == '') { - $appInstance->BadRequest('Background is missing!', ['error_code' => 'BACKGROUND_MISSING']); - } - - if ($_POST['email'] != $session->getInfo(UserColumns::EMAIL, false) && User::exists(UserColumns::EMAIL, $_POST['email'])) { - $appInstance->BadRequest('Email already exists!', ['error_code' => 'EMAIL_EXISTS']); - } - - $session->setInfo(UserColumns::FIRST_NAME, $_POST['first_name'], true); - $session->setInfo(UserColumns::LAST_NAME, $_POST['last_name'], true); - $session->setInfo(UserColumns::EMAIL, $_POST['email'], false); - $session->setInfo(UserColumns::AVATAR, $_POST['avatar'], false); - $session->setInfo(UserColumns::BACKGROUND, $_POST['background'], false); - - $appInstance->OK('User info updated successfully!', []); - } catch (Exception $e) { - $appInstance->getLogger()->error('Failed to update user info! ' . $e->getMessage()); - $appInstance->BadRequest('Bad Request', ['error_code' => 'DB_ERROR', 'error' => $e->getMessage()]); - } -}); - -$router->post('/api/user/session/billing/update', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $config = $appInstance->getConfig(); - - $appInstance->allowOnlyPOST(); - $session = new Session($appInstance); - - try { - if (!isset($_POST['company_name']) && $_POST['company_name'] == '') { - $appInstance->BadRequest('Company name is missing!', ['error_code' => 'COMPANY_NAME_MISSING']); - } - $companyName = $_POST['company_name']; - if (!isset($_POST['vat_number']) && $_POST['vat_number'] == '') { - $appInstance->BadRequest('VAT Number is missing!', ['error_code' => 'VAT_NUMBER_MISSING']); - } - $vatNumber = $_POST['vat_number']; - if (!isset($_POST['address1']) && $_POST['address1'] == '') { - $appInstance->BadRequest('Address 1 is missing', ['error_code' => 'ADDRESS1_MISSING']); - } - $address1 = $_POST['address1']; - if (!isset($_POST['address2']) && $_POST['address2'] == '') { - $appInstance->BadRequest('Address 2 is missing', ['error_code' => 'ADDRESS2_MISSING']); - } - $address2 = $_POST['address2']; - if (!isset($_POST['city']) && $_POST['city'] == '') { - $appInstance->BadRequest('City is missing', ['error_code' => 'CITY_MISSING']); - } - $city = $_POST['city']; - if (!isset($_POST['country']) && $_POST['country'] == '') { - $appInstance->BadRequest('Country is missing', ['error_code' => 'COUNTRY_MISSING']); - } - $country = $_POST['country']; - if (!isset($_POST['state']) && $_POST['state'] == '') { - $appInstance->BadRequest('State is missing', ['error_code' => 'STATE_MISSING']); - } - $state = $_POST['state']; - if (!isset($_POST['postcode']) && $_POST['postcode'] == '') { - $appInstance->BadRequest('PostCode is missing', ['error_code' => 'POSTCODE_MISSING']); - } - $postcode = $_POST['postcode']; - - Billing::updateBilling( - $session->getInfo(UserColumns::UUID, false), - $companyName, - $vatNumber, - $address1, - $address2, - $city, - $country, - $state, - $postcode - ); - - $appInstance->OK('Billing info saved successfully!', []); - } catch (Exception $e) { - $appInstance->getLogger()->error('Failed to save billing info! ' . $e->getMessage()); - $appInstance->BadRequest('Bad Request', ['error_code' => 'DB_ERROR', 'error' => $e->getMessage()]); - } -}); - -$router->add('/api/user/session/newPin', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyPOST(); - $session = new Session($appInstance); - $pin = $appInstance->generatePin(); - try { - $session->setInfo(UserColumns::SUPPORT_PIN, $pin, false); - $appInstance->OK('Support pin updated successfully!', ['pin' => $pin]); - } catch (Exception $e) { - $appInstance->getLogger()->error('Failed to generate new pin: ' . $e->getMessage()); - $appInstance->BadRequest('Bad Request', ['error_code' => 'DB_ERROR', 'error' => $e->getMessage()]); - } -}); - -$router->get('/api/user/session', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - $session = new Session($appInstance); - $accountToken = $session->SESSION_KEY; - try { - $billing = Billing::getBillingData(User::getInfo($accountToken, UserColumns::UUID, false)); - $columns = [ - UserColumns::USERNAME, - UserColumns::EMAIL, - UserColumns::VERIFIED, - UserColumns::SUPPORT_PIN, - UserColumns::BANNED, - UserColumns::TWO_FA_BLOCKED, - UserColumns::TWO_FA_ENABLED, - UserColumns::TWO_FA_KEY, - UserColumns::FIRST_NAME, - UserColumns::LAST_NAME, - UserColumns::AVATAR, - UserColumns::UUID, - UserColumns::ROLE_ID, - UserColumns::FIRST_IP, - UserColumns::LAST_IP, - UserColumns::DELETED, - UserColumns::LAST_SEEN, - UserColumns::FIRST_SEEN, - UserColumns::BACKGROUND, - ]; - - $info = User::getInfoArray($accountToken, $columns, [ - UserColumns::FIRST_NAME, - UserColumns::LAST_NAME, - UserColumns::TWO_FA_KEY, - ]); - $info['role_name'] = Roles::getUserRoleName($info[UserColumns::UUID]); - $info['role_real_name'] = strtolower($info['role_name']); - - $appInstance->OK('Account token is valid', [ - 'user_info' => $info, - 'billing' => $billing, - ]); - - } catch (Exception $e) { - $appInstance->BadRequest('Bad Request', ['error_code' => 'INVALID_ACCOUNT_TOKEN', 'error' => $e->getMessage()]); - } - -}); - -$router->get('/api/user/session/activities', function (): void { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - $session = new Session($appInstance); - $accountToken = $session->SESSION_KEY; - $appInstance->OK('User activities', [ - 'activities' => UserActivities::get(User::getInfo($accountToken, UserColumns::UUID, false)), - ]); -}); diff --git a/backend/app/Api/User/Ticket/Create.php b/backend/app/Api/User/Ticket/Create.php deleted file mode 100755 index 04a58b4a..00000000 --- a/backend/app/Api/User/Ticket/Create.php +++ /dev/null @@ -1,103 +0,0 @@ -get('/api/user/ticket/create', function () { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - new Session($appInstance); - - $departments = Departments::getAll(); - $services = [ - [ - 'id' => 1, - 'name' => 'Service 1', - 'active' => true, - ], - ]; - - $appInstance->OK('Ticket Process', [ - 'departments' => $departments, - 'services' => $services, - ]); -}); - -$router->post('/api/user/ticket/create', function () { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyPOST(); - $session = new Session($appInstance); - - if (isset($_POST['department_id']) && $_POST['department_id'] != '') { - $departmentId = $_POST['department_id']; - if (Departments::exists((int) $departmentId)) { - /** - * Make that every info needed is provided. - */ - if (isset($_POST['service_id']) && $_POST['service_id'] != '') { - $serviceId = $_POST['service_id']; - } else { - $serviceId = null; - } - if (isset($_POST['subject']) && $_POST['subject'] != '') { - $subject = $_POST['subject']; - } else { - $appInstance->BadRequest('Subject is missing!', ['error_code' => 'SUBJECT_MISSING']); - } - - if (isset($_POST['message']) && $_POST['message'] != '') { - $message = $_POST['message']; - } else { - $appInstance->BadRequest('Message is missing!', ['error_code' => 'MESSAGE_MISSING']); - } - - if (isset($_POST['priority']) && $_POST['priority'] != '') { - $priority = $_POST['priority']; - } else { - $priority = 'normal'; - } - - // TODO: Check if service exists - /** - * Check if the user has more than 3 open tickets. - */ - $userTickets = Tickets::getAllTicketsByUser($session->getInfo(UserColumns::UUID, false), 150); - $openTickets = array_filter($userTickets, function ($ticket) { - return in_array($ticket['status'], ['open', 'waiting', 'replied', 'inprogress']); - }); - if (count($openTickets) >= 3) { - $appInstance->BadRequest('You have reached the limit of 3 open tickets!', ['error_code' => 'LIMIT_REACHED']); - } - /** - * Create the ticket. - */ - $ticketId = Tickets::create($session->getInfo(UserColumns::UUID, false), $departmentId, $serviceId, $subject, $message, $priority); - if ($ticketId == 0) { - $appInstance->BadRequest('Failed to create ticket!', ['error_code' => 'FAILED_TO_CREATE_TICKET']); - } else { - $appInstance->OK('Ticket created successfully!', ['ticket_id' => $ticketId]); - } - } else { - $appInstance->BadRequest('Department not found!', ['error_code' => 'DEPARTMENT_NOT_FOUND']); - } - } else { - $appInstance->BadRequest('Department ID is missing!', ['error_code' => 'DEPARTMENT_ID_MISSING']); - } -}); diff --git a/backend/app/Api/User/Ticket/List.php b/backend/app/Api/User/Ticket/List.php deleted file mode 100755 index 08c70ab8..00000000 --- a/backend/app/Api/User/Ticket/List.php +++ /dev/null @@ -1,31 +0,0 @@ -get('/api/user/ticket/list', function () { - App::init(); - $appInstance = App::getInstance(true); - $appInstance->allowOnlyGET(); - $s = new Session($appInstance); - - $tickets = Tickets::getAllTicketsByUser($s->getInfo(UserColumns::UUID, false), 150); - - $appInstance->OK('Tickets', [ - 'tickets' => $tickets, - ]); - -}); diff --git a/backend/app/App.php b/backend/app/App.php deleted file mode 100755 index 6ec91e9d..00000000 --- a/backend/app/App.php +++ /dev/null @@ -1,293 +0,0 @@ -loadEnv(); - - /** - * Instance. - */ - self::$instance = $this; - - /** - * Soft boot. - * - * If the soft boot is true, we do not want to initialize the database connection or the router. - * - * This is useful for commands or other things that do not require the database connection. - * - * This is also a lite way to boot the application without initializing the database connection or the router!. - */ - if ($softBoot) { - return; - } - \Sentry\init([ - 'dsn' => 'https://0e107fab7de1d5810a80fc591cb91a45@o4508434822791168.ingest.de.sentry.io/4508675813736528', - // Specify a fixed sample rate - 'traces_sample_rate' => 1.0, - // Set a sampling rate for profiling - this is relative to traces_sample_rate - 'profiles_sample_rate' => 1.0, - ]); - /** - * Redis. - */ - $redis = new FastChat\Redis(); - if ($redis->testConnection() == false) { - define('REDIS_ENABLED', false); - } else { - define('REDIS_ENABLED', true); - } - - // @phpstan-ignore-next-line - $rateLimiter = new RedisRateLimiter(Rate::perMinute(RATE_LIMIT), new \Redis(), 'rate_limiting'); - try { - $rateLimiter->limit(CloudFlareRealIP::getRealIP()); - } catch (LimitExceeded $e) { - self::getLogger()->error('User: ' . $e->getMessage()); - self::init(); - self::ServiceUnavailable('You are being rate limited!', ['error_code' => 'RATE_LIMITED']); - } catch (\Exception $e) { - self::getLogger()->error('-----------------------------'); - self::getLogger()->error('REDIS SERVER IS DOWN'); - self::getLogger()->error('RATE LIMITING IS DISABLED'); - self::getLogger()->error('YOU SHOULD FIX THIS ASAP'); - self::getLogger()->error('NO SUPPORT WILL BE PROVIDED'); - self::getLogger()->error('-----------------------------'); - } - - /** - * Database Connection. - */ - try { - $this->db = new Database($_ENV['DATABASE_HOST'], $_ENV['DATABASE_DATABASE'], $_ENV['DATABASE_USER'], $_ENV['DATABASE_PASSWORD']); - } catch (\Exception $e) { - self::init(); - self::InternalServerError($e->getMessage(), null); - } - /** - * Email correction. - */ - if ($this->getConfig()->getSetting('app_url', null) == null) { - $this->getConfig()->setSetting('app_url', $_SERVER['HTTP_HOST']); - } - - /** - * Initialize the plugin manager. - */ - Plugins\PluginManager::loadKernel(); - define('LOGGER', $this->getLogger()); - - $router = new rt(); - $this->registerApiRoutes($router); - try { - $router->route(); - } catch (\Exception $e) { - self::init(); - self::InternalServerError($e->getMessage(), null); - } - } - - /** - * Register all api endpoints. - * - * @param rt $router The router instance - */ - public function registerApiRoutes(rt $router): void - { - try { - - $routersDir = APP_ROUTES_DIR; - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($routersDir)); - $phpFiles = new \RegexIterator($iterator, '/\.php$/'); - foreach ($phpFiles as $phpFile) { - try { - self::init(); - include $phpFile->getPathname(); - } catch (\Exception $e) { - self::init(); - self::InternalServerError($e->getMessage(), null); - } - } - - $router->add('/(.*)', function (): void { - self::init(); - self::NotFound('The api route does not exist!', null); - }); - } catch (\Exception $e) { - self::init(); - self::InternalServerError($e->getMessage(), null); - } - } - - /** - * Load the environment variables. - */ - public function loadEnv(): void - { - try { - if (file_exists(__DIR__ . '/../storage/.env')) { - $dotenv = \Dotenv\Dotenv::createImmutable(__DIR__ . '/../storage/'); - $dotenv->load(); - - } else { - echo 'No .env file found'; - exit; - } - } catch (\Exception $e) { - echo $e->getMessage(); - exit; - } - } - - /** - * Update the value of an environment variable. - * - * @param string $key The key of the environment variable - * @param string $value The value of the environment variable - * @param bool $encode If the value should be encoded - * - * @return bool If the value was updated - */ - public function updateEnvValue(string $key, string $value, bool $encode): bool - { - $envFile = __DIR__ . '/../storage/.env'; // Path to your .env file - if (!file_exists($envFile)) { - return false; // Return false if .env file doesn't exist - } - - // Read the .env file into an array of lines - $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - - $updated = false; - foreach ($lines as &$line) { - // Skip comments and lines that don't contain '=' - if (strpos(trim($line), '#') === 0 || strpos($line, '=') === false) { - continue; - } - - // Split the line into key and value - [$envKey, $envValue] = explode('=', $line, 2); - - // Trim whitespace from the key - if (trim($envKey) === $key) { - // Update the value - $line = "$key=\"$value\""; - $updated = true; - } - } - - // If the key doesn't exist, add it - if (!$updated) { - $lines[] = "$key=$value"; - } - - // Write the updated lines back to the .env file - return file_put_contents($envFile, implode(PHP_EOL, $lines)) !== false; - } - - /** - * Get the config factory. - */ - public function getConfig(): ConfigFactory - { - if (isset(self::$instance->db)) { - return new ConfigFactory(self::$instance->db->getPdo()); - } - throw new \Exception('Database connection is not initialized.'); - } - - /** - * Get the logger factory. - */ - public function getLogger(): LoggerFactory - { - return new LoggerFactory(__DIR__ . '/../storage/logs/mythicalclient.log'); - } - - /** - * Get the instance of the App class. - */ - public static function getInstance(bool $softBoot): App - { - if (!isset(self::$instance)) { - self::$instance = new self($softBoot); - } - - return self::$instance; - } - - /** - * Encrypt the data. - * - * @param string $data The data to encrypt - */ - public function encrypt(string $data): string - { - return XChaCha20::encrypt($data, $_ENV['DATABASE_ENCRYPTION_KEY'], true); - } - - /** - * Decrypt the data. - * - * @param string $data The data to decrypt - * - * @return void - */ - public function decrypt(string $data): string - { - return XChaCha20::decrypt($data, $_ENV['DATABASE_ENCRYPTION_KEY'], true); - } - - /** - * Generate a random code. - */ - public function generateCode(): string - { - $code = base64_encode(random_bytes(64)); - $code = str_replace('=', '', $code); - $code = str_replace('+', '', $code); - $code = str_replace('/', '', $code); - - return $code; - } - - /** - * Generate a random pin. - */ - public function generatePin(): int - { - return random_int(100000, 999999); - } -} diff --git a/backend/app/Cache/Cache.php b/backend/app/Cache/Cache.php deleted file mode 100755 index 3bab82e1..00000000 --- a/backend/app/Cache/Cache.php +++ /dev/null @@ -1,146 +0,0 @@ - time() + ($minutes * 60), - 'value' => $value, - ]; - file_put_contents($filename, serialize($data)); - } - - /** - * Retrieves a value from the cache by its key. - * - * @param string $key the cache key for the stored data - * - * @return mixed|null returns the stored data or null if not found or expired - */ - public static function get($key) - { - $filename = self::$cacheDir . '/' . md5($key); - if (!file_exists($filename)) { - return null; - } - $data = unserialize(file_get_contents($filename)); - if (time() > $data['expires']) { - unlink($filename); - - return null; - } - - return $data['value']; - } - - /** - * Removes a cached entry by its key. - * - * @param string $key the cache key to remove - * - * @return void - */ - public static function forget($key) - { - $filename = self::$cacheDir . '/' . md5($key); - if (file_exists($filename)) { - unlink($filename); - } - } - - /** - * Clears all entries in the cache directory. - * - * @return void - */ - public static function clear() - { - $files = glob(self::$cacheDir . '/*'); - foreach ($files as $file) { - if (is_file($file)) { - unlink($file); - } - } - } - - /** - * Checks if a valid cached entry exists for the specified key. - * - * @param string $key the cache key to check - * - * @return bool true if a valid cached entry exists, otherwise false - */ - public static function exists($key) - { - $filename = self::$cacheDir . '/' . md5($key); - if (!is_file($filename)) { - return false; - } - $data = @unserialize(file_get_contents($filename)); - if (!is_array($data) || !isset($data['expires'])) { - return false; - } - - return time() <= $data['expires']; - } - - /** - * Stores JSON data in the cache with a specified expiration time. - * - * @param string $key the cache key used to reference the JSON data - * @param mixed $json the JSON data to be cached - * @param int $minutes number of minutes before the data expires - * - * @return void - */ - public static function putJson($key, $json, $minutes = 60) - { - self::put($key, $json, $minutes); - } - - /** - * Retrieves a previously stored JSON data by its key. - * - * @param string $key the cache key for the JSON data - * - * @return mixed|null returns the JSON data or null if not found or expired - */ - public static function getJson($key) - { - return self::get($key); - } -} diff --git a/backend/app/Chat/Announcements/Announcements.php b/backend/app/Chat/Announcements/Announcements.php deleted file mode 100755 index ba0073f8..00000000 --- a/backend/app/Chat/Announcements/Announcements.php +++ /dev/null @@ -1,162 +0,0 @@ -prepare($sql); - $stmt->bindParam(':title', $title); - $stmt->bindParam(':shortDescription', $shortDescription); - $stmt->bindParam(':description', $description); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to create announcement: ' . $e->getMessage()); - } - } - - /** - * Update an existing announcement. - */ - public static function update(int $id, string $title, string $shortDescription, string $description): void - { - try { - $con = self::getPdoConnection(); - $sql = 'UPDATE ' . self::TABLE_NAME . ' SET title = :title, shortDescription = :shortDescription, description = :description WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->bindParam(':title', $title); - $stmt->bindParam(':shortDescription', $shortDescription); - $stmt->bindParam(':description', $description); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to update announcement: ' . $e->getMessage()); - } - } - - /** - * Delete an announcement. - */ - public static function delete(int $id): void - { - try { - $con = self::getPdoConnection(); - $sql = 'DELETE FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to delete announcement: ' . $e->getMessage()); - } - } - - /** - * Get an announcement by ID. - */ - public static function get(int $id) - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetch(); - } catch (\Exception $e) { - self::db_Error('Failed to get announcement: ' . $e->getMessage()); - - return null; - } - } - - /** - * Get all announcements. - */ - public static function getAll(): array - { - try { - $announcements = Announcements::getAllSortedBy('date'); - - if (empty($announcements)) { - return []; - } - - for ($i = 0; $i < count($announcements); ++$i) { - $announcements[$i]['tags'] = AnnouncementsTags::getAll($announcements[$i]['id']); - $announcements[$i]['assets'] = AnnouncementsAssets::getAll($announcements[$i]['id']); - } - - return $announcements; - - } catch (\Exception $e) { - self::db_Error('Failed to get all announcements: ' . $e->getMessage()); - - return []; - } - } - - /** - * Get all announcements sorted by a specific column. - */ - public static function getAllSortedBy(string $column, string $order = 'DESC'): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' ORDER BY ' . $column . ' ' . $order; - $stmt = $con->query($sql); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error("Failed to get all announcements sorted by $column: " . $e->getMessage()); - - return []; - } - } - - /** - * Check if an announcement exists. - * - * @param int $id The id of the announcement - * - * @return bool True if the announcement exists, false otherwise - */ - public static function exists(int $id): bool - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT COUNT(*) FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchColumn() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if announcement exists: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Chat/Announcements/AnnouncementsAssets.php b/backend/app/Chat/Announcements/AnnouncementsAssets.php deleted file mode 100755 index 95acb5ef..00000000 --- a/backend/app/Chat/Announcements/AnnouncementsAssets.php +++ /dev/null @@ -1,98 +0,0 @@ -prepare($sql); - $stmt->bindParam(':announcementId', $announcementId); - $stmt->bindParam(':images', $images); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to create announcement asset: ' . $e->getMessage()); - } - } - - /** - * Delete an announcement asset. - */ - public static function delete(int $id): void - { - try { - $con = self::getPdoConnection(); - $sql = 'DELETE FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to delete announcement asset: ' . $e->getMessage()); - } - } - - /** - * Get all announcement assets. - */ - public static function getAll(int $id): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE announcements = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all announcement assets: ' . $e->getMessage()); - - return []; - } - } - - /** - * Check if an announcement asset exists. - * - * @param int $id The id of the announcement asset - * - * @return bool True if the announcement asset exists, false otherwise - */ - public static function exists(int $id): bool - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT COUNT(*) FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchColumn() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if announcement asset exists: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Chat/Announcements/AnnouncementsTags.php b/backend/app/Chat/Announcements/AnnouncementsTags.php deleted file mode 100755 index 8c13f290..00000000 --- a/backend/app/Chat/Announcements/AnnouncementsTags.php +++ /dev/null @@ -1,98 +0,0 @@ -prepare($sql); - $stmt->bindParam(':announcementId', $announcementId); - $stmt->bindParam(':tag', $tag); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to create announcement tag: ' . $e->getMessage()); - } - } - - /** - * Delete an announcement tag. - */ - public static function delete(int $id): void - { - try { - $con = self::getPdoConnection(); - $sql = 'DELETE FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to delete announcement tag: ' . $e->getMessage()); - } - } - - /** - * Get all announcement tags. - */ - public static function getAll(int $id): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE announcements = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all announcement tags: ' . $e->getMessage()); - - return []; - } - } - - /** - * Check if an announcement tag exists. - * - * @param int $id The id of the announcement tag - * - * @return bool True if the announcement tag exists, false otherwise - */ - public static function exists(int $id): bool - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT COUNT(*) FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchColumn() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if announcement tag exists: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Chat/Database.php b/backend/app/Chat/Database.php deleted file mode 100755 index f4e5a809..00000000 --- a/backend/app/Chat/Database.php +++ /dev/null @@ -1,255 +0,0 @@ -pdo = new \PDO($dsn, $username, $password); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - } catch (\PDOException $e) { - throw new \Exception('Connection failed: ' . $e->getMessage()); - } - } - - public function getPdo(): \PDO - { - return $this->pdo; - } - - /** - * Get the PDO connection. - * - * @return \PDO the PDO connection - */ - public static function getPdoConnection(): \PDO - { - /** - * Load the environment variables. - */ - \MythicalClient\App::getInstance(true)->loadEnv(); - $con = new self($_ENV['DATABASE_HOST'], $_ENV['DATABASE_DATABASE'], $_ENV['DATABASE_USER'], $_ENV['DATABASE_PASSWORD']); - - return $con->getPdo(); - } - - /** - * Get the table row count. - * - * @param string $table the table name - */ - public static function getTableRowCount(string $table): int - { - try { - $query = self::getPdoConnection()->query('SELECT COUNT(*) FROM ' . $table); - - return (int) $query->fetchColumn(); - } catch (\Exception $e) { - self::db_Error('Failed to get table row count: ' . $e->getMessage()); - - return 0; - } - } - - /** - * Check if a table exists. - * - * @param string $table the table name - * - * @return bool true if the table exists, false otherwise - */ - public static function tableExists(string $table): bool - { - try { - $query = self::getPdoConnection()->query("SHOW TABLES LIKE '$table'"); - - return $query->rowCount() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if table exists: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get all tables in the database. - */ - public static function getTables(): array - { - try { - $query = self::getPdoConnection()->query('SHOW TABLES'); - - return $query->fetchAll(\PDO::FETCH_COLUMN); - } catch (\Exception $e) { - self::db_Error('Failed to get tables: ' . $e->getMessage()); - - return []; - } - } - - /** - * Marks a record as deleted in the specified table by setting the 'deleted' column to 'true'. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to mark as deleted - */ - public static function markRecordAsDeleted(string $table, int $row): void - { - try { - $query = self::getPdoConnection()->query('UPDATE ' . $table . " SET deleted = 'true' WHERE id = " . $row); - $query->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to mark record as deleted: ' . $e->getMessage()); - - return; - } - } - - /** - * Retrieves all records marked as deleted from the specified table. - * - * @param string $table the name of the table to query - * - * @return array array of deleted records in associative array format - */ - public static function getDeletedRecords(string $table): array - { - try { - $query = self::getPdoConnection()->query('SELECT * FROM ' . $table . " WHERE deleted = 'true'"); - - return $query->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get deleted records: ' . $e->getMessage()); - - return []; - } - } - - /** - * Restores a previously deleted record by setting the 'deleted' column to 'false'. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to restore - */ - public static function restoreRecord(string $table, int $row): void - { - try { - $query = self::getPdoConnection()->query('UPDATE ' . $table . " SET deleted = 'false' WHERE id = " . $row); - $query->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to restore record: ' . $e->getMessage()); - - return; - } - } - - /** - * Permanently deletes a record from the specified table. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to delete - */ - public static function deleteRecord(string $table, int $row): void - { - try { - $query = self::getPdoConnection()->query('DELETE FROM ' . $table . ' WHERE id = ' . $row); - $query->execute(); - - } catch (\Exception $e) { - self::db_Error('Failed to delete record: ' . $e->getMessage()); - - return; - } - } - - /** - * Locks a record in the specified table by setting the 'locked' column to 'true'. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to lock - */ - public static function lockRecord(string $table, int $row): void - { - try { - $query = self::getPdoConnection()->query('UPDATE ' . $table . " SET locked = 'true' WHERE id = " . $row); - $query->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to lock record: ' . $e->getMessage()); - - return; - } - } - - /** - * Unlocks a record in the specified table by setting the 'locked' column to 'false'. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to unlock - */ - public static function unlockRecord(string $table, int $row): void - { - try { - $query = self::getPdoConnection()->query('UPDATE ' . $table . " SET locked = 'false' WHERE id = " . $row); - $query->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to unlock record: ' . $e->getMessage()); - - return; - } - } - - /** - * Checks if a specific record is locked. - * - * @param string $table the name of the table containing the record - * @param int $row the ID of the record to check - * - * @return bool returns true if the record is locked, false otherwise - */ - public static function isLocked(string $table, int $row): bool - { - try { - $query = self::getPdoConnection()->query('SELECT locked FROM ' . $table . ' WHERE id = ' . $row); - - return $query->fetch(\PDO::FETCH_ASSOC)['locked'] == 'true'; - } catch (\Exception $e) { - self::db_Error('Failed to check for lock: ' . $e->getMessage()); - - return false; - } - } - - public static function db_Error(string $message): void - { - $app = \MythicalClient\App::getInstance(true); - $app->getLogger()->error($message, true); - } -} diff --git a/backend/app/Chat/Tickets/Departments.php b/backend/app/Chat/Tickets/Departments.php deleted file mode 100755 index 370f3331..00000000 --- a/backend/app/Chat/Tickets/Departments.php +++ /dev/null @@ -1,146 +0,0 @@ -prepare($sql); - $stmt->bindParam(':name', $name); - $stmt->bindParam(':description', $description); - $stmt->bindParam(':open', $open); - $stmt->bindParam(':close', $close); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to create department: ' . $e->getMessage()); - } - } - - public static function update( - int $id, - string $name, - string $description, - string $open, - string $close, - ): void { - try { - if (!self::exists($id)) { - App::getInstance(true)->getLogger()->warning('Department does not exist but tried to update it.', true); - - return; - } - $con = self::getPdoConnection(); - $sql = 'UPDATE ' . self::TABLE_NAME . ' SET name = :name, description = :description, time_open = :open, time_close = :close WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->bindParam(':name', $name); - $stmt->bindParam(':description', $description); - $stmt->bindParam(':open', $open); - $stmt->bindParam(':close', $close); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to update department: ' . $e->getMessage()); - } - } - - public static function exists(int $id): bool - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT id FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_INT); - $stmt->execute(); - - return $stmt->rowCount() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if department exists: ' . $e->getMessage()); - - return false; - } - } - - public static function delete(int $id): bool - { - try { - if (!self::exists($id)) { - App::getInstance(true)->getLogger()->warning('Department does not exist but tried to delete it.', true); - - return false; - } - $con = self::getPdoConnection(); - $sql = 'DELETE FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->rowCount() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to delete department: ' . $e->getMessage()); - - return false; - } - } - - public static function getAll(): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME; - $stmt = $con->prepare($sql); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all departments: ' . $e->getMessage()); - - return []; - } - } - - public static function get(int $id): array - { - try { - if (!self::exists($id)) { - App::getInstance(true)->getLogger()->warning('Department does not exist but tried to get it: ' . $id . '.', true); - - return []; - } - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetch(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get department: ' . $e->getMessage()); - - return []; - } - } -} diff --git a/backend/app/Chat/Tickets/Tickets.php b/backend/app/Chat/Tickets/Tickets.php deleted file mode 100755 index 98070525..00000000 --- a/backend/app/Chat/Tickets/Tickets.php +++ /dev/null @@ -1,155 +0,0 @@ -prepare($sql); - $stmt->bindParam('uuid', $uuid, \PDO::PARAM_STR); - $stmt->bindParam('department', $department, \PDO::PARAM_INT); - $stmt->bindParam('priority', $priority, \PDO::PARAM_STR); - if ($service !== null) { - $stmt->bindParam('service', $service, \PDO::PARAM_INT); - } - $stmt->bindParam('title', $title, \PDO::PARAM_STR); - $stmt->bindParam('description', $description, \PDO::PARAM_STR); - $stmt->execute(); - - return (int) $con->lastInsertId(); - } catch (\Exception $e) { - self::db_Error('Failed to create ticket: ' . $e->getMessage()); - - return 0; - } - } - - public static function delete(int $id): void - { - try { - $con = self::getPdoConnection(); - $sql = 'DELETE FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam('id', $id, \PDO::PARAM_INT); - $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to delete ticket: ' . $e->getMessage()); - } - - } - - public static function exists(int $id): bool - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT COUNT(*) FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam('id', $id, \PDO::PARAM_INT); - $stmt->execute(); - - return (int) $stmt->fetchColumn() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if ticket exists: ' . $e->getMessage()); - - return false; - } - } - - public static function getAllTickets(int $limit = 150): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' ORDER BY id DESC LIMIT :limit'; - $stmt = $con->prepare($sql); - $stmt->bindParam('limit', $limit, \PDO::PARAM_INT); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all tickets: ' . $e->getMessage()); - - return []; - } - } - - public static function getAllTicketsByUser(string $uuid, int $limit = 150): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE user = :uuid ORDER BY id DESC LIMIT ' . $limit; - $stmt = $con->prepare($sql); - $stmt->bindParam('uuid', $uuid, \PDO::PARAM_STR); - $stmt->execute(); - - $tickets = $stmt->fetchAll(\PDO::FETCH_ASSOC); - - foreach ($tickets as $key => $ticket) { - $tickets[$key]['department_id'] = $ticket['department']; - $tickets[$key]['department'] = Departments::get((int) $ticket['department']); - - if (empty($tickets[$key]['department'])) { - $tickets[$key]['department'] = [ - 'id' => 0, - 'name' => 'Deleted Department', - 'description' => 'This department has been deleted.', - 'time_open' => '08:30', - 'time_close' => '17:30', - 'enabled' => 'true', - 'deleted' => 'false', - 'locked' => 'false', - 'date' => '2024-12-25 22:25:09', - ]; - } - } - - return $tickets; - } catch (\Exception $e) { - self::db_Error('Failed to get all tickets by user: ' . $e->getMessage()); - - return []; - } - } - - public static function getTicket(int $id): array - { - try { - $con = self::getPdoConnection(); - $sql = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE id = :id'; - $stmt = $con->prepare($sql); - $stmt->bindParam('id', $id, \PDO::PARAM_INT); - $stmt->execute(); - - return $stmt->fetch(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get ticket: ' . $e->getMessage()); - - return []; - } - } -} diff --git a/backend/app/Chat/User/Billing.php b/backend/app/Chat/User/Billing.php deleted file mode 100755 index d72acd64..00000000 --- a/backend/app/Chat/User/Billing.php +++ /dev/null @@ -1,126 +0,0 @@ -prepare('UPDATE ' . self::TABLE_NAME . ' SET company_name = :company_name, vat_number = :vat_number, address1 = :address1, address2 = :address2, city = :city, country = :country, state = :state, postcode = :postcode WHERE user = :uuid'); - } else { - $stmt = $conn->prepare('INSERT INTO ' . self::TABLE_NAME . ' (user, company_name, vat_number, address1, address2, city, country, state, postcode) VALUES (:uuid, :company_name, :vat_number, :address1, :address2, :city, :country, :state, :postcode)'); - } - $company_name = $company_name !== null ? App::getInstance(true)->encrypt($company_name) : null; - $vat_number = $vat_number !== null ? App::getInstance(true)->encrypt($vat_number) : null; - $address1 = $address1 !== null ? App::getInstance(true)->encrypt($address1) : null; - $address2 = $address2 !== null ? App::getInstance(true)->encrypt($address2) : null; - $city = $city !== null ? App::getInstance(true)->encrypt($city) : null; - $country = $country !== null ? App::getInstance(true)->encrypt($country) : null; - $state = $state !== null ? App::getInstance(true)->encrypt($state) : null; - $postcode = $postcode !== null ? App::getInstance(true)->encrypt($postcode) : null; - - $stmt->execute([ - 'uuid' => $uuid, - 'company_name' => $company_name, - 'vat_number' => $vat_number, - 'address1' => $address1, - 'address2' => $address2, - 'city' => $city, - 'country' => $country, - 'state' => $state, - 'postcode' => $postcode, - ]); - } catch (\Exception $e) { - self::db_Error('Failed to update billing: ' . $e->getMessage()); - } - } - - public static function getBillingData(string $uuid): array - { - try { - if (!self::doesHaveBilling($uuid)) { - return [ - 'company_name' => 'N/A', - 'vat_number' => 'N/A', - 'address1' => 'N/A', - 'address2' => 'N/A', - 'city' => 'N/A', - 'country' => 'N/A', - 'state' => 'N/A', - 'postcode' => 'N/A', - ]; - } - $conn = self::getPdoConnection(); - $stmt = $conn->prepare('SELECT * FROM ' . self::TABLE_NAME . ' WHERE user = :uuid'); - $stmt->execute([ - 'uuid' => $uuid, - ]); - $result = $stmt->fetch(); - if ($result !== false) { - return [ - 'company_name' => $result['company_name'] !== null ? App::getInstance(true)->decrypt($result['company_name']) : 'N/A', - 'vat_number' => $result['vat_number'] !== null ? App::getInstance(true)->decrypt($result['vat_number']) : 'N/A', - 'address1' => $result['address1'] !== null ? App::getInstance(true)->decrypt($result['address1']) : 'N/A', - 'address2' => $result['address2'] !== null ? App::getInstance(true)->decrypt($result['address2']) : 'N/A', - 'city' => $result['city'] !== null ? App::getInstance(true)->decrypt($result['city']) : 'N/A', - 'country' => $result['country'] !== null ? App::getInstance(true)->decrypt($result['country']) : 'N/A', - 'state' => $result['state'] !== null ? App::getInstance(true)->decrypt($result['state']) : 'N/A', - 'postcode' => $result['postcode'] !== null ? App::getInstance(true)->decrypt($result['postcode']) : 'N/A', - ]; - } - - return []; - } catch (\Exception $e) { - self::db_Error('Failed to get billing data: ' . $e->getMessage()); - - return []; - } - - } - - private static function doesHaveBilling(string $uuid): bool - { - try { - $conn = self::getPdoConnection(); - $stmt = $conn->prepare('SELECT * FROM ' . self::TABLE_NAME . ' WHERE user = :uuid'); - $stmt->execute([ - 'uuid' => $uuid, - ]); - $result = $stmt->fetch(); - - return $result !== false; - } catch (\Exception $e) { - self::db_Error('Failed to check for existing billing details: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Chat/User/Can.php b/backend/app/Chat/User/Can.php deleted file mode 100755 index bbe57e37..00000000 --- a/backend/app/Chat/User/Can.php +++ /dev/null @@ -1,29 +0,0 @@ -getConfig()->getSetting(\MythicalClient\Config\ConfigInterface::SMTP_FROM, 'system@mythical.systems'); - $stmt = $dbConn->prepare('INSERT INTO ' . self::getTableName() . ' (subject, body, `from`, `user`) VALUES (:subject, :body, :from, :user)'); - $stmt->bindParam(':subject', $subject); - $stmt->bindParam(':body', $body); - $stmt->bindParam(':from', $from); - $stmt->bindParam(':user', $uuid); - - return $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to add mail: ' . $e->getMessage()); - - return false; - } - - } - - /** - * Delete a mail. - * - * @param string $id Mail ID - * @param string $uuid User UUID - */ - public static function delete(string $id, string $uuid): bool - { - try { - $dbConn = Database::getPdoConnection(); - $stmt = $dbConn->prepare('DELETE FROM ' . self::getTableName() . ' WHERE id = :id AND `user` = :user'); - $stmt->bindParam(':id', $id); - $stmt->bindParam(':user', $uuid); - - return $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to delete mail: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get all mails for a user. - * - * @param string $uuid User UUID - */ - public static function getAll(string $uuid): array - { - try { - $dbConn = Database::getPdoConnection(); - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTableName() . ' WHERE `user` = :user ORDER BY id DESC LIMIT 50'); - $stmt->bindParam(':user', $uuid); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all mails: ' . $e->getMessage()); - - return []; - } - } - - /** - * Get a mail. - * - * @param string $id Mail ID - * - * @return array Mail data - */ - public static function get(string $id): array - { - try { - $dbConn = Database::getPdoConnection(); - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTableName() . ' WHERE id = :id'); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetch(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get mail: ' . $e->getMessage()); - - return []; - } - } - - /** - * Check if a mail exists. - * - * @param string $id Mail ID - * - * @return bool Does mail exist - */ - public static function exists(string $id): bool - { - try { - $dbConn = Database::getPdoConnection(); - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTableName() . ' WHERE id = :id'); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->rowCount() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if mail exists: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get all mails for a user. - * - * @param string $uuid User UUID - * @param string $id Mail ID - * - * @return bool Does user own email - */ - public static function doesUserOwnEmail(string $uuid, string $id): bool - { - try { - $dbConn = Database::getPdoConnection(); - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTableName() . ' WHERE id = :id AND `user` = :user'); - $stmt->bindParam(':id', $id); - $stmt->bindParam(':user', $uuid); - $stmt->execute(); - - return $stmt->rowCount() > 0; - } catch (\Exception $e) { - self::db_Error('Failed to check if user owns email: ' . $e->getMessage()); - - return false; - } - } - - public static function getTableName(): string - { - return 'mythicalclient_users_mails'; - } -} diff --git a/backend/app/Chat/User/Roles.php b/backend/app/Chat/User/Roles.php deleted file mode 100755 index 60af67cd..00000000 --- a/backend/app/Chat/User/Roles.php +++ /dev/null @@ -1,146 +0,0 @@ -prepare('SELECT * FROM ' . self::TABLE_NAME); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get list of roles: ' . $e->getMessage()); - - return []; - } - } - - /** - * Get the role info. - * - * @param \RolesInterface|string $real_name The role name - * @param RolesColumns|string $info The column name - * - * @throws \InvalidArgumentException If the column name is invalid - * - * @return string|null The value of the column - */ - public static function getInfo(\RolesInterface|string $real_name, RolesColumns|string $info): ?string - { - try { - if (!in_array($info, RolesColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT ' . $info . ' FROM ' . self::TABLE_NAME . ' WHERE real_name = :real_name'); - $stmt->bindParam(':real_name', $real_name); - $stmt->execute(); - - return $stmt->fetchColumn(); - } catch (\Exception $e) { - self::db_Error('Failed to grab the info about the role: ' . $e->getMessage()); - - return null; - } - } - - /** - * Update the role info. - * - * @param \RolesInterface|string $real_name The role name - * @param RolesColumns|string $info The column name - * @param string $value The new value - * - * @throws \InvalidArgumentException If the column name is invalid - */ - public static function updateInfo(\RolesInterface|string $real_name, RolesColumns|string $info, string $value): bool - { - try { - if (!in_array($info, RolesColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - $con = self::getPdoConnection(); - $stmt = $con->prepare('UPDATE ' . self::TABLE_NAME . ' SET ' . $info . ' = :value WHERE real_name = :real_name'); - $stmt->bindParam(':real_name', $real_name); - $stmt->bindParam(':value', $value); - - return $stmt->execute(); - } catch (\Exception $e) { - self::db_Error('Failed to update the role info: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get the role name. - * - * @param string $uuid The user UUID - * - * @return string|null The role name - */ - public static function getUserRoleName(string $uuid): ?string - { - try { - $con = self::getPdoConnection(); - $id = User::getInfo(User::getTokenFromUUID($uuid), UserColumns::ROLE_ID, false); - $stmt = $con->prepare('SELECT name FROM ' . self::TABLE_NAME . ' WHERE id = :id'); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchColumn(); - } catch (\Exception $e) { - self::db_Error('Failed to get role name: ' . $e->getMessage()); - - return null; - } - } - - /** - * Get the role real name. - * - * @param string $uuid The user UUID - * - * @return string|null The role real name - */ - public static function getUserRealName(string $uuid): ?string - { - try { - $con = self::getPdoConnection(); - $id = User::getInfo(User::getTokenFromUUID($uuid), UserColumns::ROLE_ID, false); - $stmt = $con->prepare('SELECT real_name FROM ' . self::TABLE_NAME . ' WHERE id = :id'); - $stmt->bindParam(':id', $id); - $stmt->execute(); - - return $stmt->fetchColumn(); - } catch (\Exception $e) { - self::db_Error('Failed to get real role name: ' . $e->getMessage()); - - return null; - } - } -} diff --git a/backend/app/Chat/User/Session.php b/backend/app/Chat/User/Session.php deleted file mode 100755 index b2afb4fe..00000000 --- a/backend/app/Chat/User/Session.php +++ /dev/null @@ -1,99 +0,0 @@ -app = $app; - $this->SESSION_KEY = $_COOKIE['user_token']; - $this->updateLastSeen(); - if ($this->getInfo(UserColumns::TWO_FA_BLOCKED, false) == 'true') { - $app->Unauthorized('Please verify 2fa to access this endpoint.', ['error_code' => 'TW0_FA_BLOCKED']); - } - } catch (\Exception) { - $app->Unauthorized('Bad Request', ['error_code' => 'INVALID_ACCOUNT_TOKEN']); - } - } else { - $app->Unauthorized('Login info provided are invalid!', ['error_code' => 'INVALID_ACCOUNT_TOKEN']); - } - } else { - $app->Unauthorized('Please login to access this endpoint.', ['error_code' => 'MISSING_ACCOUNT_TOKEN']); - } - } - - public function __destruct() - { - unset($this->app); - } - - public function getInfo(string|UserColumns $info, bool $encrypted): string - { - if (!in_array($info, UserColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - - return User::getInfo($this->SESSION_KEY, $info, $encrypted); - } - - public function setInfo(string|UserColumns $info, string $value, bool $encrypted): void - { - if (!in_array($info, UserColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - User::updateInfo($this->SESSION_KEY, $info, $value, $encrypted); - } - - public function updateLastSeen(): void - { - try { - $con = self::getPdoConnection(); - $ip = CloudFlareRealIP::getRealIP(); - $con->exec('UPDATE ' . User::TABLE_NAME . ' SET last_seen = NOW() WHERE token = "' . $this->SESSION_KEY . '";'); - $con->exec('UPDATE ' . User::TABLE_NAME . ' SET last_ip = "' . $ip . '" WHERE token = "' . $this->SESSION_KEY . '";'); - } catch (\Exception $e) { - $this->app->getLogger()->error('Failed to update last seen: ' . $e->getMessage()); - } - } - - /** - * Check if the user has access to the admin panel. - * - * @return bool true if the user has access to the admin panel, otherwise false - */ - public function canAccessAdmin(): bool - { - if ($this->getInfo(UserColumns::ROLE_ID, false) == '1' || $this->getInfo(UserColumns::ROLE_ID, false) == '2') { - return false; - } - - return true; - - } -} diff --git a/backend/app/Chat/User/User.php b/backend/app/Chat/User/User.php deleted file mode 100755 index a4cb83f8..00000000 --- a/backend/app/Chat/User/User.php +++ /dev/null @@ -1,428 +0,0 @@ -encrypt($first_name); - $last_name = App::getInstance(true)->encrypt($last_name); - - /** - * The UUID generation and logic. - */ - $uuidMngr = new \MythicalSystems\User\UUIDManager(); - $uuid = $uuidMngr->generateUUID(); - $token = App::getInstance(true)->encrypt(date('Y-m-d H:i:s') . $uuid . random_bytes(16) . base64_encode($email)); - - /** - * GRAvatar Logic. - */ - try { - $gravatar = new Gravatar(['s' => 9001], true); - $avatar = $gravatar->avatar($email); - } catch (\Exception) { - $avatar = 'https://www.gravatar.com/avatar'; - } - - /** - * Get the PDO connection. - */ - $pdoConnection = self::getPdoConnection(); - - /** - * Prepare the statement. - */ - $stmt = $pdoConnection->prepare(' - INSERT INTO ' . self::TABLE_NAME . ' - (username, first_name, last_name, email, password, avatar, background, uuid, token, role, first_ip, last_ip, banned, verified, support_pin) - VALUES - (:username, :first_name, :last_name, :email, :password, :avatar, :background, :uuid, :token, :role, :first_ip, :last_ip, :banned, :verified, :support_pin) - '); - $password = App::getInstance(true)->encrypt($password); - - $stmt->execute([ - ':username' => $username, - ':first_name' => $first_name, - ':last_name' => $last_name, - ':email' => $email, - ':password' => $password, - ':avatar' => $avatar, - ':background' => 'https://cdn.mythicalsystems.xyz/background.gif', - ':uuid' => $uuid, - ':token' => $token, - ':role' => 1, - ':first_ip' => $ip, - ':last_ip' => $ip, - ':banned' => 'NO', - ':verified' => 'false', - ':support_pin' => App::getInstance(true)->generatePin(), - ]); - /** - * Check if the mail is enabled. - * - * If it is, the user is not verified. - * - * If it is not, the user is verified. - */ - if (Mail::isEnabled()) { - try { - $verify_token = App::getInstance(true)->generateCode(); - Verification::add($verify_token, $uuid, EmailVerificationColumns::$type_verify); - Verify::sendMail($uuid, $verify_token); - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to send email: ' . $e->getMessage()); - self::updateInfo($token, UserColumns::VERIFIED, 'false', false); - } - } else { - self::updateInfo($token, UserColumns::VERIFIED, 'true', false); - } - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to register user: ' . $e->getMessage()); - throw new \Exception('Failed to register user: ' . $e->getMessage()); - } - } - - /** - * Get the list of users. - * - * @return array The list of users - */ - public static function getList(): array - { - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT * FROM ' . self::TABLE_NAME); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } - - /** - * Forgot password logic. - * - * @param string $email The email of the user - * - * @return bool If the email was sent - */ - public static function forgotPassword(string $email): bool - { - try { - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT token, uuid FROM ' . self::TABLE_NAME . ' WHERE email = :email'); - $stmt->bindParam(':email', $email); - $stmt->execute(); - $user = $stmt->fetch(\PDO::FETCH_ASSOC); - - if ($user) { - if (Mail::isEnabled()) { - try { - $verify_token = $verify_token = App::getInstance(true)->generateCode(); - Verification::add($verify_token, $user['uuid'], EmailVerificationColumns::$type_password); - ResetPassword::sendMail($user['uuid'], $verify_token); - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to send email: ' . $e->getMessage()); - } - - return true; - } - - return false; - } - - return false; - } catch (\Exception $e) { - return false; - } - } - - /** - * Login the user. - * - * @param string $login The login of the user - * @param string $password The password of the user - * - * @return string If the login was successful - */ - public static function login(string $login, string $password): string - { - try { - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT password, token, uuid FROM ' . self::TABLE_NAME . ' WHERE username = :login OR email = :login'); - $stmt->bindParam(':login', $login); - $stmt->execute(); - $user = $stmt->fetch(\PDO::FETCH_ASSOC); - if ($user) { - if (App::getInstance(true)->decrypt($user['password']) == $password) { - self::logout(); - if (!$user['token'] == '') { - setcookie('user_token', $user['token'], time() + 3600, '/'); - } else { - App::getInstance(true)->getLogger()->error('Failed to login user: Token is empty'); - - return 'false'; - } - if (Mail::isEnabled()) { - try { - NewLogin::sendMail($user['uuid']); - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to send email: ' . $e->getMessage()); - } - } - UserActivities::add($user['uuid'], UserActivitiesTypes::$login, CloudFlare::getRealUserIP()); - - return $user['token']; - } - - return 'false'; - } - - return 'false'; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to login user: ' . $e->getMessage()); - - return 'false'; - } - } - - /** - * Logout the user. - */ - public static function logout(): void - { - setcookie('user_token', '', time() - 460800 * 460800 * 460800, '/'); - } - - /** - * Does the user info exist? - * - * @param UserColumns $info - */ - public static function exists(UserColumns|string $info, string $value): bool - { - try { - if (!in_array($info, UserColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT * FROM ' . self::TABLE_NAME . ' WHERE ' . $info . ' = :value'); - $stmt->bindParam(':value', $value); - $stmt->execute(); - - return (bool) $stmt->fetchColumn(); - } catch (\Exception $e) { - Database::db_Error('Failed to check if user exists: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get the user info. - * - * @param UserColumns|string $info The column name - * - * @throws \InvalidArgumentException If the column name is invalid - * - * @return string|null The value of the column - */ - public static function getInfo(string $token, UserColumns|string $info, bool $encrypted): ?string - { - try { - if (!in_array($info, UserColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT ' . $info . ' FROM ' . self::TABLE_NAME . ' WHERE token = :token'); - $stmt->bindParam(':token', $token); - $stmt->execute(); - if ($encrypted) { - return App::getInstance(true)->decrypt($stmt->fetchColumn()); - } - - return $stmt->fetchColumn(); - } catch (\Exception $e) { - Database::db_Error('Failed to grab the info about the user: ' . $e->getMessage()); - - return null; - } - - } - - /** - * Get the user info. - * - * @param string $token The token - * - * @return array The user info - */ - public static function getInfoArray(string $token, array $columns, array $columns_encrypted): array - { - try { - $con = self::getPdoConnection(); - $columns_str = implode(', ', $columns); - $stmt = $con->prepare('SELECT ' . $columns_str . ' FROM ' . self::TABLE_NAME . ' WHERE token = :token'); - $stmt->bindParam(':token', $token); - $stmt->execute(); - - $result = $stmt->fetch(\PDO::FETCH_ASSOC); - - foreach ($columns as $index => $column) { - if (in_array($column, $columns_encrypted)) { - $result[$column] = App::getInstance(true)->decrypt($result[$column]); - } - } - - return $result ? $result : []; - - } catch (\Exception $e) { - Database::db_Error('Failed to get info: ' . $e->getMessage()); - - return []; - } - } - - /** - * Update the user info. - * - * @param UserColumns|string $info The column name - * @param string $value The value to update - * @param bool $encrypted If the value is encrypted - * - * @throws \InvalidArgumentException If the column name is invalid - * - * @return bool If the update was successful - */ - public static function updateInfo(string $token, UserColumns|string $info, string $value, bool $encrypted): bool - { - try { - if (!in_array($info, UserColumns::getColumns())) { - throw new \InvalidArgumentException('Invalid column name: ' . $info); - } - $con = self::getPdoConnection(); - if ($encrypted) { - $value = App::getInstance(true)->encrypt($value); - } - $stmt = $con->prepare('UPDATE ' . self::TABLE_NAME . ' SET ' . $info . ' = :value WHERE token = :token'); - $stmt->bindParam(':value', $value); - $stmt->bindParam(':token', $token); - - return $stmt->execute(); - } catch (\Exception $e) { - Database::db_Error('Failed to update user info: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get the token from the UUID. - * - * @param string $uuid The UUID - * - * @return string The token - */ - public static function getTokenFromUUID(string $uuid): string - { - try { - $con = self::getPdoConnection(); - $stmt = $con->prepare('SELECT token FROM ' . self::TABLE_NAME . ' WHERE uuid = :uuid'); - $stmt->bindParam(':uuid', $uuid); - $stmt->execute(); - - return $stmt->fetchColumn(); - } catch (\Exception $e) { - Database::db_Error('Failed to uuid to token: ' . $e->getMessage()); - - return null; - } - } - - /** - * Process the template. - * - * @param string $template The template - * @param string $uuid The UUID - * - * @return string The processed template - */ - public static function processTemplate(string $template, string $uuid): string - { - try { - - $columns = [ - UserColumns::USERNAME, - UserColumns::EMAIL, - UserColumns::FIRST_NAME, - UserColumns::LAST_NAME, - UserColumns::AVATAR, - UserColumns::BACKGROUND, - UserColumns::ROLE_ID, - UserColumns::FIRST_IP, - UserColumns::LAST_IP, - UserColumns::BANNED, - UserColumns::VERIFIED, - UserColumns::TWO_FA_ENABLED, - UserColumns::DELETED, - UserColumns::LAST_SEEN, - UserColumns::FIRST_SEEN, - ]; - - $columns_encrypted = [ - UserColumns::FIRST_NAME, - UserColumns::LAST_NAME, - ]; - - $userInfo = self::getInfoArray(self::getTokenFromUUID($uuid), $columns, $columns_encrypted); - - foreach ($userInfo as $key => $value) { - $template = str_replace('${' . $key . '}', $value, $template); - } - - return $template; - } catch (\Exception $e) { - Database::db_Error('Failed to process the template: ' . $e->getMessage()); - - return null; - } - } -} diff --git a/backend/app/Chat/User/UserActivities.php b/backend/app/Chat/User/UserActivities.php deleted file mode 100755 index f6c00054..00000000 --- a/backend/app/Chat/User/UserActivities.php +++ /dev/null @@ -1,100 +0,0 @@ -prepare('INSERT INTO ' . self::getTable() . ' (user, action, ip_address) VALUES (:user, :action, :ip_address)'); - - return $stmt->execute([ - ':user' => $uuid, - ':action' => $type, - ':ip_address' => $ipv4, - ]); - } catch (\Exception $e) { - self::db_Error('Failed to add user activity: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get user activities. - * - * @param string $uuid User UUID - */ - public static function get(string $uuid): array - { - try { - $dbConn = Database::getPdoConnection(); - - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTable() . ' WHERE user = :user LIMIT 125'); - $stmt->execute([ - ':user' => $uuid, - ]); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get user activities: ' . $e->getMessage()); - - return []; - } - } - - /** - * Get all user activities. - * - * @param int $limit Limit - */ - public static function getAll(int $limit = 50): array - { - try { - $dbConn = Database::getPdoConnection(); - - $stmt = $dbConn->prepare('SELECT * FROM ' . self::getTable() . ' LIMIT ' . $limit); - $stmt->execute(); - - return $stmt->fetchAll(\PDO::FETCH_ASSOC); - } catch (\Exception $e) { - self::db_Error('Failed to get all user activities: ' . $e->getMessage()); - - return []; - } - } - - /** - * Get table name. - * - * @return string Table name - */ - public static function getTable(): string - { - return 'mythicalclient_users_activities'; - } -} diff --git a/backend/app/Chat/User/Verification.php b/backend/app/Chat/User/Verification.php deleted file mode 100755 index 73ca8a46..00000000 --- a/backend/app/Chat/User/Verification.php +++ /dev/null @@ -1,120 +0,0 @@ -prepare('INSERT INTO ' . self::TABLE_NAME . ' (code, user, type) VALUES (:code, :user, :type)'); - $query->execute(['code' => $code, 'user' => $uuid, 'type' => (string) $type]); - } else { - App::getInstance(true)->getLogger()->error("User with UUID {$uuid} does not exist."); - - return; - } - } catch (\Exception $e) { - self::db_Error('Failed to add new email verification: ' . $e->getMessage()); - } - } - - /** - * Verify a code. - * - * @param string $code The code to verify - * @param EmailVerificationColumns|string $type The type of verification [password,verify] - */ - public static function verify(string $code, EmailVerificationColumns|string $type): bool - { - try { - $conn = self::getPdoConnection(); - $query = $conn->prepare('SELECT * FROM ' . self::TABLE_NAME . ' WHERE code = :code AND type = :type'); - $query->execute(['code' => $code, 'type' => $type]); - $result = $query->fetch(); - if (empty($result)) { - return false; - } - - return true; - } catch (\Exception $e) { - self::db_Error('Failed to verify code: ' . $e->getMessage()); - - return false; - } - } - - /** - * Delete a code. - * - * @param string $code The code to delete - */ - public static function delete(string $code): void - { - try { - $conn = self::getPdoConnection(); - $query = $conn->prepare('DELETE FROM ' . self::TABLE_NAME . ' WHERE code = :code'); - $query->execute(['code' => $code]); - - return; - } catch (\Exception $e) { - self::db_Error('Failed to delete code from verify table: ' . $e->getMessage()); - - return; - } - } - - /** - * Get the user's UUID from a code. - * - * @param string $code The code to get the user's UUID from - * - * @return string Get the user uuid - */ - public static function getUserUUID(string $code): string - { - try { - $conn = self::getPdoConnection(); - $query = $conn->prepare('SELECT * FROM ' . self::TABLE_NAME . ' WHERE code = :code'); - $query->execute(['code' => $code]); - $result = $query->fetch(); - if ($result === false) { - return ''; - } - - return $result['user']; - - } catch (\Exception $e) { - self::db_Error('Failed to compute uuid: ' . $e->getMessage()); - - return ''; - } - } -} diff --git a/backend/app/Chat/columns/EmailVerificationColumns.php b/backend/app/Chat/columns/EmailVerificationColumns.php deleted file mode 100755 index baf81633..00000000 --- a/backend/app/Chat/columns/EmailVerificationColumns.php +++ /dev/null @@ -1,32 +0,0 @@ - 'code', - 'user' => 'user', - 'type' => ['password', 'verify'], - ]; - } -} diff --git a/backend/app/Chat/columns/RolesColumns.php b/backend/app/Chat/columns/RolesColumns.php deleted file mode 100755 index fef31015..00000000 --- a/backend/app/Chat/columns/RolesColumns.php +++ /dev/null @@ -1,30 +0,0 @@ - 'name', - 'real_name' => 'real_name', - 'date' => 'date', - ]; - } -} diff --git a/backend/app/Chat/columns/UserColumns.php b/backend/app/Chat/columns/UserColumns.php deleted file mode 100755 index 9a4dba3b..00000000 --- a/backend/app/Chat/columns/UserColumns.php +++ /dev/null @@ -1,66 +0,0 @@ -handleCustomCommands($commandName, $args); - self::$instance = $this; - - $commandName = ucfirst($commandName); - $commandFile = __DIR__ . "/Commands/$commandName.php"; - - if (!file_exists($commandFile)) { - self::send('Command not found.'); - - return; - } - - require_once $commandFile; - - $commandClass = "MythicalClient\\Cli\\Commands\\$commandName"; - - if (!class_exists($commandClass)) { - self::send('Command not found.'); - - return; - } - - $commandClass::execute($args); - } - - /** - * Send a message to the console. - * - * @param string $message the message to send - */ - public function send(string $message): void - { - self::sendOutputWithNewLine($this->prefix . $message); - } - - /** - * Get the instance of the App. - */ - public static function getInstance(): App - { - return self::$instance; - } - - /** - * Custom commands handler. - * - * This method is used to handle custom commands that are not part of the CLI. - * - * The following commands are handled: - * - frontend:build - * - frontend:watch - * - backend:lint - * - * DO NOT REMOVE OR MODIFY THIS METHOD. - * IF YOU DO NOT KNOW WHAT YOU ARE DOING, DO NOT MODIFY THIS METHOD. - */ - private function handleCustomCommands(string $cmdName, array $subCmd): void - { - if ($cmdName == 'frontend:build') { - $process = popen('cd frontend && yarn build 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to build frontend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Frontend built successfully.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start build process.'); - } - - exit; - } elseif ($cmdName == 'frontend:watch') { - $process = popen('cd frontend && yarn dev 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to watch frontend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Frontend is now being watched.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start watch process.'); - } - - exit; - } elseif ($cmdName == 'backend:lint') { - $process = popen('cd backend && export COMPOSER_ALLOW_SUPERUSER=1 && composer run lint 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to lint backend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Backend linted successfully.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start lint process.'); - } - exit; - } elseif ($cmdName == 'backend:watch') { - $process = popen('tail -f backend/storage/logs/mythicalclient.log backend/storage/logs/framework.log', 'r'); - $this->sendOutput('Please wait while we attach to the process...'); - $this->sendOutput(message: "\n"); - sleep(5); - if (is_resource($process)) { - $this->sendOutput('Attached to the process.'); - $this->sendOutput(message: "\n"); - while (!feof($process)) { - $output = fgets($process); - if (strpos($output, '[DEBUG]') !== false) { - $this->sendOutput($this->prefix . "\e[34m" . $output . "\e[0m"); // Blue for DEBUG - } elseif (strpos($output, '[INFO]') !== false) { - $this->sendOutput($this->prefix . "\e[32m" . $output . "\e[0m"); // Green for INFO - } elseif (strpos($output, '[WARNING]') !== false) { - $this->sendOutput($this->prefix . "\e[33m" . $output . "\e[0m"); // Yellow for WARNING - } elseif (strpos($output, '[ERROR]') !== false) { - $this->sendOutput($this->prefix . "\e[31m" . $output . "\e[0m"); // Red for ERROR - } elseif (strpos($output, '[CRITICAL]') !== false) { - $this->sendOutput($this->prefix . "\e[35m" . $output . "\e[0m"); // Magenta for CRITICAL - } else { - $this->sendOutput($this->prefix . $output); - } - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to watch backend.'); - $this->sendOutput(message: "\n"); - } else { - $this->sendOutput('Backend is now being watched.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start watch process.'); - } - exit; - } elseif ($cmdName == 'push') { - $process = popen('cd backend && export COMPOSER_ALLOW_SUPERUSER=1 && composer run lint 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to lint backend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Backend linted successfully.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start backend lint process.'); - } - - $process = popen('cd frontend && yarn lint 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to lint frontend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Frontend linted successfully.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start frontend lint process.'); - } - - $process = popen('cd frontend && yarn format 2>&1', 'r'); - if (is_resource($process)) { - while (!feof($process)) { - $output = fgets($process); - $this->sendOutput($this->prefix . $output); - } - $returnVar = pclose($process); - if ($returnVar !== 0) { - $this->sendOutput('Failed to format frontend.'); - $this->sendOutput("\n"); - } else { - $this->sendOutput('Frontend formatted successfully.'); - $this->sendOutput("\n"); - } - } else { - $this->sendOutput($this->prefix . 'Failed to start frontend format process.'); - } - - exit; - } - } -} diff --git a/backend/app/Cli/CommandBuilder.php b/backend/app/Cli/CommandBuilder.php deleted file mode 100755 index 46b161e8..00000000 --- a/backend/app/Cli/CommandBuilder.php +++ /dev/null @@ -1,36 +0,0 @@ - 0) { - switch ($args[1]) { - case 'install': - // Install an addon. - break; - case 'uninstall': - // Uninstall an addon. - break; - case 'list': - self::getInstance()->send('&5&lMythical&d&lDash &7- &d&lAddons'); - self::getInstance()->send(''); - $addons = \MythicalClient\Plugins\PluginManager::getLoadedMemoryPlugins(); - - $types = [ - PluginTypes::$event, - PluginTypes::$provider, - PluginTypes::$gateway, - PluginTypes::$components, - ]; - - foreach ($types as $type) { - if ($type == PluginTypes::$event) { - self::getInstance()->send('&5&lEvents Plugins:'); - self::getInstance()->send('&f(Typical plugins that listen to events)'); - self::getInstance()->send(''); - } elseif ($type == PluginTypes::$provider) { - self::getInstance()->send('&5&lProviders Plugins:'); - self::getInstance()->send('&f(Typical plugins that process purchases and create services!)'); - self::getInstance()->send(''); - } elseif ($type == PluginTypes::$gateway) { - self::getInstance()->send('&5&lGateways Plugins:'); - self::getInstance()->send('&f(Typical plugins that handle payment gateways!)'); - self::getInstance()->send(''); - } elseif ($type == PluginTypes::$components) { - self::getInstance()->send('&5&lComponents Plugins:'); - self::getInstance()->send('&f(Typical plugins that add new components to the frontend!)'); - self::getInstance()->send(''); - } - foreach ($addons as $plugin) { - $addonConfig = \MythicalClient\Plugins\PluginConfig::getConfig($plugin); - $name = $addonConfig['plugin']['name']; - $version = $addonConfig['plugin']['version']; - $description = $addonConfig['plugin']['description']; - if ($addonConfig['plugin']['type'] == $type) { - self::getInstance()->send("&7 - &b{$name} &8> &d{$version} &8> &7{$description}"); - self::getInstance()->send(''); - } - } - } - self::getInstance()->send(''); - break; - case 'update': - // Update an addon. - break; - default: - self::getInstance()->send('&cInvalid subcommand!'); - break; - } - } else { - self::getInstance()->send('&cPlease provide a subcommand!'); - } - } - - public static function getDescription(): string - { - return 'Manage your addons form the command line.'; - } - - public static function getSubCommands(): array - { - return [ - 'install' => 'Install an addon.', - 'uninstall ' => 'Uninstall an addon.', - 'list' => 'List all installed addons.', - ]; - } -} diff --git a/backend/app/Cli/Commands/Colors.php b/backend/app/Cli/Commands/Colors.php deleted file mode 100755 index c2112c0e..00000000 --- a/backend/app/Cli/Commands/Colors.php +++ /dev/null @@ -1,40 +0,0 @@ -send($colors); - $colors = '&0 0 &1 1 &2 2 &3 3 &4 4 &5 5 &6 6 &7 7 &8 8 &9 9 &a a &b b &c c &d d &e e &r r &l l &n n&r &m m &r'; - $app->send($colors); - } - - public static function getDescription(): string - { - return '&c&l&n&oS&6&l&n&ou&e&l&n&op&a&l&n&op&3&l&n&oo&9&l&n&or&5&l&n&ot&c&l&n&oe&6&l&n&od&e&l&n&o &a&l&n&oC&3&l&n&oo&9&l&n&ol&5&l&n&oo&c&l&n&or&6&l&n&os&e&l&n&o &a&l&n&oB&3&l&n&oy&9&l&n&o &5&l&n&oO&c&l&n&ou&6&l&n&or&e&l&n&o &a&l&n&oA&3&l&n&ow&9&l&n&os&5&l&n&oo&c&l&n&om&6&l&n&oe&e&l&n&o &a&l&n&oC&3&l&n&oL&9&l&n&oI'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Decrypt.php b/backend/app/Cli/Commands/Decrypt.php deleted file mode 100755 index ce19f844..00000000 --- a/backend/app/Cli/Commands/Decrypt.php +++ /dev/null @@ -1,37 +0,0 @@ -sendOutputWithNewLine('String: ' . \MythicalClient\App::getInstance(true)->decrypt($string) . ''); - } - - public static function getDescription(): string - { - return 'Decrypt a MythicalClient encrypted string'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Down.php b/backend/app/Cli/Commands/Down.php deleted file mode 100755 index 45f1e254..00000000 --- a/backend/app/Cli/Commands/Down.php +++ /dev/null @@ -1,47 +0,0 @@ -send('&cThe server is already in maintenance mode!'); - \MythicalClient\App::getInstance(true)->getLogger()->error('The server is already in maintenance mode!'); - exit; - } - \MythicalClient\App::getInstance(true)->getLogger()->info('The server is now in maintenance mode!'); - $fileTemplate = "503,'message'=>'The application is under maintenance.','error'=>'Service Unavailable','success'=>false,],JSON_PRETTY_PRINT);die();"; - file_put_contents(__DIR__ . '/../../../storage/caches/maintenance.php', $fileTemplate); - $app->send('&aThe server is now in maintenance mode.'); - exit; - - } - - public static function getDescription(): string - { - return 'Put the server from maintenance mode'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Help.php b/backend/app/Cli/Commands/Help.php deleted file mode 100755 index e21c5f5c..00000000 --- a/backend/app/Cli/Commands/Help.php +++ /dev/null @@ -1,70 +0,0 @@ -send($cmdInstance->bars); - $cmdInstance->send('&5&lMythical&d&lDash &7- &d&lHelp'); - $cmdInstance->send(''); - - $commands = scandir(__DIR__); - - foreach ($commands as $command) { - if ($command === '.' || $command === '..' || $command === 'Command.php') { - continue; - } - - $command = str_replace('.php', '', $command); - $commandClass = "MythicalClient\\Cli\\Commands\\$command"; - $commandFile = __DIR__ . "/$command.php"; - - require_once $commandFile; - - if (!class_exists($commandClass)) { - return; - } - - $description = $commandClass::getDescription(); - $command = lcfirst($command); - $subCommands = $commandClass::getSubCommands(); - $cmdInstance->send("&b{$command} &8> &7{$description}"); - - if (!empty($subCommands)) { - foreach ($subCommands as $subCommand => $description) { - $cmdInstance->send(" &8> &b{$command} {$subCommand} &8- &7{$description}"); - } - } - - } - $cmdInstance->send(''); - $cmdInstance->send($cmdInstance->bars); - } - - public static function getDescription(): string - { - return 'Get help for all commands'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/KeyRegen.php b/backend/app/Cli/Commands/KeyRegen.php deleted file mode 100755 index 1aeeebe7..00000000 --- a/backend/app/Cli/Commands/KeyRegen.php +++ /dev/null @@ -1,73 +0,0 @@ -send('&7Are you sure you want to reset the key? This will corupt all data there may be in the database! Type &ayes &7to continue or &cno &7to cancel.'); - $app->send('&7This action is irreversible!'); - $app->send('&7Type your answer below:'); - $line = trim(readline('> ')); - if ($line !== 'yes') { - $app->send('&cAction cancelled.'); - - return; - } - $isForced = true; // If the user types yes, then we can force the key reset - - } - - if ($isForced) { - $mainApp = \MythicalClient\App::getInstance(true); - $mainApp->loadEnv(); - $mainApp->getLogger()->warning('Old encryption key was: ' . $_ENV['DATABASE_ENCRYPTION_KEY']); - $app->send(message: '&7Old encryption key was: &e' . $_ENV['DATABASE_ENCRYPTION_KEY']); - $newKey = XChaCha20::generateStrongKey(true); - $mainApp->updateEnvValue('DATABASE_ENCRYPTION_KEY', $newKey, true); - sleep(3); - $_ENV['DATABASE_ENCRYPTION_KEY'] = $newKey; - $mainApp->getLogger()->warning('New encryption key is: ' . $_ENV['DATABASE_ENCRYPTION_KEY']); - $app->send(message: '&7New encryption key is: &e' . $_ENV['DATABASE_ENCRYPTION_KEY']); - $app->send(message: '&7Key reset successfully!'); - } else { - $app->send('&cAction cancelled.'); - - return; - } - } - - public static function getDescription(): string - { - return 'Regenerate the encryption key'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Migrate.php b/backend/app/Cli/Commands/Migrate.php deleted file mode 100755 index 38b1b797..00000000 --- a/backend/app/Cli/Commands/Migrate.php +++ /dev/null @@ -1,135 +0,0 @@ -getLogger()->warning('Executed a command without a .env file'); - $cliApp->send('The .env file does not exist. Please create one before running this command'); - exit; - } - $sqlScript = self::getMigrationSQL(); - try { - \MythicalClient\App::getInstance(true)->loadEnv(); - $db = new Database($_ENV['DATABASE_HOST'], $_ENV['DATABASE_DATABASE'], $_ENV['DATABASE_USER'], $_ENV['DATABASE_PASSWORD']); - } catch (\Exception $e) { - $cliApp->send('&cFailed to connect to the database: &r' . $e->getMessage()); - exit; - } - $cliApp->send('&aConnected to the database!'); - - /** - * Check if the migrations table exists. - */ - try { - $query = $db->getPdo()->query("SHOW TABLES LIKE 'mythicalclient_migrations'"); - if ($query->rowCount() > 0) { - $cliApp->send('&7The migrations table already exists!'); - } else { - $db->getPdo()->exec(statement: $sqlScript); - $cliApp->send('&7The migrations table has been created!'); - } - } catch (\Exception $e) { - $cliApp->send('&cFailed to create the migrations table: &r' . $e->getMessage()); - exit; - } - /** - * Get all the migration scripts. - */ - $migrations = scandir(__DIR__ . '/../../../storage/migrations/'); - foreach ($migrations as $migration) { - /** - * Skip the . and .. directories. - */ - if ($migration == '.' || $migration == '..') { - continue; - } - /** - * Get the migration content. - */ - $migration = __DIR__ . "/../../../storage/migrations/$migration"; - $migrationContent = file_get_contents($migration); - $migrationName = explode('/', $migration); - $migrationName = end($migrationName); - - /** - * Check if the migration was already executed. - */ - $stmt = $db->getPdo()->prepare("SELECT COUNT(*) FROM mythicalclient_migrations WHERE script = :script AND migrated = 'true'"); - $stmt->execute(['script' => $migrationName]); - $migrationExists = $stmt->fetchColumn(); - - if ($migrationExists > 0) { - $cliApp->send("&7Migration already executed: &e$migrationName"); - continue; - } - - /** - * Execute the migration. - */ - try { - $db->getPdo()->exec($migrationContent); - $cliApp->send("&7Migration executed successfully: &e$migrationName"); - } catch (\Exception $e) { - $cliApp->send('&cFailed to execute migration: &8[&4' . $migrationName . '&8] &r' . $e->getMessage()); - exit; - } - - /** - * Save the migration to the database. - */ - try { - $stmt = $db->getPdo()->prepare('INSERT INTO mythicalclient_migrations (script, migrated) VALUES (:script, :migrated)'); - $stmt->execute([ - 'script' => $migrationName, - 'migrated' => 'true', - ]); - $cliApp->send('&aMigration saved to the database!'); - } catch (\Exception $e) { - $cliApp->send('&cFailed to save the migration to the database: &r' . $e->getMessage()); - exit; - } - } - $cliApp->send('&aAll migrations have been executed!'); - } - - public static function getDescription(): string - { - return 'Migrate the database to the latest version'; - } - - public static function getSubCommands(): array - { - return []; - } - - private static function getMigrationSQL(): string - { - return "CREATE TABLE IF NOT EXISTS `mythicalclient_migrations` ( - `id` INT NOT NULL AUTO_INCREMENT COMMENT 'The id of the migration!', - `script` TEXT NOT NULL COMMENT 'The script to be migrated!', - `migrated` ENUM('true','false') NOT NULL DEFAULT 'true' COMMENT 'Did we migrate this already?', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The date from when this was executed!', - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT = 'The migrations table is table where save the sql migrations!';"; - } -} diff --git a/backend/app/Cli/Commands/Rebuild.php b/backend/app/Cli/Commands/Rebuild.php deleted file mode 100755 index e1820bba..00000000 --- a/backend/app/Cli/Commands/Rebuild.php +++ /dev/null @@ -1,80 +0,0 @@ -getLogger()->warning('Executed a command without a .env file'); - $app->send('The .env file does not exist. Please create one before running this command'); - exit; - } - $app->send('&aRebuilding the database...'); - - $app->send('&7Are you sure you want to rebuild the database? This will delete all data! Type &ayes &7to continue or &cno &7to cancel.'); - $app->send('&7This action is irreversible!'); - $app->send('&7Type your answer below:'); - $line = trim(readline('> ')); - - if ($line !== 'yes') { - $app->send('&cRebuild cancelled.'); - - return; - } - - $app->send('&aRebuilding...'); - - try { - \MythicalClient\App::getInstance(true)->loadEnv(); - $db = new Database($_ENV['DATABASE_HOST'], $_ENV['DATABASE_DATABASE'], $_ENV['DATABASE_USER'], $_ENV['DATABASE_PASSWORD']); - $db = $db->getPdo(); - } catch (\Exception $e) { - $app->send('&cFailed to connect to the database: &r' . $e->getMessage()); - exit; - } - - try { - $db->query('SET foreign_key_checks = 0'); - $tables = $db->query('SHOW TABLES')->fetchAll(\PDO::FETCH_COLUMN); - foreach ($tables as $table) { - $db->query("DROP TABLE `$table`"); - } - $db->query('SET foreign_key_checks = 1'); - } catch (\Exception $e) { - $app->send('&cFailed to rebuild the database: &r' . $e->getMessage()); - exit; - } - - $app->send('&aDatabase nuked successfully.'); - $app->send('&7Please run the migrations to rebuild the database.'); - exit; - } - - public static function getDescription(): string - { - return 'Rebuild the database!'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Setsetting.php b/backend/app/Cli/Commands/Setsetting.php deleted file mode 100755 index ce78c318..00000000 --- a/backend/app/Cli/Commands/Setsetting.php +++ /dev/null @@ -1,61 +0,0 @@ -send('&7The application is not setup!'); - exit; - } - - $cliApp->send('&aPlease enter the setting you want to update:'); - $setting = readline('> '); - - $cliApp->send('&aPlease enter the value you want to set:'); - $value = readline('> '); - \MythicalClient\App::getInstance(true)->loadEnv(); - - try { - $db = new Database($_ENV['DATABASE_HOST'], $_ENV['DATABASE_DATABASE'], $_ENV['DATABASE_USER'], $_ENV['DATABASE_PASSWORD']); - $config = new ConfigFactory($db->getPdo()); - $config->setSetting($setting, $value); - } catch (\Exception $e) { - $cliApp->send('&cAn error occurred while connecting to the database: ' . $e->getMessage()); - exit; - } - - $cliApp->send('&aSetting &e' . $setting . ' &ahas been set to &e' . $value); - - $cliApp->send('&aThe application has been setup!'); - } - - public static function getDescription(): string - { - return 'Update a setting!'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/Cli/Commands/Setup.php b/backend/app/Cli/Commands/Setup.php deleted file mode 100755 index e2727b88..00000000 --- a/backend/app/Cli/Commands/Setup.php +++ /dev/null @@ -1,102 +0,0 @@ -send('&aThe application is already setup!'); - exit; - } - - self::createDBConnection($cliApp); - - $cliApp->send('&aThe application has been setup!'); - } - - public static function getDescription(): string - { - return 'Setup the application!'; - } - - public static function getSubCommands(): array - { - return []; - } - - public static function createDBConnection(App $cliApp): void - { - $defultEncryption = 'xchacha20'; - $defultDBName = 'mythicalclient'; - $defultDBHost = '127.0.0.1'; - $defultDBPort = '3306'; - $defultDBUser = 'mythical'; - $defultDBPassword = ''; - - $cliApp->send("&7Please enter the database encryption &8[&e$defultEncryption&8]&7"); - $dbEncryption = readline('> ') ?: $defultEncryption; - $allowedEncryptions = ['xchacha20']; - if (!in_array($dbEncryption, $allowedEncryptions)) { - $cliApp->send('&cInvalid database encryption.'); - exit; - } - - $cliApp->send("&7Please enter the database name &8[&e$defultDBName&8]&7"); - $defultDBName = readline('> ') ?: $defultDBName; - - $cliApp->send("&7Please enter the database host &8[&e$defultDBHost&8]&7"); - $defultDBHost = readline('> ') ?: $defultDBHost; - - $cliApp->send("&7Please enter the database port &8[&e$defultDBPort&8]&7"); - $defultDBPort = readline('> ') ?: $defultDBPort; - - $cliApp->send("&7Please enter the database user &8[&e$defultDBUser&8]&7"); - $defultDBUser = readline('> ') ?: $defultDBUser; - - $cliApp->send("&7Please enter the database password &8[&e$defultDBPassword&8]&7"); - $defultDBPassword = readline('> ') ?: $defultDBPassword; - - try { - $dsn = "mysql:host=$defultDBHost;port=$defultDBPort;dbname=$defultDBName"; - $pdo = new \PDO($dsn, $defultDBUser, $defultDBPassword); - $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $cliApp->send('&aSuccessfully connected to the MySQL database.'); - } catch (\PDOException $e) { - $cliApp->send('&cFailed to connect to the MySQL database: ' . $e->getMessage()); - exit; - } - - $envTemplate = 'DATABASE_HOST=' . $defultDBHost . ' -DATABASE_PORT=' . $defultDBPort . ' -DATABASE_USER=' . $defultDBUser . ' -DATABASE_PASSWORD=' . $defultDBPassword . ' -DATABASE_DATABASE=' . $defultDBName . ' -DATABASE_ENCRYPTION=' . $dbEncryption . ' -DATABASE_ENCRYPTION_KEY=' . XChaCha20::generateStrongKey(true) . ''; - - $cliApp->send('&aEnvironment file created successfully.'); - $cliApp->send('&aEncryption key generated successfully.'); - - $envFile = fopen(__DIR__ . '/../../../storage/.env', 'w'); - fwrite($envFile, $envTemplate); - fclose($envFile); - } -} diff --git a/backend/app/Cli/Commands/Up.php b/backend/app/Cli/Commands/Up.php deleted file mode 100755 index c758920e..00000000 --- a/backend/app/Cli/Commands/Up.php +++ /dev/null @@ -1,45 +0,0 @@ -send('&aThe server is no longer in maintenance mode!'); - \MythicalClient\App::getInstance(true)->getLogger()->info('The server is no longer in maintenance mode!'); - exit; - } - \MythicalClient\App::getInstance(true)->getLogger()->error('The server is not in maintenance mode!'); - $app->send('&cThe server is not in maintenance mode!'); - exit; - - } - - public static function getDescription(): string - { - return 'Remove the server from maintenance mode'; - } - - public static function getSubCommands(): array - { - return []; - } -} diff --git a/backend/app/CloudFlare/CloudFlareRealIP.php b/backend/app/CloudFlare/CloudFlareRealIP.php deleted file mode 100755 index 00cb8a41..00000000 --- a/backend/app/CloudFlare/CloudFlareRealIP.php +++ /dev/null @@ -1,29 +0,0 @@ -db = $db; - } catch (\Exception $e) { - throw new \Exception('Failed to connect to the MYSQL Server! ', $e->getMessage()); - } - $this->encryption_key = $_ENV['DATABASE_ENCRYPTION_KEY']; - } - - /** - * Get a setting from the database. - * - * @param string $name The name of the setting - * @param mixed $fallback The fallback value if the setting is not found - * - * @return string|null The value of the setting - */ - public function getSetting(string $name, ?string $fallback): ?string - { - // Check if the setting is in the cache - if (isset($this->cache[$name])) { - return $this->cache[$name]; - } - $stmt = $this->db->prepare("SELECT * FROM {$this->table_name} WHERE name = :name LIMIT 1"); - $stmt->execute(['name' => $name]); - $result = $stmt->fetch(\PDO::FETCH_ASSOC); - if ($result) { - $result['value'] = XChaCha20::decrypt($result['value'], $this->encryption_key); - // Store the result in the cache - $this->cache[$name] = $result['value']; - - return $result['value']; - } - - return $fallback ?? null; - } - - /** - * Set a setting in the database. - * - * @param string $name The name of the setting - * @param string $value The value of the setting - * - * @throws \Exception If the setting already exists - * - * @return bool True if the setting was set successfully - */ - public function setSetting(string $name, string $value): bool - { - $existingSetting = $this->getSetting($name, null); - $encrypted_value = XChaCha20::encrypt($value, $this->encryption_key); - if ($existingSetting) { - $stmt = $this->db->prepare("UPDATE {$this->table_name} SET value = :value, date = NOW() WHERE name = :name"); - } else { - $stmt = $this->db->prepare("INSERT INTO {$this->table_name} (name, value, date) VALUES (:name, :value, NOW())"); - } - $result = $stmt->execute(['name' => $name, 'value' => $encrypted_value]); - if ($result) { - // Update the cache - $this->cache[$name] = $value; - } - - return $result; - } -} diff --git a/backend/app/Config/ConfigInterface.php b/backend/app/Config/ConfigInterface.php deleted file mode 100755 index b80bce23..00000000 --- a/backend/app/Config/ConfigInterface.php +++ /dev/null @@ -1,43 +0,0 @@ -loadEnv(); - $host = $_ENV['REDIS_HOST']; - $pwd = $_ENV['REDIS_PASSWORD']; - $client = new Client([ - 'scheme' => 'tcp', - 'host' => $host, - ]); - $this->redis = $client; - } - - public function getRedis(): Client - { - return $this->redis; - } - - public function testConnection(): bool - { - try { - $redis = $this->getRedis(); - $redis->connect(); - - return $redis->isConnected(); - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to connect to Redis: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Hooks/GitHub.php b/backend/app/Hooks/GitHub.php deleted file mode 100755 index e86d2712..00000000 --- a/backend/app/Hooks/GitHub.php +++ /dev/null @@ -1,58 +0,0 @@ -client = new Client(); - } - - /** - * Retrieves repository data from GitHub API, using cache if available. - * - * @return array the repository data - */ - public function getRepoData() - { - // Check if data is cached - if (Cache::exists($this->cacheKey)) { - return Cache::getJson($this->cacheKey); - } - - // Make GET request to GitHub API - $response = $this->client->request('GET', 'https://api.github.com/repos/mythicalltd/mythicaldash', [ - 'headers' => [ - 'Accept' => 'application/vnd.github+json', - 'X-GitHub-Api-Version' => '2022-11-28', - 'User-Agent' => 'MythicalClient', - ], - ]); - - $data = json_decode($response->getBody()->getContents(), true); - - // Cache the response - Cache::putJson($this->cacheKey, $data, $this->cacheTTL); - - return $data; - } -} diff --git a/backend/app/Hooks/MythicalAPP.php b/backend/app/Hooks/MythicalAPP.php deleted file mode 100755 index eb61ec2f..00000000 --- a/backend/app/Hooks/MythicalAPP.php +++ /dev/null @@ -1,168 +0,0 @@ - $code, - 'error' => $error, - 'message' => $message, - 'success' => $success, - 'core' => [ - 'debug_os' => SYSTEM_OS_NAME, - 'debug_os_kernel' => SYSTEM_KERNEL_NAME, - 'debug_name' => 'MythicalClient', - 'debug_debug' => APP_DEBUG, - 'debug_version' => APP_VERSION, - 'debug_telemetry' => TELEMETRY, - 'debug' => [ - 'useRedis' => REDIS_ENABLED, - 'rateLimit' => [ - 'enabled' => REDIS_ENABLED, - 'limit' => RATE_LIMIT, - ], - ], - ], - ]; - - if (!$extraContent == null) { - $response = array_merge($response, $extraContent); - } - - http_response_code($code); - exit(json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); - } -} diff --git a/backend/app/Logger/LoggerFactory.php b/backend/app/Logger/LoggerFactory.php deleted file mode 100755 index 738485c6..00000000 --- a/backend/app/Logger/LoggerFactory.php +++ /dev/null @@ -1,91 +0,0 @@ -logFile = $logFile; - if ($this->doesLogFileExist()) { - $this->createLogFile(); - } - } - - public function info(string $message): void - { - $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] ?? 'unknown'; - $this->appendLog('[INFO] [' . $caller . '] ' . $message); - } - - public function warning(string $message, bool $sendTelemetry = false): void - { - $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] ?? 'unknown'; - if ($sendTelemetry) { - $eventID = \Sentry\captureMessage($message, \Sentry\Severity::warning(), null); - } - $this->appendLog('[WARNING] (' . $eventID . ')[' . $caller . '] ' . $message); - } - - public function error(string $message, bool $sendTelemetry = false): void - { - $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] ?? 'unknown'; - if ($sendTelemetry) { - $eventID = \Sentry\captureMessage($message, \Sentry\Severity::error(), null); - } - $this->appendLog('[ERROR] (' . $eventID . ') [' . $caller . '] ' . $message); - } - - public function critical(string $message, bool $sendTelemetry = false): void - { - $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] ?? 'unknown'; - if ($sendTelemetry) { - - $eventID = \Sentry\captureMessage($message, \Sentry\Severity::fatal(), null); - } - $this->appendLog('[CRITICAL] (' . $eventID . ') [' . $caller . '] ' . $message); - } - - public function debug(string $message): void - { - if (APP_DEBUG == true) { - $caller = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['class'] ?? 'unknown'; - $this->appendLog('[DEBUG] [' . $caller . '] ' . $message); - } - } - - private function getFormattedDate(): string - { - return date('Y-m-d H:i:s'); - } - - private function appendLog(string $message): void - { - file_put_contents($this->logFile, '| (' . $this->getFormattedDate() . ') ' . $message . PHP_EOL, FILE_APPEND); - } - - private function createLogFile(): void - { - if (!$this->doesLogFileExist()) { - file_put_contents($this->logFile, ''); - } - } - - private function doesLogFileExist(): bool - { - return file_exists($this->logFile); - } -} diff --git a/backend/app/Mail/Mail.php b/backend/app/Mail/Mail.php deleted file mode 100755 index 0265be30..00000000 --- a/backend/app/Mail/Mail.php +++ /dev/null @@ -1,69 +0,0 @@ -getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/Mail.php) [send] Failed to send email: ' . $e->getMessage()); - } - } - - /** - * Is the SMTP server enabled? - */ - public static function isEnabled(): bool - { - $config = new ConfigFactory(Database::getPdoConnection()); - - if ($config->getSetting(ConfigInterface::SMTP_ENABLED, 'false') == 'true') { - return true; - } - - return false; - - } - - public static function processEmailTemplateGlobal(string $template): string - { - $config = new ConfigFactory(Database::getPdoConnection()); - - $template = str_replace('${app_name}', $config->getSetting(ConfigInterface::APP_NAME, 'MythicalSystems'), $template); - $template = str_replace('${app_url}', $config->getSetting(ConfigInterface::APP_URL, 'localhost'), $template); - $template = str_replace('${app_logo}', $config->getSetting(ConfigInterface::APP_LOGO, 'https://github.com/mythicalltd.png'), $template); - $template = str_replace('${app_lang}', $config->getSetting(ConfigInterface::APP_LANG, 'en_US'), $template); - $template = str_replace('${app_timezone}', $config->getSetting(ConfigInterface::APP_TIMEZONE, 'UTC'), $template); - $template = str_replace('${app_version}', $config->getSetting(ConfigInterface::APP_VERSION, '1.0.0'), $template); - - return $template; - } -} diff --git a/backend/app/Mail/services/SMTPServer.php b/backend/app/Mail/services/SMTPServer.php deleted file mode 100755 index 6ac1c9ab..00000000 --- a/backend/app/Mail/services/SMTPServer.php +++ /dev/null @@ -1,69 +0,0 @@ -getSetting(ConfigInterface::SMTP_ENABLED, 'false') == 'true') { - if ( - $config->getSetting(ConfigInterface::SMTP_HOST, null) == null - || $config->getSetting(ConfigInterface::SMTP_PORT, null) == null - || $config->getSetting(ConfigInterface::SMTP_USER, null) == null - || $config->getSetting(ConfigInterface::SMTP_PASS, null) == null - || $config->getSetting(ConfigInterface::SMTP_FROM, null) == null - ) { - App::getInstance(true)->getLogger()->info('Failed to send email, SMTP settings are not configured.'); - - return; - } - $mail = new \PHPMailer\PHPMailer\PHPMailer(false); - try { - $mail->isSMTP(); - $mail->Host = $config->getSetting(ConfigInterface::SMTP_HOST, null); - $mail->SMTPAuth = true; - $mail->Username = $config->getSetting(ConfigInterface::SMTP_USER, null); - $mail->Password = $config->getSetting(ConfigInterface::SMTP_PASS, null); - $mail->SMTPSecure = $config->getSetting(ConfigInterface::SMTP_ENCRYPTION, 'ssl'); - $mail->Port = $config->getSetting(ConfigInterface::SMTP_PORT, null); - $mail->setFrom($config->getSetting(ConfigInterface::SMTP_FROM, null), $config->getSetting(ConfigInterface::APP_NAME, null)); - $mail->addReplyTo($config->getSetting(ConfigInterface::SMTP_FROM, null), $config->getSetting(ConfigInterface::APP_NAME, null)); - $mail->isHTML(true); - $mail->Subject = $subject; - $mail->Body = $body; - $mail->addAddress($to); - $mail->send(); - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to send email: ' . $e->getMessage()); - - return; - } - - } - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('Failed to send email: ' . $e->getMessage()); - } - // No exception handling!! - - } -} diff --git a/backend/app/Mail/templates/NewLogin.php b/backend/app/Mail/templates/NewLogin.php deleted file mode 100755 index 4a73c28e..00000000 --- a/backend/app/Mail/templates/NewLogin.php +++ /dev/null @@ -1,74 +0,0 @@ -getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/NewLogin.php) [sendMail] Failed to send email: ' . $e->getMessage()); - } - } - - private static function getFinalTemplate(string $uuid): string - { - return self::processTemplate(self::getTemplate(), $uuid); - } - - private static function getTemplate(): ?string - { - try { - $conn = Database::getPdoConnection(); - $query = $conn->prepare('SELECT content FROM mythicalclient_mail_templates WHERE name = :name'); - $query->execute(['name' => 'new_login']); - $template = $query->fetchColumn(); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/NewLogin.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return null; - } - } - - private static function processTemplate(string $template, string $uuid): string - { - try { - $template = self::getTemplate(); - $template = User::processTemplate($template, $uuid); - $template = Mail::processEmailTemplateGlobal($template); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/NewLogin.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return ''; - } - } -} diff --git a/backend/app/Mail/templates/ResetPassword.php b/backend/app/Mail/templates/ResetPassword.php deleted file mode 100755 index 4d69836f..00000000 --- a/backend/app/Mail/templates/ResetPassword.php +++ /dev/null @@ -1,73 +0,0 @@ -getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/ResetPassword.php) [sendMail] Failed to send email: ' . $e->getMessage()); - } - } - - private static function getFinalTemplate(string $uuid): string - { - return self::processTemplate(self::getTemplate(), $uuid); - } - - private static function getTemplate(): ?string - { - try { - $conn = Database::getPdoConnection(); - $query = $conn->prepare('SELECT content FROM mythicalclient_mail_templates WHERE name = :name'); - $query->execute(['name' => 'reset_password']); - $template = $query->fetchColumn(); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/ResetPassword.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return null; - } - } - - private static function processTemplate(string $template, string $uuid): string - { - try { - $template = self::getTemplate(); - $template = User::processTemplate($template, $uuid); - $template = Mail::processEmailTemplateGlobal($template); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/ResetPassword.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return ''; - } - } -} diff --git a/backend/app/Mail/templates/Verify.php b/backend/app/Mail/templates/Verify.php deleted file mode 100755 index c03ec669..00000000 --- a/backend/app/Mail/templates/Verify.php +++ /dev/null @@ -1,73 +0,0 @@ -getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/Verify.php) [sendMail] Failed to send email: ' . $e->getMessage()); - } - } - - private static function getFinalTemplate(string $uuid): string - { - return self::processTemplate(self::getTemplate(), $uuid); - } - - private static function getTemplate(): ?string - { - try { - $conn = Database::getPdoConnection(); - $query = $conn->prepare('SELECT content FROM mythicalclient_mail_templates WHERE name = :name'); - $query->execute(['name' => 'verify']); - $template = $query->fetchColumn(); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/Verify.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return null; - } - } - - private static function processTemplate(string $template, string $uuid): string - { - try { - $template = self::getTemplate(); - $template = User::processTemplate($template, $uuid); - $template = Mail::processEmailTemplateGlobal($template); - - return $template; - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->error('(' . APP_SOURCECODE_DIR . '/Mail/templates/Verify.php) [sendMail] Failed to process template: ' . $e->getMessage()); - - return ''; - } - } -} diff --git a/backend/app/MythicalSystems/Telemetry.php b/backend/app/MythicalSystems/Telemetry.php deleted file mode 100755 index 5d68dbe3..00000000 --- a/backend/app/MythicalSystems/Telemetry.php +++ /dev/null @@ -1,30 +0,0 @@ -getLogger()->debug('Sending telemetry data: ' . $telemetryCollection); - - } catch (\Exception $e) { - App::getInstance(true)->getLogger()->debug('Failed to send telemetry data: ' . $e->getMessage()); - // No one cares! - } - } -} diff --git a/backend/app/Plugins/PluginConfig.php b/backend/app/Plugins/PluginConfig.php deleted file mode 100755 index 5eee9110..00000000 --- a/backend/app/Plugins/PluginConfig.php +++ /dev/null @@ -1,139 +0,0 @@ - 'string', - 'identifier' => 'string', - 'description' => 'string', - 'flags' => 'array', - 'version' => 'string', - 'target' => 'string', - 'author' => 'array', - 'icon' => 'string', - 'dependencies' => 'array', - 'type' => 'string', - ]; - } - - /** - * Check if the plugin config is valid. - * - * @param string $identifier The plugin identifier - * - * @return bool If the plugin config is valid - */ - public static function isValidIdentifier(string $identifier): bool - { - App::getInstance(true)->getLogger()->debug('Checking identifier: ' . $identifier); - if (empty($identifier)) { - return false; - } - if (preg_match('/\s/', $identifier)) { - return false; - } - if (preg_match('/^[a-zA-Z0-9_]+$/', $identifier) === 1) { - App::getInstance(true)->getLogger()->debug('Plugin id is allowed: ' . $identifier); - - return true; - } - App::getInstance(true)->getLogger()->warning('Plugin id is not allowed: ' . $identifier); - - return false; - - } - - /** - * Check if the plugin config is valid. - * - * @param array $config The plugin config - * - * @return bool If the plugin config is valid - */ - public static function isConfigValid(array $config): bool - { - try { - $app = App::getInstance(true); - $app->getLogger()->debug('Processing config.. ' . $config['plugin']['name'] . ''); - - $config_Requirements = self::getRequired(); - $config = $config['plugin']; - - if (!array_key_exists('identifier', $config)) { - $app->getLogger()->warning('Missing identifier for plugin.'); - - return false; - } - - foreach ($config_Requirements as $key => $value) { - if (!array_key_exists($key, $config)) { - $app->getLogger()->warning('Missing key for plugin: ' . $config['identifier'] . ' key: ' . $key); - - return false; - } - - if (gettype($config[$key]) !== $value) { - $app->getLogger()->warning('Invalid type for plugin: ' . $config['identifier'] . ' key: ' . $key); - - return false; - } - } - - if (!PluginFlags::validFlags($config['flags'])) { - $app->getLogger()->warning('Invalid flags for plugin: ' . $config['identifier']); - - return false; - } - - if (self::isValidIdentifier($config['identifier']) == false) { - $app->getLogger()->warning('Invalid identifier for plugin.'); - - return false; - } - - if (PluginTypes::isTypeAllowed($config['type']) == false) { - $app->getLogger()->warning('Invalid type for plugin: ' . $config['identifier']); - - return false; - } - - $app->getLogger()->debug('Done processing: ' . $config['name']); - - return true; - - } catch (\Exception $e) { - $app->getLogger()->error('Error processing plugin config: ' . $e->getMessage()); - - return false; - } - } - - /** - * Get the plugin config. - * - * @param string $identifier The plugin identifier - * - * @return array The plugin config - */ - public static function getConfig(string $identifier): array - { - return PluginHelper::getPluginConfig($identifier); - } -} diff --git a/backend/app/Plugins/PluginEvents.php b/backend/app/Plugins/PluginEvents.php deleted file mode 100755 index b8117a2d..00000000 --- a/backend/app/Plugins/PluginEvents.php +++ /dev/null @@ -1,138 +0,0 @@ -listeners[$event])) { - $this->listeners[$event] = []; - } - - $this->listeners[$event][] = $listener; - - return $this; - } - - /** - * Removes a listener for the specified event. - * - * @param string $event the name of the event - * @param callable $listener the listener function to be removed - */ - public function removeListener(string $event, callable $listener): void - { - if (isset($this->listeners[$event])) { - $index = array_search($listener, $this->listeners[$event], true); - - if ($index !== false) { - unset($this->listeners[$event][$index]); - - if (count($this->listeners[$event]) === 0) { - unset($this->listeners[$event]); - } - } - } - } - - /** - * Removes all listeners for the specified event or all events if no event is specified. - * - * @param string|null $event the name of the event (optional) - */ - public function removeAllListeners(?string $event = null): void - { - if ($event !== null) { - unset($this->listeners[$event]); - } else { - $this->listeners = []; - } - } - - /** - * Removes all listeners for the specified event or all events if no event is specified. - * - * @param string|null $event the name of the event (optional) - */ - public function listeners(?string $event = null): array - { - if ($event === null) { - $events = []; - $eventNames = array_unique( - array_merge( - array_keys($this->listeners), - ) - ); - - foreach ($eventNames as $eventName) { - $events[$eventName] = array_merge( - $this->listeners[$eventName] ?? [], - ); - } - - return $events; - } - - return array_merge( - $this->listeners[$event] ?? [], - ); - } - - /** - * Emits the specified event and triggers all associated listeners. - * - * @param string $event the name of the event - * @param array $arguments the arguments to be passed to the listeners (optional) - */ - public function emit(string $event, array $arguments = []): void - { - $listeners = []; - if (isset($this->listeners[$event])) { - $listeners = array_values($this->listeners[$event]); - } - - if ($listeners !== []) { - foreach ($listeners as $listener) { - $listener(...$arguments); - } - } - } -} diff --git a/backend/app/Plugins/PluginFlags.php b/backend/app/Plugins/PluginFlags.php deleted file mode 100755 index 3db99da5..00000000 --- a/backend/app/Plugins/PluginFlags.php +++ /dev/null @@ -1,60 +0,0 @@ -getLogger()->debug('Processing plugin flags'); - $flagList = PluginFlags::getFlags(); - foreach ($flagList as $flag) { - if (in_array($flag, $flags)) { - $app->getLogger()->debug('Valid flag: ' . $flag); - - return true; - } - } - $app->getLogger()->debug('Invalid flags: ' . implode(', ', $flags)); - - return false; - } catch (\Exception $e) { - $app->getLogger()->error('Failed to validate flags: ' . $e->getMessage()); - - return false; - } - } -} diff --git a/backend/app/Plugins/PluginHelper.php b/backend/app/Plugins/PluginHelper.php deleted file mode 100755 index 88a06851..00000000 --- a/backend/app/Plugins/PluginHelper.php +++ /dev/null @@ -1,67 +0,0 @@ -getLogger()->debug('Getting plugin config for: ' . $identifier . ''); - if (file_exists(self::getPluginsDir() . '/' . $identifier . '/conf.yml')) { - $app->getLogger()->debug('Got plugin config for: ' . $identifier . ''); - - return Yaml::parseFile(self::getPluginsDir() . '/' . $identifier . '/conf.yml'); - } - $app->getLogger()->debug('Failed to get plugin config for: ' . $identifier . ''); - - return []; - } catch (\Exception) { - $app->getLogger()->warning('Failed to get plugin config for: ' . self::getPluginConfig($identifier) . ''); - - return []; - } - } -} diff --git a/backend/app/Plugins/PluginManager.php b/backend/app/Plugins/PluginManager.php deleted file mode 100755 index 78879f84..00000000 --- a/backend/app/Plugins/PluginManager.php +++ /dev/null @@ -1,72 +0,0 @@ -getLogger()->warning('Plugin config is empty for: ' . $plugin); - } else { - if (PluginConfig::isConfigValid($config)) { - if (!in_array($plugin, self::$plugins)) { - $instance->getLogger()->debug('Plugin ' . $plugin . 'was loaded in the memory!'); - self::$plugins[] = $plugin; - } else { - $instance->getLogger()->error('Duplicated plugin identifier: ' . $plugin . ''); - } - } else { - $instance->getLogger()->warning('Invalid config for plugin: ' . $plugin); - } - } - } else { - $instance->getLogger()->warning(message: 'Invalid plugin identifier: ' . $plugin); - } - } - } - } catch (\Exception $e) { - $instance->getLogger()->error('Failed to start plugins: ' . $e->getMessage()); - } - } - - /** - * Get the loaded memory plugins. - * - * @return array The loaded memory plugins - */ - public static function getLoadedMemoryPlugins(): array - { - $instance = App::getInstance(true); - try { - return self::$plugins; - } catch (\Exception $e) { - $instance->getLogger()->error('Failed to get plugin names: ' . $e->getMessage()); - - return []; - } - } -} diff --git a/backend/app/Plugins/PluginTypes.php b/backend/app/Plugins/PluginTypes.php deleted file mode 100755 index 769d4632..00000000 --- a/backend/app/Plugins/PluginTypes.php +++ /dev/null @@ -1,49 +0,0 @@ -getMessage(); - echo "\n"; - exit; -} - -ini_set('expose_php', 'off'); -header_remove('X-Powered-By'); -header_remove('Server'); - -if (!is_writable(__DIR__)) { - exit('Please make sure the root directory is writable.'); -} - -if (!is_writable(__DIR__ . '/../storage')) { - exit('Please make sure the storage directory is writable.'); -} - -if (!extension_loaded('mysqli')) { - exit('MySQL extension is not installed!'); -} - -if (!extension_loaded('curl')) { - exit('Curl extension is not installed!'); -} - -if (!extension_loaded('gd')) { - exit('GD extension is not installed!'); -} - -if (!extension_loaded('mbstring')) { - exit('MBString extension is not installed!'); -} - -if (!extension_loaded('openssl')) { - exit('OpenSSL extension is not installed!'); -} - -if (!extension_loaded('zip')) { - exit('Zip extension is not installed!'); -} - -if (!extension_loaded('bcmath')) { - exit('Bcmath extension is not installed!'); -} - -if (!extension_loaded('json')) { - exit('JSON extension is not installed!'); -} - -if (!extension_loaded('sodium')) { - exit('sodium extension is not installed!'); -} -if (version_compare(PHP_VERSION, '8.1.0', '<')) { - exit('This application requires at least PHP 8.1.0'); -} diff --git a/backend/composer.json b/backend/composer.json deleted file mode 100755 index c0d47b7c..00000000 --- a/backend/composer.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "mythicalsystems/mythicalclient", - "description": "Open-Source Client Area like WHMCS for Mythical Systems", - "type": "project", - "homepage": "https://github.com/mythicalltd/myhticaldash", - "license": "MIT", - "autoload": { - "psr-4": { - "MythicalClient\\": "app/" - } - }, - "config": { - "vendor-dir": "storage/packages" - }, - "authors": [ - { - "name": "NaysKutzu", - "email": "ghermancassian2008@gmail.com", - "role": "Developer", - "homepage": "https://nayskutzu.xyz" - } - ], - "minimum-stability": "alpha", - "require": { - "vlucas/phpdotenv": "^5.6", - "mythicalsystems/core": "^1.0", - "gravatarphp/gravatar": "^1.0", - "phpmailer/phpmailer": "^6.9", - "pragmarx/google2fa": "^8.0", - "predis/predis": "^2.3", - "nikolaposa/rate-limit": "^3.2", - "guzzlehttp/guzzle": "^7.0", - "sentry/sentry": "^4.10" - }, - "require-dev": { - "phpunit/phpunit": "^11.1", - "friendsofphp/php-cs-fixer": "^3.59" - }, - "prefer-stable": true, - "support": { - "wiki": "https://www.mythical.systems", - "chat": "https://discord.mythical.systems", - "issues": "https://github.com/mythicalltd/mythicalldash/issues", - "docs": "https://www.mythical.systems", - "forum": "https://discord.mythical.systems" - }, - "funding": [ - { - "type": "GitHub", - "url": "https://github.com/sponsors/nayskutzu" - } - ], - "scripts": { - "lint": [ - "export COMPOSER_ALLOW_SUPERUSER=1", - "storage/packages/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php --show-progress bar && exit 0" - ], - "tests": [ - "export COMPOSER_ALLOW_SUPERUSER=1", - "storage/packages/bin/phpunit tests/" - ] - } -} diff --git a/backend/mythicalclient b/backend/mythicalclient deleted file mode 100755 index bcb70884..00000000 --- a/backend/mythicalclient +++ /dev/null @@ -1,25 +0,0 @@ -getMessage(); -} diff --git a/backend/public/index.php b/backend/public/index.php deleted file mode 100755 index 73a0366e..00000000 --- a/backend/public/index.php +++ /dev/null @@ -1,55 +0,0 @@ -getMessage(); - exit; -} diff --git a/backend/storage/.docker.env b/backend/storage/.docker.env deleted file mode 100755 index e67b1d1b..00000000 --- a/backend/storage/.docker.env +++ /dev/null @@ -1,9 +0,0 @@ -DATABASE_HOST=mythicalclient_database -DATABASE_PORT=3306 -DATABASE_USER=mythical -DATABASE_PASSWORD="Pizza2007!" -DATABASE_DATABASE=mythicalclient -DATABASE_ENCRYPTION=xchacha20 -DATABASE_ENCRYPTION_KEY="Wk2nAV0QHORNEg8/ZQQBeqdW4p2G8lp747RpP6T9yxs=" -REDIS_PASSWORD="eufefwefwefw" -REDIS_HOST=mythicalclient_redis \ No newline at end of file diff --git a/backend/storage/.env b/backend/storage/.env deleted file mode 100755 index 3c6b224a..00000000 --- a/backend/storage/.env +++ /dev/null @@ -1,9 +0,0 @@ -DATABASE_HOST=127.0.0.1 -DATABASE_PORT=3306 -DATABASE_USER=mythical -DATABASE_PASSWORD= -DATABASE_DATABASE=mythicalclient -DATABASE_ENCRYPTION=xchacha20 -DATABASE_ENCRYPTION_KEY=zKZ7//AocUD2wCuzjW5rdTbb8FvGBgKTZ8iCATslZ/8= -REDIS_PASSWORD="eufefwefwefw" -REDIS_HOST="127.0.0.1" \ No newline at end of file diff --git a/backend/storage/.gitignore b/backend/storage/.gitignore deleted file mode 100755 index 2957efaa..00000000 --- a/backend/storage/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/packages/*.php -/packages/*/ -/caches/*.php -/caches/*.json -/logs/*.txt -/logs/*.log -/caches/mails/*.html diff --git a/backend/storage/addons/.gitignore b/backend/storage/addons/.gitignore deleted file mode 100755 index 0a00d701..00000000 --- a/backend/storage/addons/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*/ \ No newline at end of file diff --git a/backend/storage/caches/.gitkeep b/backend/storage/caches/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/backend/storage/cron/bash/.gitkeep b/backend/storage/cron/bash/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/backend/storage/cron/bash/permissions.bash b/backend/storage/cron/bash/permissions.bash deleted file mode 100755 index cf9023da..00000000 --- a/backend/storage/cron/bash/permissions.bash +++ /dev/null @@ -1,2 +0,0 @@ -chown -R www-data:www-data /var/www/framework/ -chmod -R 777 /var/www/framework/ \ No newline at end of file diff --git a/backend/storage/cron/php/.gitkeep b/backend/storage/cron/php/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/backend/storage/cron/runner.bash b/backend/storage/cron/runner.bash deleted file mode 100755 index 01879bec..00000000 --- a/backend/storage/cron/runner.bash +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Path to the bash directory -bash_dir="./bash" -# Set the working directory to the directory where the script is located -cd "$(dirname "$0")" -echo "Running all bash files in $bash_dir" - -# Check if the bash directory exists -if [[ ! -d "$bash_dir" ]]; then - # Echo an error message and exit - echo "Error: $bash_dir does not exist" - exit 1 -fi -# Iterate over all .bash files in the directory -for file in "$bash_dir"/*.bash; do - # Check if the file is a regular file - if [[ -f "$file" ]]; then - # Echo the name of the file being executed - echo "Executing $file" - # Execute the bash file - bash "$file" - # Echo a message after execution - echo "Finished executing $file" - fi -done \ No newline at end of file diff --git a/backend/storage/cron/runner.php b/backend/storage/cron/runner.php deleted file mode 100755 index e69de29b..00000000 diff --git a/backend/storage/logs/.gitkeep b/backend/storage/logs/.gitkeep deleted file mode 100755 index e69de29b..00000000 diff --git a/backend/storage/migrations/2024-11-15-22.17-create-settings.sql b/backend/storage/migrations/2024-11-15-22.17-create-settings.sql deleted file mode 100755 index 59bd7ad7..00000000 --- a/backend/storage/migrations/2024-11-15-22.17-create-settings.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_settings` ( - `id` INT NOT NULL AUTO_INCREMENT COMMENT 'The id of the setting!', - `name` TEXT NOT NULL COMMENT 'The name of the setting', - `value` TEXT NOT NULL COMMENT 'The value of the setting!', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'The date of the last modifed!', - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT = 'The settings table where we store the settings of the dash!'; \ No newline at end of file diff --git a/backend/storage/migrations/2024-11-16-23.58-create-users.sql b/backend/storage/migrations/2024-11-16-23.58-create-users.sql deleted file mode 100755 index 2bae9318..00000000 --- a/backend/storage/migrations/2024-11-16-23.58-create-users.sql +++ /dev/null @@ -1,120 +0,0 @@ -SET - foreign_key_checks = 0; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `username` text NOT NULL, - `first_name` text NOT NULL, - `last_name` text NOT NULL, - `email` text NOT NULL, - `password` text NOT NULL, - `avatar` text DEFAULT 'https://www.gravatar.com/avatar', - `background` text NOT NULL DEFAULT 'https://cdn.mythicalsystems.xyz/background.gif', - `uuid` varchar(36) NOT NULL UNIQUE, - `token` text NOT NULL, - `role` int (11) NOT NULL DEFAULT 1, - `first_ip` text NOT NULL, - `last_ip` text NOT NULL, - `banned` text DEFAULT 'NO', - `verified` enum ('false', 'true') NOT NULL DEFAULT 'false', - `2fa_enabled` enum ('false', 'true') NOT NULL DEFAULT 'false', - `2fa_key` text DEFAULT NULL, - `2fa_blocked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` enum ('false', 'true') NOT NULL DEFAULT 'false', - `locked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `last_seen` datetime NOT NULL DEFAULT current_timestamp(), - `first_seen` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`role`) REFERENCES `mythicalclient_roles` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_roles` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `name` text NOT NULL, - `real_name` text NOT NULL, - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -INSERT INTO - `mythicalclient_roles` (`name`, `real_name`) -VALUES - ('Default', 'default'), - ('VIP', 'vip'), - ('Support Buddy', 'supportbuddy'), - ('Support', 'support'), - ('Support LVL 3','supportlvl3'), - ('Support LVL 4','supportlvl4'), - ('Admin', 'admin'), - ('Administrator','administrator'); - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users_mails` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `subject` text NOT NULL, - `body` longtext NOT NULL, - `from` text NOT NULL DEFAULT 'app@mythicalsystems.xyz', - `user` varchar(36) NOT NULL, - `read` int (11) NOT NULL DEFAULT 0, - `deleted` enum ('false', 'true') NOT NULL DEFAULT 'false', - `locked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users_activities` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `user` varchar(36) NOT NULL, - `action` text NOT NULL, - `ip_address` text NOT NULL, - `deleted` enum ('false', 'true') NOT NULL DEFAULT 'false', - `locked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users_apikeys` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `name` text NOT NULL, - `user` varchar(36) NOT NULL, - `type` enum ('r', 'rw') NOT NULL DEFAULT 'r', - `value` text NOT NULL, - `deleted` enum ('false', 'true') NOT NULL DEFAULT 'false', - `locked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users_email_verification` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `code` text NOT NULL, - `user` varchar(36) NOT NULL, - `type` enum ('password', 'verify') NOT NULL DEFAULT 'verify', - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci AUTO_INCREMENT = 2; - -CREATE TABLE IF NOT EXISTS - `mythicalclient_users_notifications` ( - `id` int (11) NOT NULL AUTO_INCREMENT, - `user` varchar(36) NOT NULL, - `name` text NOT NULL, - `description` text NOT NULL, - `deleted` enum ('false', 'true') NOT NULL DEFAULT 'false', - `locked` enum ('false', 'true') NOT NULL DEFAULT 'false', - `date` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -SET - foreign_key_checks = 1; \ No newline at end of file diff --git a/backend/storage/migrations/2024-11-20-21.41-create-mail-template.sql b/backend/storage/migrations/2024-11-20-21.41-create-mail-template.sql deleted file mode 100755 index 4a21918c..00000000 --- a/backend/storage/migrations/2024-11-20-21.41-create-mail-template.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_mail_templates` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `content` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `active` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('verify', 'Verify your ${app_name} account

${app_name}

Verify your email address

Dear Sir or Madam,

Hi ${first_name} ${last_name},

Thanks for signing up for ${app_name}. Please verify your email address by clicking the button below.

Verify Email Address

If you did not create an account with ${app_name}, you can safely ignore this email.

', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('reset_password', 'Reset your ${app_name} password

${app_name}

Reset your password

Dear Sir or Madam,

Hi ${first_name} ${last_name},

We received a request to reset your password for your ${app_name} account. Click the button below to reset it.

Reset Password

If you did not request a password reset, you can safely ignore this email.

', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('new_login', 'New login to your ${app_name} account

${app_name}

New login detected

Dear Sir or Madam,

Hi ${first_name} ${last_name},

We detected a new login to your ${app_name} account from a new device. If this was you, you can safely ignore this email. If this was not you, please secure your account immediately.

Secure Account
', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('new_invoice', 'New Invoice from ${app_name}

${app_name}

New Invoice

Dear Sir or Madam,

Hi ${first_name} ${last_name},

You have a new invoice from ${app_name}. Please find the details below:

Invoice Number: ${invoice_number}

Amount: ${invoice_amount}

View Invoice

If you have any questions, please contact our support team.

', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('product_ready', 'Your ${app_name} product is ready

${app_name}

Your product is ready

Dear Sir or Madam,

Hi ${first_name} ${last_name},

Your ${app_name} product is ready. You can access it using the following details:

Location: ${product_location}

Username: ${username}

Password: ${password}

Additional Info: ${additional_info}

Access Product
', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('product_suspended', 'Your ${app_name} product was suspended

${app_name}

Product Suspended

Dear Sir or Madam,

Hi ${first_name} ${last_name},

Your ${app_name} product was suspended. Please contact support for more information.

', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('invoice_paid', 'Invoice Paid - ${app_name}

${app_name}

Invoice Paid

Dear Sir or Madam,

Hi ${first_name} ${last_name},

Thank you for your payment. Your invoice ${invoice_number} has been paid successfully.

Amount: ${invoice_amount}

View Invoice
', 'true'); -INSERT INTO `mythicalclient_mail_templates` (`name`, `content`, `active`) VALUES ('welcome', 'Welcome to ${app_name}

${app_name}

Welcome to ${app_name}

Dear Sir or Madam,

Hi ${first_name} ${last_name},

Welcome to ${app_name}! We are excited to have you on board. Get started by exploring our features and services.

Go to Dashboard
', 'true'); \ No newline at end of file diff --git a/backend/storage/migrations/2024-11-25-23.37-create-billing.sql b/backend/storage/migrations/2024-11-25-23.37-create-billing.sql deleted file mode 100755 index 5af1bc95..00000000 --- a/backend/storage/migrations/2024-11-25-23.37-create-billing.sql +++ /dev/null @@ -1,19 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_billing` ( - `id` INT NOT NULL AUTO_INCREMENT, - `user` varchar(36) NOT NULL, - `company_name` TEXT NULL DEFAULT NULL, - `vat_number` TEXT NULL DEFAULT NULL, - `address1` TEXT NOT NULL, - `address2` TEXT NULL DEFAULT NULL, - `city` TEXT NOT NULL, - `country` TEXT NOT NULL, - `state` TEXT NOT NULL, - `postcode` TEXT NOT NULL, - `enabled` ENUM('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; diff --git a/backend/storage/migrations/2024-12-25-22.03-create-services-categories.sql b/backend/storage/migrations/2024-12-25-22.03-create-services-categories.sql deleted file mode 100755 index a62362f8..00000000 --- a/backend/storage/migrations/2024-12-25-22.03-create-services-categories.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_services_categories` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL , - `uri` TEXT NOT NULL , - `headline` TEXT NOT NULL, - `tagline` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-25-22.04-create-services-categories-features.sql b/backend/storage/migrations/2024-12-25-22.04-create-services-categories-features.sql deleted file mode 100755 index e012317a..00000000 --- a/backend/storage/migrations/2024-12-25-22.04-create-services-categories-features.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE - IF NOT EXISTS `mythicalclient_services_categories_features` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `category` int (16) NOT NULL, - `description` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`category`) REFERENCES `mythicalclient_services_categories` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-25-22.05-create-tickets-departments.sql b/backend/storage/migrations/2024-12-25-22.05-create-tickets-departments.sql deleted file mode 100755 index 9c6bdc03..00000000 --- a/backend/storage/migrations/2024-12-25-22.05-create-tickets-departments.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_departments` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `description` TEXT NOT NULL, - `time_open` TEXT NOT NULL, - `time_close` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-25-23.50-create-addons-types.sql b/backend/storage/migrations/2024-12-25-23.50-create-addons-types.sql deleted file mode 100755 index 3c0e6f4c..00000000 --- a/backend/storage/migrations/2024-12-25-23.50-create-addons-types.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_addons_types` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'true', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; - -INSERT INTO - `mythicalclient_addons_types` (`name`) -VALUES - ('event'), - ('gateway'), - ('provider'), - ('components'); \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-25-23.51-create-addons.sql b/backend/storage/migrations/2024-12-25-23.51-create-addons.sql deleted file mode 100755 index 6340fc09..00000000 --- a/backend/storage/migrations/2024-12-25-23.51-create-addons.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_addons` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `type` INT NOT NULL, - `display_name` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`type`) REFERENCES `mythicalclient_addons_types` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-25-23.58-create-services.sql b/backend/storage/migrations/2024-12-25-23.58-create-services.sql deleted file mode 100755 index 8a7affe7..00000000 --- a/backend/storage/migrations/2024-12-25-23.58-create-services.sql +++ /dev/null @@ -1,22 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_services` ( - `id` INT NOT NULL AUTO_INCREMENT, - `category` INT NOT NULL, - `name` TEXT NOT NULL, - `tagline` TEXT NOT NULL, - `quantity` INT NOT NULL, - `stock` INT NOT NULL, - `stock_enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `uri` TEXT NOT NULL, - `shortdescription` TEXT NOT NULL, - `description` TEXT NOT NULL, - `setup_fee` INT NOT NULL, - `provider` INT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`category`) REFERENCES `mythicalclient_services_categories` (`id`), - FOREIGN KEY (`provider`) REFERENCES `mythicalclient_addons` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; diff --git a/backend/storage/migrations/2024-12-25-23.59-create-services-prices-types.sql b/backend/storage/migrations/2024-12-25-23.59-create-services-prices-types.sql deleted file mode 100755 index a2ac3135..00000000 --- a/backend/storage/migrations/2024-12-25-23.59-create-services-prices-types.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_services_price_types` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; -INSERT INTO `mythicalclient_services_price_types` (`name`) VALUES ('one-time'), ('recurring'), ('free'); \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-26-00.08-create-services-prices.sql b/backend/storage/migrations/2024-12-26-00.08-create-services-prices.sql deleted file mode 100755 index b32e1d99..00000000 --- a/backend/storage/migrations/2024-12-26-00.08-create-services-prices.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_services_price` ( - `id` INT NOT NULL AUTO_INCREMENT, - `service` INT NOT NULL, - `type` INT NOT NULL, - `monthly` TEXT NULL, - `quarterly` TEXT NULL, - `semi_annually` TEXT NULL, - `annually` TEXT NULL, - `biennially` TEXT NULL, - `triennially` TEXT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`type`) REFERENCES `mythicalclient_services_price_types` (`id`), - FOREIGN KEY (`service`) REFERENCES `mythicalclient_services` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; diff --git a/backend/storage/migrations/2024-12-26-00.13-create-services-upgrades.sql b/backend/storage/migrations/2024-12-26-00.13-create-services-upgrades.sql deleted file mode 100755 index 5d481080..00000000 --- a/backend/storage/migrations/2024-12-26-00.13-create-services-upgrades.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_services_upgrades` ( - `id` INT NOT NULL AUTO_INCREMENT, - `product_id_old` INT NOT NULL, - `product-id_new` INT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`product_id_old`) REFERENCES `mythicalclient_services` (`id`), - FOREIGN KEY (`product-id_new`) REFERENCES `mythicalclient_services` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; diff --git a/backend/storage/migrations/2024-12-26-00.27-create-invoices-templates.sql b/backend/storage/migrations/2024-12-26-00.27-create-invoices-templates.sql deleted file mode 100755 index a792d68c..00000000 --- a/backend/storage/migrations/2024-12-26-00.27-create-invoices-templates.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE IF NOT EXISTS -`mythicalclient_invoice_templates` ( - `id` INT NOT NULL AUTO_INCREMENT, - `name` INT NOT NULL, - `content` INT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; diff --git a/backend/storage/migrations/2024-12-27-22.03-create-tickets.sql b/backend/storage/migrations/2024-12-27-22.03-create-tickets.sql deleted file mode 100755 index 5f4dfe76..00000000 --- a/backend/storage/migrations/2024-12-27-22.03-create-tickets.sql +++ /dev/null @@ -1,17 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_tickets` ( - `id` INT NOT NULL AUTO_INCREMENT, - `user` varchar(36) NOT NULL, - `department` int(16) NOT NULL, - `service` INT (16) NOT NULL, - `title` TEXT NOT NULL, - `description` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`), - FOREIGN KEY (`service`) REFERENCES `mythicalclient_services` (`id`), - FOREIGN KEY (`department`) REFERENCES `mythicalclient_departments` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2024-12-28-22.04-create-tickets-attachments.sql b/backend/storage/migrations/2024-12-28-22.04-create-tickets-attachments.sql deleted file mode 100755 index 205c7204..00000000 --- a/backend/storage/migrations/2024-12-28-22.04-create-tickets-attachments.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_tickets_attachments` ( - `id` INT NOT NULL AUTO_INCREMENT, - `ticket` int(16) NOT NULL, - `file` TEXT NOT NULL, - `enabled` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`ticket`) REFERENCES `mythicalclient_tickets` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-13-23.57-create-invoices.sql b/backend/storage/migrations/2025-01-13-23.57-create-invoices.sql deleted file mode 100755 index bcdd3887..00000000 --- a/backend/storage/migrations/2025-01-13-23.57-create-invoices.sql +++ /dev/null @@ -1,19 +0,0 @@ -CREATE TABLE IF NOT EXISTS - `mythicalclient_invoices` ( - `id` INT NOT NULL AUTO_INCREMENT, - `user` varchar(36) NOT NULL, - `service` INT (16) NOT NULL, - `status` ENUM ('cancelled', 'pending', 'paid', 'refunded') NOT NULL DEFAULT 'pending', - `paid_at` DATETIME NULL DEFAULT NULL, - `due_date` DATETIME NULL DEFAULT NULL, - `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `payment_gateway` TEXT NULL DEFAULT 'MythicalPay', - `cancelled_at` DATETIME NULL DEFAULT NULL, - `refunded_at` DATETIME NULL DEFAULT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - PRIMARY KEY (`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users` (`uuid`), - FOREIGN KEY (`service`) REFERENCES `mythicalclient_services` (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-14-14.19-create-announcements.sql b/backend/storage/migrations/2025-01-14-14.19-create-announcements.sql deleted file mode 100755 index c18d1a8e..00000000 --- a/backend/storage/migrations/2025-01-14-14.19-create-announcements.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE - `mythicalclient_announcements` ( - `id` INT NOT NULL AUTO_INCREMENT, - `title` TEXT NOT NULL, - `shortDescription` TEXT NOT NULL, - `description` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-14-14.20-create-announcements_assets.sql b/backend/storage/migrations/2025-01-14-14.20-create-announcements_assets.sql deleted file mode 100755 index 464fa341..00000000 --- a/backend/storage/migrations/2025-01-14-14.20-create-announcements_assets.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE - `mythicalclient_announcements_assets` ( - `id` INT NOT NULL AUTO_INCREMENT, - `announcements` int(16) NOT NULL, - `images` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`announcements`) REFERENCES `mythicalclient_announcements`(`id`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-14-14.21-create-announcements_tags.sql b/backend/storage/migrations/2025-01-14-14.21-create-announcements_tags.sql deleted file mode 100755 index 451766cf..00000000 --- a/backend/storage/migrations/2025-01-14-14.21-create-announcements_tags.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE - `mythicalclient_announcements_tags` ( - `id` INT NOT NULL AUTO_INCREMENT, - `announcements` int(16) NOT NULL, - `tag` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`announcements`) REFERENCES `mythicalclient_announcements`(`id`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-14-19.53-add-supportpin.sql b/backend/storage/migrations/2025-01-14-19.53-add-supportpin.sql deleted file mode 100755 index ad89070c..00000000 --- a/backend/storage/migrations/2025-01-14-19.53-add-supportpin.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `mythicalclient_users` ADD `support_pin` TEXT NULL DEFAULT NULL AFTER `verified`; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-20-00.21-ticket-service-null.sql b/backend/storage/migrations/2025-01-20-00.21-ticket-service-null.sql deleted file mode 100755 index efe6ad5d..00000000 --- a/backend/storage/migrations/2025-01-20-00.21-ticket-service-null.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `mythicalclient_tickets` CHANGE `service` `service` INT (16) NULL DEFAULT NULL; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-20-01.01-fix-enabled.sql b/backend/storage/migrations/2025-01-20-01.01-fix-enabled.sql deleted file mode 100755 index 461fd6e5..00000000 --- a/backend/storage/migrations/2025-01-20-01.01-fix-enabled.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `mythicalclient_tickets` DROP `enabled`; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-21-00.16-add-ticket-prio.sql b/backend/storage/migrations/2025-01-21-00.16-add-ticket-prio.sql deleted file mode 100755 index d4cc6b1a..00000000 --- a/backend/storage/migrations/2025-01-21-00.16-add-ticket-prio.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `mythicalclient_tickets` ADD `priority` ENUM ('low', 'medium', 'high', 'urgent') NOT NULL DEFAULT 'low' AFTER `department`; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-21-12.50-add-status-tickets.sql b/backend/storage/migrations/2025-01-21-12.50-add-status-tickets.sql deleted file mode 100755 index 5190eece..00000000 --- a/backend/storage/migrations/2025-01-21-12.50-add-status-tickets.sql +++ /dev/null @@ -1,7 +0,0 @@ -ALTER TABLE `mythicalclient_tickets` ADD `status` ENUM ( - 'open', - 'closed', - 'waiting', - 'replied', - 'inprogress' -) NOT NULL DEFAULT 'open' AFTER `priority`; \ No newline at end of file diff --git a/backend/storage/migrations/2025-01-21-15.04-create-ticket-message.sql b/backend/storage/migrations/2025-01-21-15.04-create-ticket-message.sql deleted file mode 100755 index 8182c3d7..00000000 --- a/backend/storage/migrations/2025-01-21-15.04-create-ticket-message.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE - `mythicalclient_tickets_messages` ( - `id` INT NOT NULL AUTO_INCREMENT, - `ticket` INT (16) NOT NULL, - `user` varchar(36) NOT NULL, - `message` TEXT NOT NULL, - `deleted` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `locked` ENUM ('false', 'true') NOT NULL DEFAULT 'false', - `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - FOREIGN KEY (`ticket`) REFERENCES `mythicalclient_tickets`(`id`), - FOREIGN KEY (`user`) REFERENCES `mythicalclient_users`(`uuid`) - ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/backend/tests/HelloWorldTest.php b/backend/tests/HelloWorldTest.php deleted file mode 100755 index ef674d04..00000000 --- a/backend/tests/HelloWorldTest.php +++ /dev/null @@ -1,22 +0,0 @@ -assertEquals('Hello, World!', 'Hello, World!'); - } -} diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 00000000..113955b4 --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,23 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware) { + $middleware->web(append: [ + \App\Http\Middleware\HandleInertiaRequests::class, + \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class, + ]); + + // + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 00000000..38b258d1 --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,5 @@ +=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { - "files": [ - "lib/Assert/functions.php" - ], "psr-4": { - "Assert\\": "lib/Assert" + "Brick\\Math\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } + "MIT" ], - "description": "Thin assertion library for input validation in business models.", + "description": "Arbitrary-precision arithmetic library", "keywords": [ - "assert", - "assertion", - "validation" + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.3" + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" }, - "time": "2024-07-15T13:18:35+00:00" + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" }, { - "name": "graham-campbell/result-type", - "version": "v1.1.3", + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", - "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" }, "require-dev": { - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" }, "type": "library", "autoload": { "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" } }, "notification-url": "https://packagist.org/downloads/", @@ -106,67 +103,71 @@ ], "authors": [ { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" } ], - "description": "An Implementation Of The Result Type", + "description": "Types to use Carbon in Doctrine", "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" + "carbon", + "date", + "datetime", + "doctrine", + "time" ], "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + "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/GrahamCampbell", + "url": "https://github.com/kylekatarnls", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", "type": "tidelift" } ], - "time": "2024-07-20T21:45:45+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { - "name": "gravatarphp/gravatar", - "version": "v1.0.0", + "name": "dflydev/dot-access-data", + "version": "v3.0.3", "source": { "type": "git", - "url": "https://github.com/gravatarphp/gravatar.git", - "reference": "21b760c50bcdddd8e65d3a4b3981b7ec9b3d44aa" + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gravatarphp/gravatar/zipball/21b760c50bcdddd8e65d3a4b3981b7ec9b3d44aa", - "reference": "21b760c50bcdddd8e65d3a4b3981b7ec9b3d44aa", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", "shasum": "" }, "require": { - "php": ">=5.4" + "php": "^7.1 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "henrikbjorn/phpspec-code-coverage": "^2.0", - "phpspec/phpspec": "^2.5", - "sllh/php-cs-fixer-styleci-bridge": "^2.0" + "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-master": "1.0-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Gravatar\\": "src/" + "Dflydev\\DotAccessData\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -175,75 +176,69 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "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": "Gravatar URL builder which is most commonly called as a Gravatar library", - "homepage": "http://gravatarphp.com", + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", "keywords": [ - "avatar", - "gravatar", - "image", - "profile" + "access", + "data", + "dot", + "notation" ], "support": { - "issues": "https://github.com/gravatarphp/gravatar/issues", - "source": "https://github.com/gravatarphp/gravatar/tree/master" + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2016-06-25T11:20:11+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "name": "doctrine/inflector", + "version": "2.0.10", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -252,104 +247,88 @@ ], "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": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" }, { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Guzzle is a PHP HTTP client library", + "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": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "url": "https://github.com/Nyholm", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2024-02-18T20:23:39+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.4", + "name": "doctrine/lexer", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^8.1" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -358,92 +337,82 @@ ], "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": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Guzzle promises library", + "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": [ - "promise" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "url": "https://github.com/Nyholm", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.7.0", + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "replace": { + "mtdowling/cron-expression": "^1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -452,167 +421,63 @@ ], "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" + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" + "cron", + "schedule" ], "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/dragonmantank", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { - "name": "jean85/pretty-package-versions", - "version": "2.1.0", + "name": "egulias/email-validator", + "version": "4.0.3", "source": { "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "b115554301161fa21467629f1e1391c1936de517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", "shasum": "" }, "require": { - "composer-runtime-api": "^2.1.0", - "php": "^7.4|^8.0" + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.6", - "vimeo/psalm": "^4.3 || ^5.0" + "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": "1.x-dev" + "dev-master": "4.0.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.0" - }, - "time": "2024-11-18T16:19:46+00:00" - }, - { - "name": "mythicalsystems/core", - "version": "1.0.0.17", - "source": { - "type": "git", - "url": "https://github.com/MythicalLTD/MythicalCore.git", - "reference": "c5783a5a3331ec0260084a4aa6c1b810aefb2545" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MythicalLTD/MythicalCore/zipball/c5783a5a3331ec0260084a4aa6c1b810aefb2545", - "reference": "c5783a5a3331ec0260084a4aa6c1b810aefb2545", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "ext-sodium": "*", - "php": ">=8.1.0", - "symfony/yaml": ">6.2.5" - }, - "replace": { - "ecoal95/php-router": "*", - "mythicalsystems/php-router": "*" - }, - "suggest": { - "guzzlehttp/guzzle": "^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/php-6.0-support.php" - ], - "psr-0": { - "Router": "src", - "MythicalSystems": "src" + "Egulias\\EmailValidator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -621,85 +486,62 @@ ], "authors": [ { - "name": "NaysKutzu", - "email": "nayskutzu@mythicalsystems.me", - "homepage": "https://mythicalsystems.me", - "role": "Owner" + "name": "Eduardo Gulias Davis" } ], - "description": "The core composer packages for all MythicalSystems projects!", - "homepage": "https://github.com/mythicalltd/mythicalcore", + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", "keywords": [ - "kosmapanel", - "mythicalclient", - "mythicalcore", - "mythicaldash", - "mythicalltd", - "mythicalsystems", - "nayskutzu", - "php-router", - "phprouter", - "router" + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" ], "support": { - "chat": "https://discord.gg/Tswkrhreu3", - "docs": "https://docs.mythicalsystems.me", - "forum": "https://discord.gg/Tswkrhreu3", - "issues": "https://github.com/mythicalltd/mythicalcore/issues", - "source": "https://github.com/MythicalLTD/MythicalCore/tree/1.0.0.17", - "wiki": "https://docs.mythicalsystems.me" + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" }, "funding": [ { - "url": "https://github.com/sponsors/nayskutzu", - "type": "GitHub" + "url": "https://github.com/egulias", + "type": "github" } ], - "time": "2024-11-06T23:03:37+00:00" + "time": "2024-12-27T00:36:43+00:00" }, { - "name": "nikolaposa/rate-limit", - "version": "3.2.0", + "name": "fruitcake/php-cors", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/nikolaposa/rate-limit.git", - "reference": "80a1badf8157c6f206074defd752bd00f9cf08e9" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikolaposa/rate-limit/zipball/80a1badf8157c6f206074defd752bd00f9cf08e9", - "reference": "80a1badf8157c6f206074defd752bd00f9cf08e9", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", "shasum": "" }, "require": { - "beberlei/assert": "^3.2", - "php": "^8.1" + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" }, "require-dev": { - "ext-apcu": ">=5.1.12", - "ext-redis": "*", - "friendsofphp/php-cs-fixer": "3.44", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-beberlei-assert": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^10.5", - "predis/predis": "^1.1" - }, - "suggest": { - "ext-apcu": "In order to use ApcuRateLimiter", - "ext-memcached": "In order to use MemcachedRateLimiter", - "ext-redis": "In order to use RedisRateLimiter", - "predis/predis": "In order to use PredisRateLimiter" + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "1.2-dev" } }, "autoload": { "psr-4": { - "RateLimit\\": "src/" + "Fruitcake\\Cors\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -708,47 +550,62 @@ ], "authors": [ { - "name": "Nikola Poša", - "email": "posa.nikola@gmail.com", - "homepage": "https://www.nikolaposa.in.rs" + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" } ], - "description": "General purpose rate limiter implementation.", + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", "keywords": [ - "rate limit", - "redis" + "cors", + "laravel", + "symfony" ], "support": { - "issues": "https://github.com/nikolaposa/rate-limit/issues", - "source": "https://github.com/nikolaposa/rate-limit/tree/3.2.0" + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" }, - "time": "2024-05-17T14:39:51+00:00" + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" }, { - "name": "paragonie/constant_time_encoding", - "version": "v3.0.0", + "name": "graham-campbell/result-type", + "version": "v1.1.3", "source": { "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", "shasum": "" }, "require": { - "php": "^8" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" }, "require-dev": { - "phpunit/phpunit": "^9", - "vimeo/psalm": "^4|^5" + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, "type": "library", "autoload": { "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -757,133 +614,173 @@ ], "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" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "description": "An Implementation Of The Result Type", "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" ], "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" }, - "time": "2024-05-08T12:36:18+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" }, { - "name": "phpmailer/phpmailer", - "version": "v6.9.3", + "name": "guzzlehttp/guzzle", + "version": "7.9.2", "source": { "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e", - "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/annotations": "^1.2.6 || ^1.13.3", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", - "yoast/phpunit-polyfills": "^1.0.4" + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { - "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "ext-openssl": "Needed for secure SMTP sending and DKIM signing", - "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", - "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1-only" + "MIT" ], "authors": [ { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" + "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": "Jim Jagielski", - "email": "jimjag@gmail.com" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" }, { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" }, { - "name": "Brent R. Matzelle" + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "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/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { - "url": "https://github.com/Synchro", + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" } ], - "time": "2024-11-24T18:04:13+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { - "name": "phpoption/phpoption", - "version": "1.9.3", + "name": "guzzlehttp/promises", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -891,49 +788,53 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "1.9-dev" } }, "autoload": { "psr-4": { - "PhpOption\\": "src/PhpOption/" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "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" + }, + { + "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": "Option Type for PHP", + "description": "Guzzle promises library", "keywords": [ - "language", - "option", - "php", - "type" + "promise" ], "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -941,38 +842,58 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", "type": "tidelift" } ], - "time": "2024-07-20T21:41:07+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { - "name": "pragmarx/google2fa", - "version": "v8.0.3", + "name": "guzzlehttp/psr7", + "version": "2.7.0", "source": { "type": "git", - "url": "https://github.com/antonioribeiro/google2fa.git", - "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad" + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", - "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0", - "php": "^7.1|^8.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "PragmaRX\\Google2FA\\": "src/" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -981,53 +902,105 @@ ], "authors": [ { - "name": "Antonio Carlos Ribeiro", - "email": "acr@antoniocarlosribeiro.com", - "role": "Creator & Designer" + "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": "A One Time Password Authentication package, compatible with Google Authenticator.", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "2fa", - "Authentication", - "Two Factor Authentication", - "google2fa" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/antonioribeiro/google2fa/issues", - "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, - "time": "2024-09-05T11:56:40+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" }, { - "name": "predis/predis", - "version": "v2.3.0", + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", "source": { "type": "git", - "url": "https://github.com/predis/predis.git", - "reference": "bac46bfdb78cd6e9c7926c697012aae740cb9ec9" + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/bac46bfdb78cd6e9c7926c697012aae740cb9ec9", - "reference": "bac46bfdb78cd6e9c7926c697012aae740cb9ec9", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.3", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^8.0 || ^9.4" - }, - "suggest": { - "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "Predis\\": "src/" + "GuzzleHttp\\UriTemplate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1036,57 +1009,95 @@ ], "authors": [ { - "name": "Till Krüss", - "homepage": "https://till.im", - "role": "Maintainer" + "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 flexible and feature-complete Redis client for PHP.", - "homepage": "http://github.com/predis/predis", + "description": "A polyfill class for uri_template of PHP", "keywords": [ - "nosql", - "predis", - "redis" + "guzzlehttp", + "uri-template" ], "support": { - "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v2.3.0" + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" }, "funding": [ { - "url": "https://github.com/sponsors/tillkruss", + "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": "2024-11-21T20:00:02+00:00" + "time": "2023-12-03T19:50:20+00:00" }, { - "name": "psr/http-client", - "version": "1.0.3", + "name": "inertiajs/inertia-laravel", + "version": "v2.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "0259e37f802bc39c814c42ba92c04ada17921f70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/0259e37f802bc39c814c42ba92c04ada17921f70", + "reference": "0259e37f802bc39c814c42ba92c04ada17921f70", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" + "ext-json": "*", + "laravel/framework": "^10.0|^11.0", + "php": "^8.1.0", + "symfony/console": "^6.2|^7.0" + }, + "require-dev": { + "laravel/pint": "^1.16", + "mockery/mockery": "^1.3.3", + "orchestra/testbench": "^8.0|^9.2", + "phpunit/phpunit": "^10.4|^11.0", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "ext-pcntl": "Recommended when running the Inertia SSR server via the `inertia:start-ssr` artisan command." }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] } }, "autoload": { + "files": [ + "./helpers.php" + ], "psr-4": { - "Psr\\Http\\Client\\": "src/" + "Inertia\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1095,50 +1106,218 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" } ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", + "description": "The Laravel adapter for Inertia.js.", "keywords": [ - "http", - "http-client", - "psr", - "psr-18" + "inertia", + "laravel" ], "support": { - "source": "https://github.com/php-fig/http-client" + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v2.0.0" }, - "time": "2023-09-23T14:17:50+00:00" + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2024-12-13T02:48:29+00:00" }, { - "name": "psr/http-factory", - "version": "1.1.0", + "name": "laravel/framework", + "version": "v11.39.1", "source": { "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + "url": "https://github.com/laravel/framework.git", + "reference": "3d693dd36e78121bcd51fc02eda4bc137d2a17f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "url": "https://api.github.com/repos/laravel/framework/zipball/3d693dd36e78121bcd51fc02eda4bc137d2a17f2", + "reference": "3d693dd36e78121bcd51fc02eda4bc137d2a17f2", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.6", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.2|^3.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.0.3", + "symfony/error-handler": "^7.0.3", + "symfony/finder": "^7.0.3", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.0.3", + "symfony/mailer": "^7.0.3", + "symfony/mime": "^7.0.3", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.0.3", + "symfony/routing": "^7.0.3", + "symfony/uid": "^7.0.3", + "symfony/var-dumper": "^7.0.3", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^9.6", + "pda/pheanstalk": "^5.0.6", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^1.11.5", + "phpunit/phpunit": "^10.5.35|^11.3.6", + "predis/predis": "^2.3", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0.3", + "symfony/http-client": "^7.0.3", + "symfony/psr-http-message-bridge": "^7.0.3", + "symfony/translation": "^7.0.3" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", + "predis/predis": "Required to use the predis connector (^2.3).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "11.x-dev" } }, "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -1147,105 +1326,121 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" + "framework", + "laravel" ], "support": { - "source": "https://github.com/php-fig/http-factory" + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" }, - "time": "2024-04-15T12:06:14+00:00" + "time": "2025-01-22T17:01:46+00:00" }, { - "name": "psr/http-message", - "version": "2.0", + "name": "laravel/prompts", + "version": "v0.3.3", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + "url": "https://github.com/laravel/prompts.git", + "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "url": "https://api.github.com/repos/laravel/prompts/zipball/749395fcd5f8f7530fe1f00dfa84eb22c83d94ea", + "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-main": "0.3.x-dev" } }, "autoload": { + "files": [ + "src/helpers.php" + ], "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Laravel\\Prompts\\": "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" - ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.3" }, - "time": "2023-04-04T09:54:51+00:00" + "time": "2024-12-30T15:53:31+00:00" }, { - "name": "psr/log", - "version": "3.0.2", + "name": "laravel/sanctum", + "version": "v4.0.7", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "url": "https://github.com/laravel/sanctum.git", + "reference": "698064236a46df016e64a7eb059b1414e0b281df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df", + "reference": "698064236a46df016e64a7eb059b1414e0b281df", "shasum": "" }, "require": { - "php": ">=8.0.0" + "ext-json": "*", + "illuminate/console": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/database": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2", + "symfony/console": "^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.x-dev" + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] } }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Laravel\\Sanctum\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1254,48 +1449,56 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", "keywords": [ - "log", - "psr", - "psr-3" + "auth", + "laravel", + "sanctum" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2024-12-11T16:40:21+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "laravel/serializable-closure", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", "shasum": "" }, "require": { - "php": ">=5.6" + "php": "^8.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" + "illuminate/support": "^10.0|^11.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, "autoload": { - "files": [ - "src/getallheaders.php" - ] + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1303,65 +1506,67 @@ ], "authors": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "A polyfill for getallheaders.", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2024-12-16T15:26:28+00:00" }, { - "name": "sentry/sentry", - "version": "4.10.0", + "name": "laravel/tinker", + "version": "v2.10.0", "source": { "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856" + "url": "https://github.com/laravel/tinker.git", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "jean85/pretty-package-versions": "^1.5|^2.0.4", - "php": "^7.2|^8.0", - "psr/log": "^1.0|^2.0|^3.0", - "symfony/options-resolver": "^4.4.30|^5.0.11|^6.0|^7.0" - }, - "conflict": { - "raven/raven": "*" + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.4", - "guzzlehttp/promises": "^2.0.3", - "guzzlehttp/psr7": "^1.8.4|^2.1.1", - "monolog/monolog": "^1.6|^2.0|^3.0", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^8.5|^9.6", - "symfony/phpunit-bridge": "^5.2|^6.0|^7.0", - "vimeo/psalm": "^4.17" + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" }, "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Sentry\\": "src/" + "Laravel\\Tinker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1370,209 +1575,263 @@ ], "authors": [ { - "name": "Sentry", - "email": "accounts@sentry.io" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "PHP SDK for Sentry (http://sentry.io)", - "homepage": "http://sentry.io", + "description": "Powerful REPL for the Laravel framework.", "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "profiling", - "sentry", - "tracing" + "REPL", + "Tinker", + "laravel", + "psysh" ], "support": { - "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.10.0" + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.0" }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2024-11-06T07:44:19+00:00" + "time": "2024-09-23T13:32:56+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "name": "league/commonmark", + "version": "2.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", + "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "2.7-dev" } }, "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "League\\CommonMark\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "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": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "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://symfony.com/sponsor", + "url": "https://www.colinodell.com/sponsor", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-12-29T14:10:59+00:00" }, { - "name": "symfony/options-resolver", - "version": "v7.2.0", + "name": "league/config", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "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": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "League\\Config\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" } ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", "keywords": [ + "array", "config", "configuration", - "options" + "dot", + "dot-access", + "nested", + "schema" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "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://symfony.com/sponsor", + "url": "https://www.colinodell.com/sponsor", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://github.com/colinodell", + "type": "github" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "name": "league/flysystem", + "version": "3.29.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { - "php": ">=7.2" + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, - "provide": { - "ext-ctype": "*" + "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" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1581,77 +1840,54 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "File storage abstraction for PHP", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "name": "league/flysystem-local", + "version": "3.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "League\\Flysystem\\Local\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1660,76 +1896,51 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Local filesystem adapter for Flysystem.", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "Flysystem", + "file", + "files", + "filesystem", + "local" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-08-09T21:24:39+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "league/mime-type-detection", + "version": "1.16.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { - "php": ">=7.2" + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "League\\MimeTypeDetection\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1737,81 +1948,68 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Mime-type detection for Flysystem", "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/frankdejonge", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { - "name": "symfony/yaml", - "version": "v7.2.0", + "name": "league/uri", + "version": "7.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + "url": "https://github.com/thephpleague/uri.git", + "reference": "81fb5145d2644324614cc532b28efd0215bda430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430", + "reference": "81fb5145d2644324614cc532b28efd0215bda430", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "^1.8" + "league/uri-interfaces": "^7.5", + "php": "^8.1" }, "conflict": { - "symfony/console": "<6.4" + "league/uri-schemes": "^1.0" }, - "require-dev": { - "symfony/console": "^6.4|^7.0" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "League\\Uri\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1819,147 +2017,199 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.0" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.5.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2024-12-08T08:40:02+00:00" }, { - "name": "vlucas/phpdotenv", - "version": "v5.6.1", + "name": "league/uri-interfaces", + "version": "7.5.0", "source": { "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", + "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742", "shasum": "" }, "require": { - "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.3", - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3", - "symfony/polyfill-ctype": "^1.24", - "symfony/polyfill-mbstring": "^1.24", - "symfony/polyfill-php80": "^1.24" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" }, "suggest": { - "ext-filter": "Required to use the boolean validator." + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, "branch-alias": { - "dev-master": "5.6-dev" + "dev-master": "7.x-dev" } }, "autoload": { "psr-4": { - "Dotenv\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "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" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "dotenv", - "env", - "environment" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", + "url": "https://github.com/sponsors/nyamsprod", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" } ], - "time": "2024-07-20T21:52:34+00:00" - } - ], - "packages-dev": [ + "time": "2024-12-08T08:18:47+00:00" + }, { - "name": "clue/ndjson-react", - "version": "v1.3.0", + "name": "monolog/monolog", + "version": "3.8.1", "source": { "type": "git", - "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + "url": "https://github.com/Seldaek/monolog.git", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", - "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", "shasum": "" }, "require": { - "php": ">=5.3", - "react/stream": "^1.2" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/event-loop": "^1.2" + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "Clue\\React\\NDJson\\": "src/" + "Monolog\\": "src/Monolog" } }, "notification-url": "https://packagist.org/downloads/", @@ -1968,75 +2218,95 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" } ], - "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", - "homepage": "https://github.com/clue/reactphp-ndjson", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", "keywords": [ - "NDJSON", - "json", - "jsonlines", - "newline", - "reactphp", - "streaming" + "log", + "logging", + "psr-3" ], "support": { - "issues": "https://github.com/clue/reactphp-ndjson/issues", - "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" }, "funding": [ { - "url": "https://clue.engineering/support", - "type": "custom" + "url": "https://github.com/Seldaek", + "type": "github" }, { - "url": "https://github.com/clue", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" } ], - "time": "2022-12-23T10:58:28+00:00" + "time": "2024-12-05T17:15:07+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "nesbot/carbon", + "version": "3.8.4", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58", + "reference": "129700ed449b1f02d70272d2ac802357c8c30c58", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" }, - "conflict": { - "phpstan/phpstan": "<1.11.10" + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" }, + "bin": [ + "bin/carbon" + ], "type": "library", "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, "phpstan": { "includes": [ "extension.neon" ] }, "branch-alias": { - "dev-main": "3.x-dev" + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Composer\\Pcre\\": "src" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2045,264 +2315,295 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "date", + "datetime", + "time" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://github.com/composer", - "type": "github" + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2024-12-27T09:25:35+00:00" }, { - "name": "composer/semver", - "version": "3.4.3", + "name": "nette/schema", + "version": "v1.3.2", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "nette/utils": "^4.0", + "php": "8.1 - 8.4" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "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": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", "keywords": [ - "semantic", - "semver", - "validation", - "versioning" + "config", + "nette" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2024-10-06T23:10:23+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.5", + "name": "nette/utils", + "version": "v4.0.5", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "url": "https://github.com/nette/utils.git", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" }, "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Restarts a process without Xdebug.", + "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": [ - "Xdebug", - "performance" + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" ], "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" + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.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" + "time": "2024-08-07T15:39:19+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.2", + "name": "nikic/php-parser", + "version": "v5.4.0", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", - "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { - "php": ">=7.0" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^9 || ^6" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, "autoload": { "psr-4": { - "Evenement\\": "src/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Nikita Popov" } ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "A PHP parser written in PHP", "keywords": [ - "event-dispatcher", - "event-emitter" + "parser", + "php" ], "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/v3.0.2" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "time": "2023-08-08T05:53:35+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "name": "nunomaduro/termwind", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.1.8" }, "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" + "illuminate/console": "^11.33.2", + "laravel/pint": "^1.18.2", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^7.1.8", + "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": { - "Fidry\\CpuCoreCounter\\": "src/" + "Termwind\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2311,659 +2612,3163 @@ ], "authors": [ { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Tiny utility to get the number of CPU cores.", + "description": "Its like Tailwind CSS, but for the console.", "keywords": [ - "CPU", - "core" + "cli", + "console", + "css", + "package", + "php", + "style" ], "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" }, "funding": [ { - "url": "https://github.com/theofidry", + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", "type": "github" } ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2024-11-21T10:39:51+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.68.1", + "name": "phpoption/phpoption", + "version": "1.9.3", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff" + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b9db2b2ea3cdba7201067acee46f984ef2397cff", - "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", "shasum": "" }, "require": { - "clue/ndjson-react": "^1.0", - "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", - "ext-filter": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.2", - "php": "^7.4 || ^8.0", - "react/child-process": "^0.6.5", - "react/event-loop": "^1.0", - "react/promise": "^2.0 || ^3.0", - "react/socket": "^1.0", - "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.1 || ^6.0", - "symfony/console": "^5.4 || ^6.4 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", - "symfony/finder": "^5.4 || ^6.4 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", - "symfony/polyfill-mbstring": "^1.31", - "symfony/polyfill-php80": "^1.31", - "symfony/polyfill-php81": "^1.31", - "symfony/process": "^5.4 || ^6.4 || ^7.2", - "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.4", - "infection/infection": "^0.29.8", - "justinrainbow/json-schema": "^5.3 || ^6.0", - "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.7", - "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2", - "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0", - "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters." + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", "autoload": { "psr-4": { - "PhpCsFixer\\": "src/" - }, - "exclude-from-classmap": [ - "src/Fixer/Internal/*" - ] + "PhpOption\\": "src/PhpOption/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "Apache-2.0" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" }, { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "A tool to automatically fix PHP code style", + "description": "Option Type for PHP", "keywords": [ - "Static code analysis", - "fixer", - "standards", - "static analysis" + "language", + "option", + "php", + "type" ], "support": { - "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.1" + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" }, "funding": [ { - "url": "https://github.com/keradus", + "url": "https://github.com/GrahamCampbell", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" } ], - "time": "2025-01-17T09:20:36+00:00" + "time": "2024-07-20T21:41:07+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.12.1", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + "php": "^7.0 || ^8.0" }, "type": "library", "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "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": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "clock", + "now", + "psr", + "psr-20", + "time" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.4.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "php": ">=7.4.0" }, - "bin": [ - "bin/php-parse" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A PHP parser written in PHP", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "parser", - "php" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "phar-io/manifest", - "version": "2.0.4", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "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" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, + "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.7", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + }, + "time": "2024-12-10T01:58:33+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/console", + "version": "v7.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-11T03:49:26+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-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.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "6150b89186573046167796fa5f3f76601d5145f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8", + "reference": "6150b89186573046167796fa5f3f76601d5145f8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T08:50:44+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "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.5-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.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", + "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-30T19:00:17+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588", + "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-30T19:00:17+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306", + "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.2.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-31T14:59:40+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T15:21:05+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283", + "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.2.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T08:50:44+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "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.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T14:24:19+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T11:08:51+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "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.5-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.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/string", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "symfony/translation", + "version": "v7.2.2", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/symfony/translation.git", + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/symfony/translation/zipball/e2674a30132b7cc4d74540d6c2573aa363f05923", + "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" }, "type": "library", "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library for handling version information and constraints", + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "source": "https://github.com/symfony/translation/tree/v7.2.2" }, - "time": "2022-02-21T01:04:05+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T08:18:10+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "11.0.8", + "name": "symfony/translation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", - "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.3.1", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^11.5.0" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "3.5-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "coverage", - "testing", - "xunit" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-12-11T12:34:27+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "name": "symfony/uid", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "url": "https://github.com/symfony/uid.git", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "symfony/console": "^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", "keywords": [ - "filesystem", - "iterator" + "UID", + "ulid", + "uuid" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/symfony/uid/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2024-09-25T14:21:43+00:00" }, - { - "name": "phpunit/php-invoker", - "version": "5.0.1", + { + "name": "symfony/var-dumper", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "conflict": { + "symfony/console": "<6.4" }, - "suggest": { - "ext-pcntl": "*" + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", "keywords": [ - "process" + "debug", + "dump" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { - "name": "phpunit/php-text-template", - "version": "4.0.1", + "name": "tightenco/ziggy", + "version": "v2.5.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "url": "https://github.com/tighten/ziggy.git", + "reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/2b574ba281546884b7bdde6eefa451ba7e0b52f7", + "reference": "2b574ba281546884b7bdde6eefa451ba7e0b52f7", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-json": "*", + "laravel/framework": ">=9.0", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "laravel/folio": "^1.1", + "orchestra/testbench": "^7.0 || ^8.0 || ^9.0", + "pestphp/pest": "^2.26", + "pestphp/pest-plugin-laravel": "^2.4" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "4.0-dev" + "laravel": { + "providers": [ + "Tighten\\Ziggy\\ZiggyServiceProvider" + ] } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Tighten\\Ziggy\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Daniel Coulbourne", + "email": "daniel@tighten.co" + }, + { + "name": "Jake Bathman", + "email": "jake@tighten.co" + }, + { + "name": "Jacob Baker-Kretzmar", + "email": "jacob@tighten.co" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Use your Laravel named routes in JavaScript.", + "homepage": "https://github.com/tighten/ziggy", "keywords": [ - "template" + "Ziggy", + "javascript", + "laravel", + "routes" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "issues": "https://github.com/tighten/ziggy/issues", + "source": "https://github.com/tighten/ziggy/tree/v2.5.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-01-23T00:32:18+00:00" }, { - "name": "phpunit/php-timer", - "version": "7.0.1", + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-master": "2.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2971,90 +5776,64 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], + "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/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2024-12-21T16:25:41+00:00" }, { - "name": "phpunit/phpunit", - "version": "11.5.3", + "name": "vlucas/phpdotenv", + "version": "v5.6.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "30e319e578a7b5da3543073e30002bf82042f701" + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701", - "reference": "30e319e578a7b5da3543073e30002bf82042f701", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.8", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.2", - "sebastian/comparator": "^6.3.0", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.0", - "sebastian/version": "^5.0.2", - "staabm/side-effects-detector": "^1.0.5" + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "ext-filter": "Required to use the boolean validator." }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-main": "11.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] + "psr-4": { + "Dotenv\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3062,65 +5841,65 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", "keywords": [ - "phpunit", - "testing", - "xunit" + "dotenv", + "env", + "environment" ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.3" + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", "type": "tidelift" } ], - "time": "2025-01-13T09:36:00+00:00" + "time": "2024-07-20T21:52:34+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "voku/portable-ascii", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "voku\\": "src/voku/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3129,51 +5908,79 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "ascii", + "clean", + "php" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, - "time": "2021-11-05T16:47:00+00:00" + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=7.2.0" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3182,47 +5989,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Standard interfaces for event handling.", + "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ - "events", - "psr", - "psr-14" + "assert", + "check", + "validate" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2019-01-08T18:20:26+00:00" - }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ { - "name": "react/cache", - "version": "v1.2.0", + "name": "fakerphp/faker", + "version": "v1.24.1", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "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": { - "React\\Cache\\": "src/" + "Faker\\": "src/Faker/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3231,74 +6055,57 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "François Zaninotto" } ], - "description": "Async, Promise-based cache interface for ReactPHP", + "description": "Faker is a PHP library that generates fake data for you.", "keywords": [ - "cache", - "caching", - "promise", - "reactphp" + "data", + "faker", + "fixtures" ], "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.2.0" + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2022-11-30T15:59:55+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { - "name": "react/child-process", - "version": "v0.6.6", + "name": "filp/whoops", + "version": "2.16.0", "source": { "type": "git", - "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "url": "https://github.com/filp/whoops.git", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/event-loop": "^1.2", - "react/stream": "^1.4" + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/socket": "^1.16", - "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + "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": { - "React\\ChildProcess\\": "src/" + "Whoops\\": "src/Whoops/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3307,147 +6114,122 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" } ], - "description": "Event-driven library for executing child processes with ReactPHP.", + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", "keywords": [ - "event-driven", - "process", - "reactphp" + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" ], "support": { - "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.16.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/denis-sokolov", + "type": "github" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2024-09-25T12:00:00+00:00" }, { - "name": "react/dns", - "version": "v1.13.0", + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.7 || ^1.2.1" + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3 || ^2", - "react/promise-timer": "^1.11" + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" }, "type": "library", - "autoload": { - "psr-4": { - "React\\Dns\\": "src/" + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" } }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } + "BSD-3-Clause" ], - "description": "Async DNS resolver for ReactPHP", + "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" + "test" ], "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.13.0" + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2024-06-13T14:18:03+00:00" + "time": "2020-07-09T08:09:16+00:00" }, { - "name": "react/event-loop", - "version": "v1.5.0", + "name": "laravel/breeze", + "version": "v2.3.2", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "url": "https://github.com/laravel/breeze.git", + "reference": "2a4764055792b14e0e571a710adbda9c9eb300d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/laravel/breeze/zipball/2a4764055792b14e0e571a710adbda9c9eb300d4", + "reference": "2a4764055792b14e0e571a710adbda9c9eb300d4", "shasum": "" }, "require": { - "php": ">=5.3.0" + "illuminate/console": "^11.0", + "illuminate/filesystem": "^11.0", + "illuminate/support": "^11.0", + "illuminate/validation": "^11.0", + "php": "^8.2.0", + "symfony/console": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + "laravel/framework": "^11.0", + "orchestra/testbench-core": "^9.0", + "phpstan/phpstan": "^2.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Breeze\\BreezeServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "React\\EventLoop\\": "src/" + "Laravel\\Breeze\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3456,71 +6238,69 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.", "keywords": [ - "asynchronous", - "event-loop" + "auth", + "laravel" ], "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "issues": "https://github.com/laravel/breeze/issues", + "source": "https://github.com/laravel/breeze" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-11-13T13:48:05+00:00" + "time": "2025-01-21T14:57:42+00:00" }, { - "name": "react/promise", - "version": "v3.2.0", + "name": "laravel/pail", + "version": "v1.2.1", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "url": "https://github.com/laravel/pail.git", + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/laravel/pail/zipball/353ac12134b98e2e7c3333d916bd3e523931e583", + "reference": "353ac12134b98e2e7c3333d916bd3e523931e583", "shasum": "" }, "require": { - "php": ">=7.1.0" + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0", + "illuminate/contracts": "^10.24|^11.0", + "illuminate/log": "^10.24|^11.0", + "illuminate/process": "^10.24|^11.0", + "illuminate/support": "^10.24|^11.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" + "laravel/framework": "^10.24|^11.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.12|^9.0", + "pestphp/pest": "^2.20", + "pestphp/pest-plugin-type-coverage": "^2.3", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" + "Laravel\\Pail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3529,75 +6309,67 @@ ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", "keywords": [ - "promise", - "promises" + "laravel", + "logs", + "php", + "tail" ], "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2024-10-23T12:56:23+00:00" }, { - "name": "react/socket", - "version": "v1.16.0", + "name": "laravel/pint", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + "url": "https://github.com/laravel/pint.git", + "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "url": "https://api.github.com/repos/laravel/pint/zipball/53072e8ea22213a7ed168a8a15b96fbb8b82d44b", + "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.13", - "react/event-loop": "^1.2", - "react/promise": "^3.2 || ^2.6 || ^1.2.1", - "react/stream": "^1.4" + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4.3 || ^3.3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.11" + "friendsofphp/php-cs-fixer": "^3.66.0", + "illuminate/view": "^10.48.25", + "larastan/larastan": "^2.9.12", + "laravel-zero/framework": "^10.48.25", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^1.17.0", + "pestphp/pest": "^2.36.0" }, - "type": "library", + "bin": [ + "builds/pint" + ], + "type": "project", "autoload": { "psr-4": { - "React\\Socket\\": "src/" + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3606,73 +6378,65 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" + "format", + "formatter", + "lint", + "linter", + "php" ], "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.16.0" + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2024-07-26T10:38:09+00:00" + "time": "2025-01-14T16:20:53+00:00" }, { - "name": "react/stream", - "version": "v1.4.0", + "name": "laravel/sail", + "version": "v1.40.0", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + "url": "https://github.com/laravel/sail.git", + "reference": "237e70656d8eface4839de51d101284bd5d0cf71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", - "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "url": "https://api.github.com/repos/laravel/sail/zipball/237e70656d8eface4839de51d101284bd5d0cf71", + "reference": "237e70656d8eface4839de51d101284bd5d0cf71", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" + "illuminate/console": "^9.52.16|^10.0|^11.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0", + "illuminate/support": "^9.52.16|^10.0|^11.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" }, "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10" }, + "bin": [ + "bin/sail" + ], "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "React\\Stream\\": "src/" + "Laravel\\Sail\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3681,79 +6445,56 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "Docker files for running a basic Laravel application.", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "docker", + "laravel" ], "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.4.0" + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2024-06-11T12:45:25+00:00" + "time": "2025-01-13T16:57:11+00:00" }, { - "name": "sebastian/cli-parser", - "version": "3.0.2", + "name": "mockery/mockery", + "version": "1.6.12", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", "shasum": "" }, "require": { - "php": ">=8.2" + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3761,170 +6502,230 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "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": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "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" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" + "time": "2024-05-16T03:13:13+00:00" }, { - "name": "sebastian/code-unit", - "version": "3.0.2", + "name": "myclabs/deep-copy", + "version": "1.12.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", - "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { - "php": ">=8.2" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "phpunit/phpunit": "^11.5" + "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", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" } ], - "time": "2024-12-12T09:59:06+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", + "name": "nunomaduro/collision", + "version": "v8.5.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + "url": "https://github.com/nunomaduro/collision.git", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5", + "reference": "f5c101b929c958e849a633283adff296ed5f38f5", "shasum": "" }, "require": { - "php": ">=8.2" + "filp/whoops": "^2.16.0", + "nunomaduro/termwind": "^2.1.0", + "php": "^8.2.0", + "symfony/console": "^7.1.5" + }, + "conflict": { + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "larastan/larastan": "^2.9.8", + "laravel/framework": "^11.28.0", + "laravel/pint": "^1.18.1", + "laravel/sail": "^1.36.0", + "laravel/sanctum": "^4.0.3", + "laravel/tinker": "^2.10.0", + "orchestra/testbench-core": "^9.5.3", + "pestphp/pest": "^2.36.0 || ^3.4.0", + "sebastian/environment": "^6.1.0 || ^7.2.0" }, "type": "library", "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, "branch-alias": { - "dev-main": "4.0-dev" + "dev-8.x": "8.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2024-10-15T16:06:32+00:00" }, { - "name": "sebastian/comparator", - "version": "6.3.0", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", - "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.4" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.2-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -3938,69 +6739,52 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Volker Dusch", - "email": "github@wallbash.com" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/theseer", "type": "github" } ], - "time": "2025-01-06T10:28:19+00:00" + "time": "2024-03-03T12:33:53+00:00" }, { - "name": "sebastian/complexity", - "version": "4.0.1", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, "autoload": { "classmap": [ "src/" @@ -4011,52 +6795,69 @@ "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": "lead" + "role": "Developer" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "sebastian/diff", - "version": "6.0.2", + "name": "phpunit/php-code-coverage", + "version": "11.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118", + "reference": "418c59fd080954f8c4aa5631d9502ecda2387118", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.3.1", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^11.5.0" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -4070,26 +6871,22 @@ ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "coverage", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8" }, "funding": [ { @@ -4097,20 +6894,20 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2024-12-11T12:34:27+00:00" }, { - "name": "sebastian/environment", - "version": "7.2.0", + "name": "phpunit/php-file-iterator", + "version": "5.1.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { @@ -4119,13 +6916,10 @@ "require-dev": { "phpunit/phpunit": "^11.0" }, - "suggest": { - "ext-posix": "*" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4140,20 +6934,20 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "filesystem", + "iterator" ], "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -4161,34 +6955,36 @@ "type": "github" } ], - "time": "2024-07-03T04:54:44+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { - "name": "sebastian/exporter", - "version": "6.3.0", + "name": "phpunit/php-invoker", + "version": "5.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4203,35 +6999,19 @@ "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" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "export", - "exporter" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -4239,35 +7019,32 @@ "type": "github" } ], - "time": "2024-12-05T09:17:50+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { - "name": "sebastian/global-state", - "version": "7.0.2", + "name": "phpunit/php-text-template", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.2" }, "require-dev": { - "ext-dom": "*", "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4282,18 +7059,19 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "global state" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -4301,24 +7079,23 @@ "type": "github" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "3.0.1", + "name": "phpunit/php-timer", + "version": "7.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "nikic/php-parser": "^5.0", "php": ">=8.2" }, "require-dev": { @@ -4327,7 +7104,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -4346,12 +7123,15 @@ "role": "lead" } ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -4359,37 +7139,66 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "6.0.1", + "name": "phpunit/phpunit", + "version": "11.5.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "30e319e578a7b5da3543073e30002bf82042f701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701", + "reference": "30e319e578a7b5da3543073e30002bf82042f701", "shasum": "" }, "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "phpunit/php-code-coverage": "^11.0.8", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.2", + "sebastian/comparator": "^6.3.0", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.0", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, - "require-dev": { - "phpunit/phpunit": "^11.0" + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "11.5-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -4401,36 +7210,50 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.3" }, "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-01-13T09:36:00+00:00" }, { - "name": "sebastian/object-reflector", - "version": "4.0.1", + "name": "sebastian/cli-parser", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { @@ -4442,7 +7265,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4457,15 +7280,16 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { @@ -4473,32 +7297,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2024-07-03T04:41:36+00:00" }, { - "name": "sebastian/recursion-context", - "version": "6.0.2", + "name": "sebastian/code-unit", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", + "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4513,23 +7337,16 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2" }, "funding": [ { @@ -4537,32 +7354,32 @@ "type": "github" } ], - "time": "2024-07-03T05:10:34+00:00" + "time": "2024-12-12T09:59:06+00:00" }, { - "name": "sebastian/type", - "version": "5.1.0", + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", - "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4577,16 +7394,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -4594,29 +7410,39 @@ "type": "github" } ], - "time": "2024-09-17T13:12:04+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { - "name": "sebastian/version", - "version": "5.0.2", + "name": "sebastian/comparator", + "version": "6.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115", + "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.2-dev" } }, "autoload": { @@ -4631,16 +7457,32 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "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": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "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/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0" }, "funding": [ { @@ -4648,919 +7490,768 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2025-01-06T10:28:19+00:00" }, { - "name": "staabm/side-effects-detector", - "version": "1.0.5", + "name": "sebastian/complexity", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "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" + "phpunit/phpunit": "^11.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, "autoload": { "classmap": [ - "lib/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "description": "A static analysis tool to detect side effects in PHP code", - "keywords": [ - "static analysis" + "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/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { - "url": "https://github.com/staabm", + "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { - "name": "symfony/console", - "version": "v7.2.1", + "name": "sebastian/diff", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.1" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-12-11T03:49:26+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "name": "sebastian/environment", + "version": "7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "php": ">=8.2" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2024-07-03T04:54:44+00:00" }, { - "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "name": "sebastian/exporter", + "version": "6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "6.1-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "export", + "exporter" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-12-05T09:17:50+00:00" }, { - "name": "symfony/filesystem", - "version": "v7.2.0", + "name": "sebastian/global-state", + "version": "7.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "ext-dom": "*", + "phpunit/phpunit": "^11.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { - "name": "symfony/finder", - "version": "v7.2.2", + "name": "sebastian/lines-of-code", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { + "nikic/php-parser": "^5.0", "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "phpunit/phpunit": "^11.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "name": "sebastian/object-enumerator", + "version": "6.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "6.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "name": "sebastian/object-reflector", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "name": "sebastian/recursion-context", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-main": "6.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-07-03T05:10:34+00:00" }, { - "name": "symfony/process", - "version": "v7.2.0", + "name": "sebastian/type", + "version": "5.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", "shasum": "" }, "require": { "php": ">=8.2" }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.0" + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-11-06T14:24:19+00:00" + "time": "2024-09-17T13:12:04+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.1", + "name": "sebastian/version", + "version": "5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "php": ">=8.2" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "5.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { - "name": "symfony/stopwatch", - "version": "v7.2.2", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e46690d5b9d7164a6d061cab1e8d46141b9f49df", - "reference": "e46690d5b9d7164a6d061cab1e8d46141b9f49df", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/service-contracts": "^2.5|^3" + "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": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "lib/" ] }, "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": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.2" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/staabm", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-12-18T14:28:33+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "symfony/string", + "name": "symfony/yaml", "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "url": "https://github.com/symfony/yaml.git", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5572,26 +8263,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.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", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.0" }, "funding": [ { @@ -5607,7 +8290,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "theseer/tokenizer", @@ -5661,11 +8344,13 @@ } ], "aliases": [], - "minimum-stability": "alpha", + "minimum-stability": "stable", "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, - "platform": {}, + "platform": { + "php": "^8.2" + }, "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php new file mode 100644 index 00000000..f4672673 --- /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' => env('APP_TIMEZONE', 'UTC'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 00000000..0ba5d5d8 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 00000000..925f7d2e --- /dev/null +++ b/config/cache.php @@ -0,0 +1,108 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 00000000..125949ed --- /dev/null +++ b/config/database.php @@ -0,0 +1,173 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 00000000..3d671bd9 --- /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' => env('APP_URL').'/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/logging.php b/config/logging.php new file mode 100644 index 00000000..8d94292b --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 00000000..756305b3 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,116 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + '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(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 00000000..116bd8d0 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,112 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 00000000..27a36175 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'resend' => [ + 'key' => env('RESEND_KEY'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 00000000..f0b6541e --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 00000000..584104c9 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 00000000..05fb5d9e --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 00000000..b9c106be --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 00000000..425e7058 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000..d01a0ef2 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,23 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100755 index 1ba705d3..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,88 +0,0 @@ -services: - # Frontend Vue service - mythicalclient_frontend: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: mythicalclient_frontend - restart: unless-stopped - volumes: - - ./frontend:/app - - /app/node_modules - - ./frontend.conf:/etc/nginx/conf.d/default.conf - networks: - - mythicalclient_network - - # PHP Backend service with PHP-FPM - mythicalclient_backend: - build: - context: ./backend - dockerfile: Dockerfile - container_name: mythicalclient_backend - restart: unless-stopped - volumes: - - ./backend:/var/www/html - - ./backend/storage/packages:/var/www/html/storage/packages - depends_on: - - mythicalclient_database - - mythicalclient_redis - networks: - - mythicalclient_network - - # Main Nginx service - mythicalclient_nginx: - image: nginx:alpine - container_name: mythicalclient_nginx - restart: unless-stopped - ports: - - "9271:80" - volumes: - - ./backend:/var/www/html - - ./backend.conf:/etc/nginx/conf.d/default.conf - depends_on: - - mythicalclient_frontend - - mythicalclient_backend - networks: - - mythicalclient_network - - mythicalclient_database: - image: mariadb:latest - restart: unless-stopped - container_name: mythicalclient_database - volumes: - - ./dockerfiles/mariadb/data:/var/lib/mysql/ - env_file: - - ./backend/storage/.env - environment: - MARIADB_ROOT_PASSWORD: "superlongquiery!!password" - MARIADB_DATABASE: ${DATABASE_DATABASE} - MARIADB_USER: ${DATABASE_USER} - MARIADB_PASSWORD: ${DATABASE_PASSWORD} - healthcheck: - test: mariadb-admin ping - interval: 5s - timeout: 5s - retries: 20 - networks: - - mythicalclient_network - - mythicalclient_redis: - image: redis:7.0-alpine - container_name: mythicalclient_redis - restart: unless-stopped - command: redis-server --save 60 1 --loglevel notice --requirepass '${REDIS_PASSWORD}' - env_file: - - ./backend/storage/.env - environment: - REDIS_PASSWORD: ${REDIS_PASSWORD} - healthcheck: - test: redis-cli -a $$REDIS_PASSWORD ping | grep PONG - interval: 5s - timeout: 5s - retries: 20 - networks: - - mythicalclient_network - -networks: - mythicalclient_network: - driver: bridge diff --git a/frontend.conf b/frontend.conf deleted file mode 100755 index fcd2c37e..00000000 --- a/frontend.conf +++ /dev/null @@ -1,11 +0,0 @@ -server { - listen 80; - server_name localhost; - - root /usr/share/nginx/html; - index index.html; - - location / { - try_files $uri $uri/ /index.html; - } -} \ No newline at end of file diff --git a/frontend/.dockerignore b/frontend/.dockerignore deleted file mode 100755 index 30bc1627..00000000 --- a/frontend/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules \ No newline at end of file diff --git a/frontend/.editorconfig b/frontend/.editorconfig deleted file mode 100755 index ecea360f..00000000 --- a/frontend/.editorconfig +++ /dev/null @@ -1,6 +0,0 @@ -[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] -charset = utf-8 -indent_size = 2 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/frontend/.gitignore b/frontend/.gitignore deleted file mode 100755 index 8ee54e8d..00000000 --- a/frontend/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -.DS_Store -dist -dist-ssr -coverage -*.local - -/cypress/videos/ -/cypress/screenshots/ - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -*.tsbuildinfo diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json deleted file mode 100755 index 804552bd..00000000 --- a/frontend/.prettierrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "printWidth": 120, - "tabWidth": 4, - "useTabs": false, - "semi": true, - "singleQuote": true, - "jsxSingleQuote": true, - "endOfLine": "lf" -} \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile deleted file mode 100755 index 3dbbcda7..00000000 --- a/frontend/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -# Build stage -FROM node:20 as build-stage -WORKDIR /app -COPY package*.json ./ -RUN yarn install -COPY . . -RUN yarn run build - -# Production stage -FROM nginx:alpine -COPY --from=build-stage /app/dist /usr/share/nginx/html -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md deleted file mode 100755 index 0347e41d..00000000 --- a/frontend/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# frontend - -This template should help get you started developing with Vue 3 in Vite. - -## Recommended IDE Setup - -[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). - -## Type Support for `.vue` Imports in TS - -TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. - -## Customize configuration - -See [Vite Configuration Reference](https://vite.dev/config/). - -## Project Setup - -```sh -yarn -``` - -### Compile and Hot-Reload for Development - -```sh -yarn dev -``` - -### Type-Check, Compile and Minify for Production - -```sh -yarn build -``` - -### Lint with [ESLint](https://eslint.org/) - -```sh -yarn lint -``` diff --git a/frontend/env.d.ts b/frontend/env.d.ts deleted file mode 100755 index bf3f4829..00000000 --- a/frontend/env.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/// - -declare module '*.vue' { - import { DefineComponent } from 'vue'; - const component: DefineComponent<{}, {}, any>; - export default component; -} - -declare module '@vueuse/sound' { - export function useSound(url: string): { play: () => void }; -} - -declare module '*.yml' { - const content: any; - export default content; -} diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js deleted file mode 100755 index 95e0636d..00000000 --- a/frontend/eslint.config.js +++ /dev/null @@ -1,24 +0,0 @@ -import pluginVue from 'eslint-plugin-vue' -import vueTsEslintConfig from '@vue/eslint-config-typescript' -import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' - -export default [ - { - name: 'app/files-to-lint', - files: ['**/*.{ts,mts,tsx,vue}'], - }, - - { - name: 'app/files-to-ignore', - ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**', 'env.d.ts'], - }, - - ...pluginVue.configs['flat/essential'], - ...vueTsEslintConfig(), - skipFormatting, - { - rules: { - 'vue/multi-word-component-names': 'off', - }, - }, -] diff --git a/frontend/index.html b/frontend/index.html deleted file mode 100755 index 552808a1..00000000 --- a/frontend/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - MythicalClient - - - -
- - - - \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100755 index c1abd4a3..00000000 --- a/frontend/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.0", - "private": true, - "type": "module", - "scripts": { - "dev": "vite --host", - "build": "run-p type-check \"build-only {@}\" --", - "preview": "vite preview", - "build-only": "vite build", - "type-check": "vue-tsc --build --force", - "lint": "eslint . --fix", - "format": "prettier --write src/" - }, - "dependencies": { - "@tanstack/vue-table": "^8.20.5", - "@types/js-cookie": "^3.0.6", - "@vueuse/sound": "^2.0.1", - "axios": "^1.7.9", - "date-fns": "^4.1.0", - "js-cookie": "^3.0.5", - "lucide-vue-next": "^0.468.0", - "qrcode": "^1.5.4", - "vue": "^3.5.12", - "vue-i18n": "^10.0.5", - "vue-qrcode": "^2.2.2", - "vue-router": "^4.4.5", - "vue-sweetalert2": "^5.0.11", - "vue-turnstile": "^1.0.11" - }, - "devDependencies": { - "@modyfi/vite-plugin-yaml": "^1.1.0", - "@tsconfig/node22": "^22.0.0", - "@types/node": "^22.9.0", - "@vitejs/plugin-vue": "^5.1.4", - "@vitejs/plugin-vue-jsx": "^4.0.1", - "@vue/eslint-config-prettier": "^10.1.0", - "@vue/eslint-config-typescript": "^14.1.3", - "@vue/tsconfig": "^0.5.1", - "autoprefixer": "^10.4.20", - "eslint": "^9.14.0", - "eslint-plugin-vue": "^9.30.0", - "npm-run-all2": "^7.0.1", - "postcss": "^8.4.49", - "prettier": "^3.3.3", - "rollup-plugin-visualizer": "^5.12.0", - "tailwindcss": "^3.4.15", - "typescript": "~5.6.3", - "vite": "^5.4.12", - "vite-plugin-vue-devtools": "^7.5.4", - "vue-tsc": "^2.1.10" - } -} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js deleted file mode 100755 index 2e7af2b7..00000000 --- a/frontend/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/frontend/src/App.vue b/frontend/src/App.vue deleted file mode 100755 index 8a6c1aa4..00000000 --- a/frontend/src/App.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css deleted file mode 100755 index 0b75e16d..00000000 --- a/frontend/src/assets/main.css +++ /dev/null @@ -1,66 +0,0 @@ -/* ./src/index.css */ -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; - -@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); - -@layer base { - html { - font-family: 'Poppins', sans-serif; - } -} - -html, -body { - overscroll-behavior-y: none; -} - -/** - Tell the browser that this is a dark theme. -**/ -:root { - color-scheme: dark; -} - -/* Global Scrollbar Styles */ -::-webkit-scrollbar { - width: 10px; - height: 10px; -} - -::-webkit-scrollbar-track { - background: #1e1e2e; - border-radius: 5px; -} - -::-webkit-scrollbar-thumb { - background: #3f3f5f; - border-radius: 5px; - transition: background-color 0.3s ease; -} - -::-webkit-scrollbar-thumb:hover { - background: #8b5cf6; -} - -/* For Firefox */ -* { - scrollbar-width: thin; - scrollbar-color: #3f3f5f #1e1e2e; -} - -/* When the scrollbar is actively being used */ -::-webkit-scrollbar-thumb:active { - background: #9f7aea; -} - -/* Styling for horizontal scrollbars */ -::-webkit-scrollbar-corner { - background: #1e1e2e; -} - -/* Optional: Style for when the mouse is over the scrollable area */ -:hover::-webkit-scrollbar-thumb { - background: #4a4a6a; -} diff --git a/frontend/src/assets/sounds/error.mp3 b/frontend/src/assets/sounds/error.mp3 deleted file mode 100755 index f10b2cbffd3d9008693ed7718808f78c688f043a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30672 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 diff --git a/frontend/src/assets/sounds/success.mp3 b/frontend/src/assets/sounds/success.mp3 deleted file mode 100755 index 8d9a544a0105069943f778e7ce86b560900336f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12528 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 TY)*f_y8qAX?|0(=j?e!Ee_+a( diff --git a/frontend/src/components/admin/LayoutDashboard.vue b/frontend/src/components/admin/LayoutDashboard.vue deleted file mode 100755 index 8dc49963..00000000 --- a/frontend/src/components/admin/LayoutDashboard.vue +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - diff --git a/frontend/src/components/client/Auth/FormCard.vue b/frontend/src/components/client/Auth/FormCard.vue deleted file mode 100755 index 956ddc2a..00000000 --- a/frontend/src/components/client/Auth/FormCard.vue +++ /dev/null @@ -1,38 +0,0 @@ - - diff --git a/frontend/src/components/client/Auth/FormInput.vue b/frontend/src/components/client/Auth/FormInput.vue deleted file mode 100755 index 3a41dde4..00000000 --- a/frontend/src/components/client/Auth/FormInput.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - diff --git a/frontend/src/components/client/Dashboard/Account/Activities.vue b/frontend/src/components/client/Dashboard/Account/Activities.vue deleted file mode 100755 index 59d8e214..00000000 --- a/frontend/src/components/client/Dashboard/Account/Activities.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/Dashboard/Account/Billing.vue b/frontend/src/components/client/Dashboard/Account/Billing.vue deleted file mode 100755 index 3b368505..00000000 --- a/frontend/src/components/client/Dashboard/Account/Billing.vue +++ /dev/null @@ -1,209 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/Dashboard/Account/Layout.vue b/frontend/src/components/client/Dashboard/Account/Layout.vue deleted file mode 100755 index 70d749ef..00000000 --- a/frontend/src/components/client/Dashboard/Account/Layout.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/Dashboard/Account/Mails.vue b/frontend/src/components/client/Dashboard/Account/Mails.vue deleted file mode 100755 index b9ed497a..00000000 --- a/frontend/src/components/client/Dashboard/Account/Mails.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - diff --git a/frontend/src/components/client/Dashboard/Account/Security.vue b/frontend/src/components/client/Dashboard/Account/Security.vue deleted file mode 100755 index 280c84c6..00000000 --- a/frontend/src/components/client/Dashboard/Account/Security.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/Dashboard/Account/Settings.vue b/frontend/src/components/client/Dashboard/Account/Settings.vue deleted file mode 100755 index c12255c8..00000000 --- a/frontend/src/components/client/Dashboard/Account/Settings.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/Dashboard/Main/Announcements.vue b/frontend/src/components/client/Dashboard/Main/Announcements.vue deleted file mode 100755 index 63d308f8..00000000 --- a/frontend/src/components/client/Dashboard/Main/Announcements.vue +++ /dev/null @@ -1,392 +0,0 @@ - - - diff --git a/frontend/src/components/client/Dashboard/Main/BillingInfo.vue b/frontend/src/components/client/Dashboard/Main/BillingInfo.vue deleted file mode 100755 index 72164959..00000000 --- a/frontend/src/components/client/Dashboard/Main/BillingInfo.vue +++ /dev/null @@ -1,28 +0,0 @@ - - diff --git a/frontend/src/components/client/Dashboard/Main/Header.vue b/frontend/src/components/client/Dashboard/Main/Header.vue deleted file mode 100755 index b204b11b..00000000 --- a/frontend/src/components/client/Dashboard/Main/Header.vue +++ /dev/null @@ -1,26 +0,0 @@ - - diff --git a/frontend/src/components/client/Dashboard/Main/ProductList.vue b/frontend/src/components/client/Dashboard/Main/ProductList.vue deleted file mode 100755 index fc4f0240..00000000 --- a/frontend/src/components/client/Dashboard/Main/ProductList.vue +++ /dev/null @@ -1,48 +0,0 @@ - - diff --git a/frontend/src/components/client/Dashboard/Main/Stats.vue b/frontend/src/components/client/Dashboard/Main/Stats.vue deleted file mode 100755 index ad9a92b9..00000000 --- a/frontend/src/components/client/Dashboard/Main/Stats.vue +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/frontend/src/components/client/Dashboard/Main/SupportPin.vue b/frontend/src/components/client/Dashboard/Main/SupportPin.vue deleted file mode 100755 index 9598b94c..00000000 --- a/frontend/src/components/client/Dashboard/Main/SupportPin.vue +++ /dev/null @@ -1,74 +0,0 @@ - - diff --git a/frontend/src/components/client/Dashboard/Main/TicketList.vue b/frontend/src/components/client/Dashboard/Main/TicketList.vue deleted file mode 100755 index 6a9650bf..00000000 --- a/frontend/src/components/client/Dashboard/Main/TicketList.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/frontend/src/components/client/Dashboard/Main/UserInfo.vue b/frontend/src/components/client/Dashboard/Main/UserInfo.vue deleted file mode 100755 index 11ae2c50..00000000 --- a/frontend/src/components/client/Dashboard/Main/UserInfo.vue +++ /dev/null @@ -1,39 +0,0 @@ - - diff --git a/frontend/src/components/client/Errors/ErrorPage.vue b/frontend/src/components/client/Errors/ErrorPage.vue deleted file mode 100755 index db428dd9..00000000 --- a/frontend/src/components/client/Errors/ErrorPage.vue +++ /dev/null @@ -1,53 +0,0 @@ - - diff --git a/frontend/src/components/client/Layout.vue b/frontend/src/components/client/Layout.vue deleted file mode 100755 index 2003dc34..00000000 --- a/frontend/src/components/client/Layout.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/LayoutDashboard.vue b/frontend/src/components/client/LayoutDashboard.vue deleted file mode 100755 index 4a38b589..00000000 --- a/frontend/src/components/client/LayoutDashboard.vue +++ /dev/null @@ -1,254 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/layout/Footer.vue b/frontend/src/components/client/layout/Footer.vue deleted file mode 100755 index a8b00a7b..00000000 --- a/frontend/src/components/client/layout/Footer.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/frontend/src/components/client/layout/NotificationsDropdown.vue b/frontend/src/components/client/layout/NotificationsDropdown.vue deleted file mode 100755 index 73253c5c..00000000 --- a/frontend/src/components/client/layout/NotificationsDropdown.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/layout/ProfileDropdown.vue b/frontend/src/components/client/layout/ProfileDropdown.vue deleted file mode 100755 index 5c21c11c..00000000 --- a/frontend/src/components/client/layout/ProfileDropdown.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/layout/SearchModal.vue b/frontend/src/components/client/layout/SearchModal.vue deleted file mode 100755 index 51f55540..00000000 --- a/frontend/src/components/client/layout/SearchModal.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - diff --git a/frontend/src/components/client/layout/Sidebar.vue b/frontend/src/components/client/layout/Sidebar.vue deleted file mode 100755 index d5df50ce..00000000 --- a/frontend/src/components/client/layout/Sidebar.vue +++ /dev/null @@ -1,180 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/layout/TopNavBar.vue b/frontend/src/components/client/layout/TopNavBar.vue deleted file mode 100755 index e6ca0f20..00000000 --- a/frontend/src/components/client/layout/TopNavBar.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/frontend/src/components/client/ui/Card/CardComponent.vue b/frontend/src/components/client/ui/Card/CardComponent.vue deleted file mode 100755 index 03ea79be..00000000 --- a/frontend/src/components/client/ui/Card/CardComponent.vue +++ /dev/null @@ -1,28 +0,0 @@ - - diff --git a/frontend/src/components/client/ui/LoadingScreen.vue b/frontend/src/components/client/ui/LoadingScreen.vue deleted file mode 100755 index 90dd5a69..00000000 --- a/frontend/src/components/client/ui/LoadingScreen.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/ui/Modal.vue b/frontend/src/components/client/ui/Modal.vue deleted file mode 100755 index f70f6f91..00000000 --- a/frontend/src/components/client/ui/Modal.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/frontend/src/components/client/ui/Table/TableTanstack.vue b/frontend/src/components/client/ui/Table/TableTanstack.vue deleted file mode 100755 index 0d86a32f..00000000 --- a/frontend/src/components/client/ui/Table/TableTanstack.vue +++ /dev/null @@ -1,211 +0,0 @@ - - - diff --git a/frontend/src/components/client/ui/Table/ViewButton.vue b/frontend/src/components/client/ui/Table/ViewButton.vue deleted file mode 100755 index e2149eb3..00000000 --- a/frontend/src/components/client/ui/Table/ViewButton.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/frontend/src/components/client/ui/TextForms/SelectInput.vue b/frontend/src/components/client/ui/TextForms/SelectInput.vue deleted file mode 100755 index 0115c6da..00000000 --- a/frontend/src/components/client/ui/TextForms/SelectInput.vue +++ /dev/null @@ -1,145 +0,0 @@ - - - - - diff --git a/frontend/src/components/client/ui/TextForms/TextArea.vue b/frontend/src/components/client/ui/TextForms/TextArea.vue deleted file mode 100755 index 9cceeb41..00000000 --- a/frontend/src/components/client/ui/TextForms/TextArea.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/frontend/src/components/client/ui/TextForms/TextInput.vue b/frontend/src/components/client/ui/TextForms/TextInput.vue deleted file mode 100755 index db85092d..00000000 --- a/frontend/src/components/client/ui/TextForms/TextInput.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/frontend/src/locale/en.yml b/frontend/src/locale/en.yml deleted file mode 100755 index 9469ad86..00000000 --- a/frontend/src/locale/en.yml +++ /dev/null @@ -1,487 +0,0 @@ ---- -#-------------------------------------------------------------# -# -# Global Components -# -# @public -# -#-------------------------------------------------------------# -Components: - ErrorsPage: - Buttons: - GoBack: 'Go Back' - GoHome: 'Go Home' - Global: - Navigation: - Loading: 'Loading...' - Copy: - Title: 'Copied' - Success: 'Copied to clipboard just like a boss.' - Footer: 'Yay it worked ;)' - Error: 'An error occurred. Please try again later.' - Announcements: - Title: 'Announcements' - Card: - ReadMore: 'Read More' - Tickets: - title: 'Recent tickets' - viewMore: 'View more' - SupportPin: - title: 'Support PIN' - copy: 'Copy' - alerts: - success: - title: 'Success' - pin_success: 'Support PIN generated' - footer: 'Your support PIN has been generated' - error: - title: 'Error' - generic: 'An error occurred. Please try again later' - footer: 'Please contact support for assistance' - -#-------------------------------------------------------------# -# -# Auth Pages (/auth/*) -# -# @public -# -#-------------------------------------------------------------# -dashboard: - title: Dashboard - -auth: - logic: - errors: - footer: Please contact support for assistance - title: Session Error - expired: Your session has expired - pages: - sso: - page: - title: Single Sign-On - subTitle: Single Sign-On - form: - name: - label: Domain name - placeholder: Organization Name - description: This is an Enterprise feature. Please make sure you enter your company name or domain name. - login_button: - label: Login - loading: Redirecting... - normal_login: - label: Not a organization or domain? - link: Login - login: - components: - form: - support_center: Support Center - alerts: - success: - title: Success - login_success: You have successfully logged in - footer: Welcome back! - error: - title: Login Error - missing_fields: Please fill in all fields - invalid_credentials: Invalid credentials - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - not_verified: Your email is not verified yet - banned: Your account was permanently banned - deleted: Your account was deleted either by you or an admin - page: - title: Login - subTitle: Login in to your account - form: - email: - label: Email or Username - placeholder: Enter your email or username - password: - label: Password - placeholder: Enter your password - forgot_password: Forgot password? - login_button: - label: Login - loading: Logging in... - register: - label: Don't have an account? - link: Register - register: - alerts: - success: - title: Success - register_success: You have successfully registered - footer: Thanks for choosing us! - error: - title: Registration Failed - csrf_error: CSRF token mismatch - username_exists: Username already exists - email_exists: Email already exists - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - page: - title: Register - subTitle: Create a new account - form: - email: - label: Email - placeholder: Enter your email - firstName: - label: First Name - placeholder: Enter your first name - lastName: - label: Last Name - placeholder: Enter your last name - username: - label: Username - placeholder: Enter your username - password: - label: Password - placeholder: Enter your password - confirm_password: - label: Confirm Password - placeholder: Confirm your password - register_button: - label: Register - loading: Registering... - login: - label: Already have an account? - link: Login - forgot_password: - alerts: - success: - title: Success - reset_success: Password reset link sent - footer: Check your email! - error: - title: Error - missing_fields: Please fill in all fields - email_not_found: Email not found - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - page: - title: Forgot Password - subTitle: Reset your password - form: - email: - label: Email - placeholder: Enter your email - reset_button: - label: Reset Password - loading: Sending reset link... - login: - label: Remembered your password? - link: Login - twofactor_verify: - alerts: - success: - title: Success - verify_success: Two Factor Authentication verified - footer: You have successfully verified Two Factor Authentication - error: - title: Error - missing_fields: Please fill in all fields - invalid_code: Invalid code - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - page: - title: Two Factor Authentication - subTitle: Verify Two Factor Authentication - form: - code: - label: Code - placeholder: Enter the code from your authenticator app - verify_button: - label: Verify - loading: Verifying... - twofactor_setup: - alerts: - success: - title: Success - setup_success: Two Factor Authentication setup - footer: You have successfully setup Two Factor Authentication - error: - title: Error - missing_fields: Please fill in all fields - invalid_code: Invalid code - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - page: - title: Two Factor Authentication - subTitle: Setup Two Factor Authentication - form: - secret: - label: Secret - placeholder: Here is your secret key - code: - label: Code - placeholder: Enter the code from your authenticator app - setup_button: - label: Setup - loading: Setting up... - reset_password: - alerts: - success: - title: Success - reset_success: We have successfully reset your password - footer: Check your email! - error: - title: Error - missing_fields: Please fill in all fields - passwords_mismatch: Passwords do not match - generic: An error occurred. Please try again later - cloudflare_error: You have been blocked by Cloudflare Turnstile - footer: Please contact support for assistance - invalid_code: Invalid reset code - page: - title: Reset Password - subTitle: Reset your password - form: - password_new: - label: New Password - placeholder: Enter your new password - password_confirm: - label: Confirm Password - placeholder: Confirm your new password - reset_button: - label: Reset Password - loading: Applying changes... - login: - label: Remembered your password? - link: Login -#-------------------------------------------------------------# -# -# Global Errors Pages -# -# @public -# -#-------------------------------------------------------------# -errors: - forbidden: - title: 403 Forbidden - message: >- - Hold it right there, space traveler! You don't have the necessary - clearance to access this area. - notfound: - title: 404 Not Found - message: >- - We couldn't find the page you were looking for. It may have been moved or - deleted. - servererror: - title: 500 Server Error - message: An error occurred on our end. Please try again later. -#-------------------------------------------------------------# -# -# Account Settings (/account/*) -# -# @public -# -#-------------------------------------------------------------# -account: - pages: - tickets: - title: Tickets - actions: - newTicket: 'Tickets' - view: 'View' - alerts: - error: - generic: 'An error occurred. Please try again later' - table: - title: 'Tickets' - subject: 'Subject' - status: 'Status' - priority: 'Priority' - department: 'Department' - created: 'Created' - actions: 'Actions' - noTickets: 'No tickets found' - create_ticket: - title: 'New Ticket' - subTitle: 'Create a new ticket' - form: - service: 'Related Service (if any)' - subject: 'Subject' - department: 'Department' - priority: 'Priority' - message: 'Message' - submit: 'Submit' - loading: 'Submitting...' - reset: 'Reset' - back: 'Back' - types: - priority: - low: 'Low' - medium: 'Medium' - high: 'High' - urgent: 'Urgent' - alerts: - success: - title: 'Success' - ticket_success: 'Ticket created' - footer: 'Your ticket has been created' - error: - title: 'Error' - generic: 'An error occurred. Please try again later' - footer: 'Please contact support for assistance' - department_not_found: 'Department not found' - department_id_missing: 'Department ID is missing' - message_missing: 'Message is missing' - subject_missing: 'Subject is missing' - limit_reached: 'You have reached the limit of tickets you can create' - failed_to_create_ticket: 'Cluster is down, try again later' - settings: - alerts: - success: - title: Success - update_success: Account settings updated - footer: Your account settings have been updated - error: - title: Error - generic: An error occurred. Please try again later - email: Email already exists - footer: Please contact support for assistance - page: - title: Account - subTitle: Manage your account settings - form: - email: - label: Email - firstName: - label: First Name - lastName: - label: Last Name - avatar: - label: Avatar - background: - label: Background - update_button: - label: Save Changes - reset: Reset - delete: - title: 'Deactivate Account' - subTitle: 'Once you deactivate your account, there is no going back. Please be certain.' - # You can not add more than 3 lines! - lines: - - 'Once you deactivate your account, there is no going back. Please be certain.' - - 'Once you delete your account, there is a 30 days window for you to contact support to recover your account. After 30 days, your account will be permanently disabled.' - - 'This means that your account will be marked as deleted BUT we reserve the right to keep all the data for legal reasons. You may open a ticket for your data to be anonymized due to GDPR!' - button: - label: Deactivate Account - loading: Deactivating... - billing: - alerts: - success: - title: Success - update_success: Billing information updated - footer: Your billing information has been updated - error: - title: Error - generic: An error occurred. Please try again later - footer: Please contact support for assistance - page: - title: Billing - subTitle: Manage your billing information - form: - company_name: - label: Company Name - vat_id: - label: VAT ID - address: - label: Address - city: - label: City - state: - label: State - zip: - label: Zip - country: - label: Country - address2: - label: Address 2 - update_button: - label: Update - reset: Reset - emails: - alerts: - success: - title: Success - update_success: Email preferences updated - footer: Your email preferences have been updated - error: - title: Error - generic: An error occurred. Please try again later - footer: Please contact support for assistance - page: - title: Emails - subTitle: See your emails! - table: - columns: - id: ID - subject: Subject - date: Date - from: From - actions: Actions - empty: No emails found - results: - viewButton: View - security: - alerts: - success: - title: Success - update_success: Security settings updated - footer: Your security settings have been updated - error: - title: Error - generic: An error occurred. Please try again later - footer: Please contact support for assistance - page: - title: Security - subTitle: Manage your security settings - cards: - twofactor: - title: Two-Factor Authentication (2FA) - subTitle: You want to be sure your account will not be stolen? - enable_button: - description: '2FA is currently disabled. Enable it to secure your account.' - label: Enable - loading: Enabling... - disable_button: - description: '2FA is currently enabled. Disable it to put your account into a less secure state.' - label: Disable - loading: Disabling... - password: - title: Change your password - subTitle: You want to change the password of your account? - change_button: - label: Change Password - loading: Changing... - activity: - page: - title: Activity - subTitle: See your activity! - table: - columns: - action: Action - date: Date - ip: IP - error: An error occurred while fetching your activity - results: - viewButton: View - -components: - sidebar: - dashboard: Dashboard - tickets: Tickets - eula: EULA - announcements: Announcements - addons: Addons - logs: Logs - settings: Settings - users: Users - apikeys: API Keys diff --git a/frontend/src/main.ts b/frontend/src/main.ts deleted file mode 100755 index 7676d644..00000000 --- a/frontend/src/main.ts +++ /dev/null @@ -1,27 +0,0 @@ -import './assets/main.css'; - -import { createApp } from 'vue'; -import App from './App.vue'; -import router from './router'; -import VueSweetalert2 from 'vue-sweetalert2'; -import { createI18n } from 'vue-i18n'; -import EN from '@/locale/en.yml'; -import Settings from '@/mythicalclient/Settings'; -import 'sweetalert2/dist/sweetalert2.min.css'; - -const app = createApp(App); - -app.use(router); -app.use(VueSweetalert2); - -const i18n = createI18n({ - locale: 'EN', - messages: { - EN: EN, - }, -}); -app.use(i18n); - -Settings.initializeSettings(); - -app.mount('#app'); diff --git a/frontend/src/mythicalclient/Activities.ts b/frontend/src/mythicalclient/Activities.ts deleted file mode 100755 index 2c871eb1..00000000 --- a/frontend/src/mythicalclient/Activities.ts +++ /dev/null @@ -1,16 +0,0 @@ -class Activities { - /** - * Get the activities for the current session - * - * @returns The response from the server - */ - public static async get() { - const response = await fetch('/api/user/session/activities', { - method: 'GET', - }); - const data = await response.json(); - return data.activities; - } -} - -export default Activities; diff --git a/frontend/src/mythicalclient/Announcements.ts b/frontend/src/mythicalclient/Announcements.ts deleted file mode 100755 index e5fb3c42..00000000 --- a/frontend/src/mythicalclient/Announcements.ts +++ /dev/null @@ -1,16 +0,0 @@ -class Announcements { - /** - * Fetch announcements from the API - * - * @returns The announcements data - */ - static async fetchAnnouncements() { - const response = await fetch('/api/user/announcements', { - method: 'GET', - }); - const data = await response.json(); - return data.announcements; - } -} - -export default Announcements; diff --git a/frontend/src/mythicalclient/Auth.ts b/frontend/src/mythicalclient/Auth.ts deleted file mode 100755 index 640d6288..00000000 --- a/frontend/src/mythicalclient/Auth.ts +++ /dev/null @@ -1,265 +0,0 @@ -/* --------------------------- - * Author: NaysKutzu Date: 2025-11-29 - * - * Changes: - * - Initial commit - * - Added support for billing update - * - * ---------------------------*/ -/* --------------------------- - * Author: NaysKutzu Date: 2025-12-01 - * - * Changes: - * - Added support for changing the user info! - * - * ---------------------------*/ - -/* --------------------------- - * Author: NaysKutzu Date: 2025-12-07 - * - * Changes: - * - Add support for 2fa! - * - * - * ---------------------------*/ -class Auth { - /** - * Logs the user in - * - * @param email The email to log in with - * @param turnstileResponse The turnstile response - * - * @returns The response from the server - */ - static async forgotPassword(email: string, turnstileResponse: string) { - const response = await fetch('/api/user/auth/forgot', { - method: 'POST', - body: new URLSearchParams({ - email: email, - turnstileResponse: turnstileResponse, - }), - }); - const data = await response.json(); - return data; - } - - /** - * Resets the password - * - * @param confirmPassword The password to confirm - * @param password The new password - * @param resetCode The reset code - * @param turnstileResponse The turnstile response - * - * @returns The response from the server - */ - static async resetPassword( - confirmPassword: string, - password: string, - resetCode: string, - turnstileResponse: string, - ) { - const response = await fetch('/api/user/auth/reset', { - method: 'POST', - body: new URLSearchParams({ - password: password, - confirmPassword: confirmPassword, - email_code: resetCode || '', - turnstileResponse: turnstileResponse, - }), - }); - const data = await response.json(); - return data; - } - - /** - * Verifies the login token - * - * @param code The code to verify - * - * @returns The response from the server - */ - static async isLoginVerifyTokenValid(code: string) { - const response = await fetch(`/api/user/auth/reset?code=${code}`, { - method: 'GET', - }); - const data = await response.json(); - return data; - } - - /** - * Registers the user - * - * @param firstName The first name - * @param lastName The last name - * @param email The email - * @param username The username - * @param password The password - * @param turnstileResponse The turnstile response - * - * @returns The response from the server - */ - static async register( - firstName: string, - lastName: string, - email: string, - username: string, - password: string, - turnstileResponse: string, - ) { - const response = await fetch('/api/user/auth/register', { - method: 'POST', - body: new URLSearchParams({ - firstName: firstName, - lastName: lastName, - email: email, - username: username, - password: password, - turnstileResponse: turnstileResponse, - }), - }); - const data = await response.json(); - return data; - } - /** - * Logs the user in - * - * @param login The users email or username - * @param password The users password - * @param turnstileResponse The turnstile response - * - * @returns - */ - static async login(login: string, password: string, turnstileResponse: string) { - const response = await fetch('/api/user/auth/login', { - method: 'POST', - body: new URLSearchParams({ - login: login, - password: password, - turnstileResponse: turnstileResponse, - }), - }); - const data = await response.json(); - return data; - } - - /** - * Update the users billing information - * - * @param company_name The company name - * @param vat_number The vat number - * @param address1 The address line 1 - * @param address2 The address line 2 - * @param city The city - * @param country The country - * @param state The state - * @param postcode The postcode - * - * @returns - */ - static async updateBilling( - company_name: string, - vat_number: string, - address1: string, - address2: string, - city: string, - country: string, - state: string, - postcode: string, - ) { - const response = await fetch('/api/user/session/billing/update', { - method: 'POST', - body: new URLSearchParams({ - company_name: company_name, - vat_number: vat_number, - address1: address1, - address2: address2, - city: city, - country: country, - state: state, - postcode: postcode, - }), - }); - const data = await response.json(); - return data; - } - - /** - * Update the users info - * - * @param first_name The first name - * @param last_name The last name - * @param email The email - * @param avatar The avatar - * @param background The background - * - * @returns - */ - static async updateUserInfo( - first_name: string, - last_name: string, - email: string, - avatar: string, - background: string, - ) { - const response = await fetch('/api/user/session/info/update', { - method: 'POST', - body: new URLSearchParams({ - first_name: first_name, - last_name: last_name, - email: email, - avatar: avatar, - background: background, - }), - }); - const data = await response.json(); - return data; - } - /** - * Setup 2fa - * - * @returns - */ - static async getTwoFactorSecret() { - const response = await fetch('/api/user/auth/2fa/setup', { - method: 'GET', - }); - const data = await response.json(); - return data; - } - - /** - * Verify 2fa - * - * @param code The code - * - * @returns - */ - static async verifyTwoFactor(code: string, turnstileResponse: string) { - const response = await fetch('/api/user/auth/2fa/setup', { - method: 'POST', - body: new URLSearchParams({ - code: code, - turnstileResponse: turnstileResponse, - }), - }); - const data = await response.json(); - return data; - } - - /** - * - * Reset the support pin! - * - * @returns The new pin - */ - static async resetPin(): Promise { - const response = await fetch('/api/user/session/newPin', { - method: 'POST', - }); - const data = await response.json(); - return parseInt(data.pin, 10); - } -} - -export default Auth; diff --git a/frontend/src/mythicalclient/Mails.ts b/frontend/src/mythicalclient/Mails.ts deleted file mode 100755 index 9fe73f59..00000000 --- a/frontend/src/mythicalclient/Mails.ts +++ /dev/null @@ -1,16 +0,0 @@ -class Mails { - /** - * Get the Mails for the current session - * - * @returns The response from the server - */ - public static async get() { - const response = await fetch('/api/user/session/emails', { - method: 'GET', - }); - const data = await response.json(); - return data.emails; - } -} - -export default Mails; diff --git a/frontend/src/mythicalclient/Permissions.ts b/frontend/src/mythicalclient/Permissions.ts deleted file mode 100755 index c6c0338f..00000000 --- a/frontend/src/mythicalclient/Permissions.ts +++ /dev/null @@ -1,3 +0,0 @@ -class Permissions {} - -export default Permissions; diff --git a/frontend/src/mythicalclient/Session.ts b/frontend/src/mythicalclient/Session.ts deleted file mode 100755 index 99c23a48..00000000 --- a/frontend/src/mythicalclient/Session.ts +++ /dev/null @@ -1,73 +0,0 @@ -import router from '@/router'; -import Swal from 'sweetalert2'; -import Settings from '@/mythicalclient/Settings'; -import { useI18n } from 'vue-i18n'; - -class Session { - static sessionData = {}; - - static isSessionValid() { - const cookies = document.cookie.split(';'); - for (const cookie of cookies) { - const [name, value] = cookie.trim().split('='); - if (name === 'user_token' && value) { - return true; - } - } - return false; - } - - static getInfo(key: string) { - const item = localStorage.getItem(key); - return item ? JSON.parse(item) : null; - } - - static async startSession() { - const { t } = useI18n(); - const updateSessionInfo = async () => { - try { - const response = await fetch('/api/user/session'); - const data = await response.json(); - if (data.success) { - const { user_info } = data; - const { billing } = data; - for (const [key, value] of Object.entries(user_info)) { - localStorage.setItem(key, JSON.stringify(value)); - } - for (const [key, value] of Object.entries(billing)) { - localStorage.setItem(key, JSON.stringify(value)); - } - } else { - if (Session.isSessionValid()) { - Settings.initializeSettings(); - if (data.error_code == 'TW0_FA_BLOCKED') { - router.push('/auth/2fa/verify'); - } else { - Swal.fire({ - title: t('auth.logic.errors.title'), - text: t('auth.logic.errors.expired'), - footer: t('auth.logic.errors.footer'), - icon: 'error', - confirmButtonText: 'OK', - }); - router.push('/auth/login'); - } - } else { - console.warn('Session is not valid'); - } - } - } catch (error) { - console.error('Error fetching session:', error); - throw error; - } - }; - - // Initial session start - await updateSessionInfo(); - - // Update session info every 1 minute - setInterval(updateSessionInfo, 60000); - } -} - -export default Session; diff --git a/frontend/src/mythicalclient/Settings.ts b/frontend/src/mythicalclient/Settings.ts deleted file mode 100755 index c70ec4ee..00000000 --- a/frontend/src/mythicalclient/Settings.ts +++ /dev/null @@ -1,95 +0,0 @@ -class Settings { - static settings = {}; - - static async grabSettings() { - try { - const response = await fetch('/api/system/settings'); - const data = await response.json(); - if (data.success) { - Settings.settings = data.settings; - return Settings.settings; - } else { - throw new Error(data.message || 'Failed to fetch settings'); - } - } catch (error) { - console.error('Error fetching settings:', error); - throw error; - } - } - - static async grabCore() { - try { - const response = await fetch('/api/system/settings'); - const data = await response.json(); - if (data.success) { - return data.core; - } else { - throw new Error(data.message || 'Failed to fetch core'); - } - } catch (error) { - console.error('Error fetching core:', error); - throw error; - } - } - static async initializeSettings() { - const response = await fetch('/api/system/settings'); - if (response.status === 503) { - document.body.innerHTML = ` -

-
-

Rate Limited

-

You have been rate limited. Please try again later.

- -
-
- `; - return; - } - try { - const fetchedSettings = await Settings.grabSettings(); - const fetchedCore = await Settings.grabCore(); - console.log('Settings fetched:', fetchedSettings); - console.log('Core fetched:', fetchedCore); - for (const [key, value] of Object.entries(fetchedSettings)) { - localStorage.setItem(key, JSON.stringify(value)); - } - - for (const [key, value] of Object.entries(fetchedCore)) { - localStorage.setItem(key, JSON.stringify(value)); - } - } catch (error) { - console.error('Failed to initialize settings:', error); - document.body.innerHTML = ` -
-
-

We are so sorry

-

Our backend is down at this moment :(

- -
-
- `; - } - } - - static getSetting(key: string) { - const appName = localStorage.getItem('app_name'); - if (!appName) { - // Display loading animation - const loadingElement = document.createElement('div'); - loadingElement.id = 'loading-animation'; - loadingElement.innerHTML = '

Loading...

'; - document.body.appendChild(loadingElement); - - // Fetch settings synchronously - Settings.initializeSettings(); - - // Remove loading animation - document.body.removeChild(loadingElement); - } else { - const item = localStorage.getItem(key); - return item ? JSON.parse(item) : 'Fetching settings...'; - } - } -} - -export default Settings; diff --git a/frontend/src/mythicalclient/StorageMonitor.ts b/frontend/src/mythicalclient/StorageMonitor.ts deleted file mode 100755 index 43b22503..00000000 --- a/frontend/src/mythicalclient/StorageMonitor.ts +++ /dev/null @@ -1,90 +0,0 @@ -import Swal from 'sweetalert2'; - -class StorageMonitor { - private localStorageKey = 'storageMonitorKey'; - private sessionStorageKey = 'sessionStorageMonitorKey'; - private cookieName = 'cookieMonitor'; - - constructor() { - this.init(); - } - - private init() { - this.setInitialValues(); - this.monitorLocalStorage(); - this.monitorSessionStorage(); - this.monitorCookies(); - } - - private setInitialValues() { - if (!localStorage.getItem(this.localStorageKey)) { - localStorage.setItem(this.localStorageKey, 'initialized'); - } - if (!sessionStorage.getItem(this.sessionStorageKey)) { - sessionStorage.setItem(this.sessionStorageKey, 'initialized'); - } - if (!this.getCookie(this.cookieName)) { - this.setCookie(this.cookieName, 'initialized', 365); - } - } - - private monitorLocalStorage() { - window.addEventListener('storage', (event) => { - if (event.key === null || (event.key === this.localStorageKey && event.newValue === null)) { - this.alertAndReload('Local Storage'); - } - }); - } - - private monitorSessionStorage() { - setInterval(() => { - if (!sessionStorage.getItem(this.sessionStorageKey)) { - this.alertAndReload('Session Storage'); - } - }, 1000); - } - - private monitorCookies() { - setInterval(() => { - if (!this.getCookie(this.cookieName)) { - this.alertAndReload('Cookies'); - } - }, 1000); - } - - private alertAndReload(storageType: string) { - Swal.fire({ - title: 'Security Alert', - text: `We have detected a potential security threat in your ${storageType}. The page will now reload.`, - icon: 'warning', - showConfirmButton: false, - timer: 5000, - willOpen: () => { - Swal.showLoading(); - }, - }); - setTimeout(() => { - window.location.reload(); - }, 5000); - } - - private setCookie(name: string, value: string, days: number) { - const date = new Date(); - date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); - const expires = `expires=${date.toUTCString()}`; - document.cookie = `${name}=${value};${expires};path=/`; - } - - private getCookie(name: string) { - const nameEQ = `${name}=`; - const ca = document.cookie.split(';'); - for (let i = 0; i < ca.length; i++) { - let c = ca[i]; - while (c.charAt(0) === ' ') c = c.substring(1, c.length); - if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); - } - return null; - } -} - -export default StorageMonitor; diff --git a/frontend/src/mythicalclient/Tickets.ts b/frontend/src/mythicalclient/Tickets.ts deleted file mode 100755 index 321d9fc5..00000000 --- a/frontend/src/mythicalclient/Tickets.ts +++ /dev/null @@ -1,38 +0,0 @@ -class Tickets { - public static async getTicketCreateInfo() { - const response = await fetch('/api/user/ticket/create', { - method: 'GET', - }); - const data = await response.json(); - return data; - } - static async createTicket( - department_id: number, - subject: string, - message: string, - priority: string, - service: number, - ) { - const response = await fetch('/api/user/ticket/create', { - method: 'POST', - body: new URLSearchParams({ - department_id: department_id.toString(), - subject: subject, - message: message, - priority: priority, - service: service.toString() || '', - }), - }); - const data = await response.json(); - return data; - } - static async getTickets() { - const response = await fetch('/api/user/ticket/list', { - method: 'GET', - }); - const data = await response.json(); - return data; - } -} - -export default Tickets; diff --git a/frontend/src/mythicalclient/Translation.ts b/frontend/src/mythicalclient/Translation.ts deleted file mode 100755 index 98d4567d..00000000 --- a/frontend/src/mythicalclient/Translation.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useI18n } from 'vue-i18n'; - -class Translation { - static getTranslation(key: string): string { - const { t } = useI18n(); - return t(key); - } -} - -export default Translation; diff --git a/frontend/src/mythicalclient/admin/Dashboard.ts b/frontend/src/mythicalclient/admin/Dashboard.ts deleted file mode 100755 index 169c7ec9..00000000 --- a/frontend/src/mythicalclient/admin/Dashboard.ts +++ /dev/null @@ -1,15 +0,0 @@ -class Dashboard { - /** - * Get the dashboard data - * - * @returns - */ - public static async get() { - const response = await fetch('/api/admin', { - method: 'GET', - }); - return await response.json(); - } -} - -export default Dashboard; diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts deleted file mode 100755 index 0da1fb97..00000000 --- a/frontend/src/router/index.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { createRouter, createWebHistory } from 'vue-router'; - -const routes = [ - { - path: '/auth/login', - name: 'Login', - component: () => import('@/views/client/auth/Login.vue'), - }, - { - path: '/auth/register', - name: 'Register', - component: () => import('@/views/client/auth/Register.vue'), - }, - { - path: '/auth/forgot-password', - name: 'Forgot Password', - component: () => import('@/views/client/auth/ForgotPassword.vue'), - }, - { - path: '/auth/reset-password', - name: 'Reset Password', - component: () => import('@/views/client/auth/ResetPassword.vue'), - }, - { - path: '/auth/2fa/setup', - name: 'Two Factor Setup', - component: () => import('@/views/client/auth/TwoFactorSetup.vue'), - }, - { - path: '/errors/403', - name: 'Forbidden', - component: () => import('@/views/client/errors/Forbidden.vue'), - }, - { - path: '/errors/500', - name: 'ServerError', - component: () => import('@/views/client/errors/ServerError.vue'), - }, - { - path: '/dashboard', - name: 'Dashboard', - component: () => import('@/views/client/Home.vue'), - }, - { - path: '/account', - name: 'Account', - component: () => import('@/views/client/Account.vue'), - }, - { - path: '/ticket', - name: 'Ticket', - component: () => import('@/views/client/ticket/List.vue'), - }, - { - path: '/ticket/create', - name: 'Create Ticket', - component: () => import('@/views/client/ticket/Create.vue'), - }, - { - path: '/ticket/:id', - name: 'Ticket Detail', - component: () => import('@/views/client/ticket/[id].vue'), - }, - { - path: '/auth/sso', - name: 'SSO', - component: () => import('@/views/client/auth/sso.vue'), - }, - { - path: '/auth/2fa/setup/disband', - redirect: () => { - window.location.href = '/api/auth/2fa/setup/kill'; - return '/api/auth/2fa/setup/kill'; - }, - }, - { - path: '/auth/logout', - redirect: () => { - window.location.href = '/api/user/auth/logout'; - return '/api/user/auth/logout'; - }, - }, - { - path: '/auth/2fa/verify', - name: 'Two Factor Verify', - component: () => import('@/views/client/auth/TwoFactorVerify.vue'), - }, - { - path: '/', - redirect: '/dashboard', - }, - { - path: '/mc-admin', - name: 'Admin Home', - component: () => import('@/views/admin/Home.vue'), - }, -]; - -routes.push({ - path: '/:pathMatch(.*)*', - name: 'NotFound', - component: () => import('@/views/client/errors/NotFound.vue'), -}); - -const router = createRouter({ - history: createWebHistory(), - routes, -}); - -export default router; diff --git a/frontend/src/views/admin/Home.vue b/frontend/src/views/admin/Home.vue deleted file mode 100755 index 6072165b..00000000 --- a/frontend/src/views/admin/Home.vue +++ /dev/null @@ -1,70 +0,0 @@ - - diff --git a/frontend/src/views/client/Account.vue b/frontend/src/views/client/Account.vue deleted file mode 100755 index c5bcbc90..00000000 --- a/frontend/src/views/client/Account.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - - - diff --git a/frontend/src/views/client/Home.vue b/frontend/src/views/client/Home.vue deleted file mode 100755 index 1e970d18..00000000 --- a/frontend/src/views/client/Home.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/frontend/src/views/client/auth/ForgotPassword.vue b/frontend/src/views/client/auth/ForgotPassword.vue deleted file mode 100755 index 51337098..00000000 --- a/frontend/src/views/client/auth/ForgotPassword.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - diff --git a/frontend/src/views/client/auth/Login.vue b/frontend/src/views/client/auth/Login.vue deleted file mode 100755 index 64747f9c..00000000 --- a/frontend/src/views/client/auth/Login.vue +++ /dev/null @@ -1,151 +0,0 @@ - - diff --git a/frontend/src/views/client/auth/Register.vue b/frontend/src/views/client/auth/Register.vue deleted file mode 100755 index fc2499da..00000000 --- a/frontend/src/views/client/auth/Register.vue +++ /dev/null @@ -1,171 +0,0 @@ - - diff --git a/frontend/src/views/client/auth/ResetPassword.vue b/frontend/src/views/client/auth/ResetPassword.vue deleted file mode 100755 index eee9e10b..00000000 --- a/frontend/src/views/client/auth/ResetPassword.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - diff --git a/frontend/src/views/client/auth/TwoFactorSetup.vue b/frontend/src/views/client/auth/TwoFactorSetup.vue deleted file mode 100755 index 0c65f7d0..00000000 --- a/frontend/src/views/client/auth/TwoFactorSetup.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - diff --git a/frontend/src/views/client/auth/TwoFactorVerify.vue b/frontend/src/views/client/auth/TwoFactorVerify.vue deleted file mode 100755 index 386be4b4..00000000 --- a/frontend/src/views/client/auth/TwoFactorVerify.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - diff --git a/frontend/src/views/client/auth/sso.vue b/frontend/src/views/client/auth/sso.vue deleted file mode 100755 index d41325c0..00000000 --- a/frontend/src/views/client/auth/sso.vue +++ /dev/null @@ -1,74 +0,0 @@ - - diff --git a/frontend/src/views/client/errors/Forbidden.vue b/frontend/src/views/client/errors/Forbidden.vue deleted file mode 100755 index 57dcb238..00000000 --- a/frontend/src/views/client/errors/Forbidden.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/frontend/src/views/client/errors/NotFound.vue b/frontend/src/views/client/errors/NotFound.vue deleted file mode 100755 index 2d3804e0..00000000 --- a/frontend/src/views/client/errors/NotFound.vue +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/frontend/src/views/client/errors/ServerError.vue b/frontend/src/views/client/errors/ServerError.vue deleted file mode 100755 index a706ac6a..00000000 --- a/frontend/src/views/client/errors/ServerError.vue +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/frontend/src/views/client/ticket/Create.vue b/frontend/src/views/client/ticket/Create.vue deleted file mode 100755 index c86771cc..00000000 --- a/frontend/src/views/client/ticket/Create.vue +++ /dev/null @@ -1,249 +0,0 @@ - - -