From 27261b1e50cb07ecabbf99615dfefea827240222 Mon Sep 17 00:00:00 2001 From: overplayed Date: Wed, 29 Jan 2025 12:03:04 -0500 Subject: [PATCH] second commit --- .gitignore | 4 + README.md | 3 + app/Controllers/AboutController.php | 20 + app/Controllers/ClientsController.php | 8 + app/Controllers/ContactController.php | 44 + .../EmergencySupportController.php | 8 + app/Controllers/HelpDeskController.php | 8 + app/Controllers/HomeController.php | 32 + app/Controllers/ServicesController.php | 48 + app/Controllers/TestimonialsController.php | 19 + app/Core/Controller.php | 70 + app/Core/Router.php | 49 + app/Core/View.php | 8 + app/Interfaces/LoggableInterface.php | 8 + app/Interfaces/ServiceInterface.php | 8 + app/Models/ClientModel.php | 105 + app/Models/ContactModel.php | 103 + app/Models/ServiceModel.php | 101 + app/Models/TestimonialModel.php | 101 + app/Services/EmergencySupportService.php | 45 + app/Services/HelpDeskService.php | 8 + app/Services/ITConsultingService.php | 45 + app/Services/ManagedHostingService.php | 45 + app/Services/OnlineBrandManagementService.php | 45 + app/Services/ProjectManagementService.php | 45 + app/Utils/ClassInspector.php | 169 + app/Utils/Database.php | 78 + app/Utils/ErrorHandler.php | 58 + app/Utils/Logger.php | 62 + app/Utils/Mailer.php | 85 + app/Utils/NamespaceUpdater.php | 98 + app/Utils/Sanitizer.php | 65 + app/Utils/StructureGenerator.php | 171 + app/Utils/Validator.php | 235 ++ composer.json | 24 + composer.lock | 3015 +++++++++++++++++ config/config.php | 4 + public/assets/css/styles.css | 0 public/assets/js/main.js | 0 public/favicon.ico | Bin 0 -> 2946 bytes public/index.php | 33 + resources/emails/contact_confirmation.php | 4 + resources/views/layouts/footer.php | 12 + resources/views/layouts/head.php | 12 + resources/views/layouts/header.php | 3 + resources/views/layouts/main.php | 31 + resources/views/pages/about.php | 8 + resources/views/pages/contact.php | 16 + resources/views/pages/error.php | 8 + resources/views/pages/home.php | 33 + resources/views/pages/services.php | 4 + .../pages/services/emergency_support.php | 8 + .../views/pages/services/it_consulting.php | 8 + .../views/pages/services/managed_services.php | 8 + .../services/online_brand_management.php | 8 + .../pages/services/project_management.php | 8 + resources/views/pages/testimonials.php | 8 + resources/views/partials/contact_form.php | 18 + resources/views/partials/navbar.php | 16 + resources/views/partials/sidebar.php | 8 + scripts/autload-test.php | 7 + scripts/create_pages.php | 65 + scripts/generate_structure.php | 4 + scripts/run_generator.php | 16 + scripts/update_namespaces.php | 20 + 65 files changed, 5410 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/Controllers/AboutController.php create mode 100644 app/Controllers/ClientsController.php create mode 100644 app/Controllers/ContactController.php create mode 100644 app/Controllers/EmergencySupportController.php create mode 100644 app/Controllers/HelpDeskController.php create mode 100644 app/Controllers/HomeController.php create mode 100644 app/Controllers/ServicesController.php create mode 100644 app/Controllers/TestimonialsController.php create mode 100644 app/Core/Controller.php create mode 100644 app/Core/Router.php create mode 100644 app/Core/View.php create mode 100644 app/Interfaces/LoggableInterface.php create mode 100644 app/Interfaces/ServiceInterface.php create mode 100644 app/Models/ClientModel.php create mode 100644 app/Models/ContactModel.php create mode 100644 app/Models/ServiceModel.php create mode 100644 app/Models/TestimonialModel.php create mode 100644 app/Services/EmergencySupportService.php create mode 100644 app/Services/HelpDeskService.php create mode 100644 app/Services/ITConsultingService.php create mode 100644 app/Services/ManagedHostingService.php create mode 100644 app/Services/OnlineBrandManagementService.php create mode 100644 app/Services/ProjectManagementService.php create mode 100644 app/Utils/ClassInspector.php create mode 100644 app/Utils/Database.php create mode 100644 app/Utils/ErrorHandler.php create mode 100644 app/Utils/Logger.php create mode 100644 app/Utils/Mailer.php create mode 100644 app/Utils/NamespaceUpdater.php create mode 100644 app/Utils/Sanitizer.php create mode 100644 app/Utils/StructureGenerator.php create mode 100644 app/Utils/Validator.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/config.php create mode 100644 public/assets/css/styles.css create mode 100644 public/assets/js/main.js create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 resources/emails/contact_confirmation.php create mode 100644 resources/views/layouts/footer.php create mode 100644 resources/views/layouts/head.php create mode 100644 resources/views/layouts/header.php create mode 100644 resources/views/layouts/main.php create mode 100644 resources/views/pages/about.php create mode 100644 resources/views/pages/contact.php create mode 100644 resources/views/pages/error.php create mode 100644 resources/views/pages/home.php create mode 100644 resources/views/pages/services.php create mode 100644 resources/views/pages/services/emergency_support.php create mode 100644 resources/views/pages/services/it_consulting.php create mode 100644 resources/views/pages/services/managed_services.php create mode 100644 resources/views/pages/services/online_brand_management.php create mode 100644 resources/views/pages/services/project_management.php create mode 100644 resources/views/pages/testimonials.php create mode 100644 resources/views/partials/contact_form.php create mode 100644 resources/views/partials/navbar.php create mode 100644 resources/views/partials/sidebar.php create mode 100644 scripts/autload-test.php create mode 100644 scripts/create_pages.php create mode 100644 scripts/generate_structure.php create mode 100644 scripts/run_generator.php create mode 100644 scripts/update_namespaces.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..243f85c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/vendor/ +/logs/ +/storage/ +.env \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..11e877f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Project Documentation + +This file will contain project documentation. diff --git a/app/Controllers/AboutController.php b/app/Controllers/AboutController.php new file mode 100644 index 0000000..936f535 --- /dev/null +++ b/app/Controllers/AboutController.php @@ -0,0 +1,20 @@ +render('pages/about', [ + 'title' => 'About Us - Wizdom Networks', + 'content' => '

About Wizdom Networks

+

We specialize in delivering top-notch IT solutions to help your business thrive.

' + ]); + } +} diff --git a/app/Controllers/ClientsController.php b/app/Controllers/ClientsController.php new file mode 100644 index 0000000..42b35d0 --- /dev/null +++ b/app/Controllers/ClientsController.php @@ -0,0 +1,8 @@ + 'Contact Us - Wizdom Networks', + 'description' => 'Get in touch with our team for inquiries and support.', + ]; + + // Render the contact page view + $this->render('pages/contact', $data); + + Logger::info("[DEBUG] Successfully rendered contact page"); + } catch (\Exception $e) { + // Log and handle any exceptions + ErrorHandler::exception($e); + throw $e; // Rethrow or handle as needed + } + } +} diff --git a/app/Controllers/EmergencySupportController.php b/app/Controllers/EmergencySupportController.php new file mode 100644 index 0000000..341849c --- /dev/null +++ b/app/Controllers/EmergencySupportController.php @@ -0,0 +1,8 @@ + 'Welcome to Wizdom Networks', + 'description' => 'Your trusted IT consulting partner.', + ]; + + try { + $this->render('pages/home', $data); + Logger::info("Home page rendered successfully."); + } catch (\Exception $e) { + Logger::error("Failed to render home page: " . $e->getMessage()); + http_response_code(500); + echo "An internal error occurred."; + } + } +} diff --git a/app/Controllers/ServicesController.php b/app/Controllers/ServicesController.php new file mode 100644 index 0000000..074df9f --- /dev/null +++ b/app/Controllers/ServicesController.php @@ -0,0 +1,48 @@ +render('pages/services', ['title' => 'Our Services']); + } + + public function itConsulting(): void + { + + + $this->render('pages/services/it_consulting', [ + 'title' => 'IT Consulting - Wizdom Networks', + 'content' => '

IT Consulting

+

We provide tailored IT solutions to help your business thrive.

' + ]); + } + + public function emergencySupport(): void + { + + + $this->render('pages/services/emergency_support', [ + 'title' => 'Emergency Support - Wizdom Networks', + 'content' => '

Emergency Support

+

24/7 emergency IT support to ensure smooth operations.

' + ]); + } + + public function managedServices(): void + { + + + // Render the managed services page with the layout + $this->render('pages/services/managed_services', [ + 'title' => 'Managed Services', + 'content' => '

Managed Services

+

We offer a wide array of managed services

' + ]); + } +} diff --git a/app/Controllers/TestimonialsController.php b/app/Controllers/TestimonialsController.php new file mode 100644 index 0000000..6e40a47 --- /dev/null +++ b/app/Controllers/TestimonialsController.php @@ -0,0 +1,19 @@ +getContactForm('Want to leave us feedback?'); + + $this->render('pages/testimonials', [ + 'title' => 'Testimonials - Wizdom Networks', + 'content' => '

Testimonials

+

Here\'s what our clients have to say about us:

' . $contactForm + ]); + } +} diff --git a/app/Core/Controller.php b/app/Core/Controller.php new file mode 100644 index 0000000..a8a9c0c --- /dev/null +++ b/app/Core/Controller.php @@ -0,0 +1,70 @@ +getMessage()); + throw $e; + } + } + + /** + * Get the rendered content of the contact form. + * + * This method renders the contact form view and returns the output as a string. + * It is used for embedding the contact form in various parts of the application. + * + * @param array $data Optional data to pass to the contact form view. + * @return string The rendered contact form HTML. + * @throws \Exception If the contact form view cannot be rendered. + */ + protected function getContactForm(array $data = []): string + { + try { + Logger::info("[DEBUG] Rendering contact form with data: " . json_encode($data)); + + // Buffer output to capture rendered content + ob_start(); + $this->render('partials/contact_form', $data); + + $output = ob_get_clean(); + + Logger::info("[DEBUG] Successfully rendered contact form"); + + return $output; + } catch (\Exception $e) { + // Log any exception that occurs + Logger::error("[ERROR] Exception while rendering contact form: " . $e->getMessage()); + throw $e; + } + } +} diff --git a/app/Core/Router.php b/app/Core/Router.php new file mode 100644 index 0000000..6b6bdcc --- /dev/null +++ b/app/Core/Router.php @@ -0,0 +1,49 @@ +routes[$normalizedPath] = ['controller' => $controller, 'method' => $method]; + Logger::info("Route added: $normalizedPath -> $controller::$method"); + } + + public function dispatch(string $path): void + { + // Normalize the incoming path to remove leading/trailing slashes + $path = trim($path, '/'); + + Logger::info("Dispatching path: $path"); + + if (!isset($this->routes[$path])) { + Logger::error("Route not found: $path"); + http_response_code(404); + echo "404 - Page not found"; + return; + } + + $controllerName = $this->routes[$path]['controller']; + $method = $this->routes[$path]['method']; + + Logger::info("Loading controller: $controllerName::$method"); + + if (!class_exists($controllerName) || !method_exists($controllerName, $method)) { + Logger::error("Controller or method not found: $controllerName::$method"); + http_response_code(500); + echo "500 - Internal server error"; + return; + } + + $controller = new $controllerName(); + $controller->$method(); + } +} diff --git a/app/Core/View.php b/app/Core/View.php new file mode 100644 index 0000000..59b754b --- /dev/null +++ b/app/Core/View.php @@ -0,0 +1,8 @@ +db = $db; + } + + /** + * Get a client by ID. + * + * @param int $id + * @return array|null + */ + public function getClientById(int $id): ?array + { + try { + Logger::info("[DEBUG] Fetching client with ID: $id"); + + $stmt = $this->db->prepare("SELECT * FROM clients WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + $client = $stmt->fetch(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Client data retrieved: " . json_encode($client)); + + return $client ?: null; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch client with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return null; + } + } + + /** + * Add a new client to the database. + * + * @param array $clientData + * @return bool + */ + public function addClient(array $clientData): bool + { + try { + Logger::info("[DEBUG] Adding new client: " . json_encode($clientData)); + + $stmt = $this->db->prepare( + "INSERT INTO clients (name, email, phone) VALUES (:name, :email, :phone)" + ); + $stmt->bindParam(':name', $clientData['name']); + $stmt->bindParam(':email', $clientData['email']); + $stmt->bindParam(':phone', $clientData['phone']); + + $stmt->execute(); + + Logger::info("[DEBUG] Client successfully added."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to add client: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } + + /** + * Delete a client by ID. + * + * @param int $id + * @return bool + */ + public function deleteClientById(int $id): bool + { + try { + Logger::info("[DEBUG] Deleting client with ID: $id"); + + $stmt = $this->db->prepare("DELETE FROM clients WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + Logger::info("[DEBUG] Client with ID $id successfully deleted."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to delete client with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } +} + + diff --git a/app/Models/ContactModel.php b/app/Models/ContactModel.php new file mode 100644 index 0000000..985edc8 --- /dev/null +++ b/app/Models/ContactModel.php @@ -0,0 +1,103 @@ +db = $db; + } + + /** + * Retrieve a contact by ID. + * + * @param int $id + * @return array|null + */ + public function getContactById(int $id): ?array + { + try { + Logger::info("[DEBUG] Fetching contact with ID: $id"); + + $stmt = $this->db->prepare("SELECT * FROM contacts WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + $contact = $stmt->fetch(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Contact data retrieved: " . json_encode($contact)); + + return $contact ?: null; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch contact with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return null; + } + } + + /** + * Add a new contact to the database. + * + * @param array $contactData + * @return bool + */ + public function addContact(array $contactData): bool + { + try { + Logger::info("[DEBUG] Adding new contact: " . json_encode($contactData)); + + $stmt = $this->db->prepare( + "INSERT INTO contacts (name, email, message) VALUES (:name, :email, :message)" + ); + $stmt->bindParam(':name', $contactData['name']); + $stmt->bindParam(':email', $contactData['email']); + $stmt->bindParam(':message', $contactData['message']); + + $stmt->execute(); + + Logger::info("[DEBUG] Contact successfully added."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to add contact: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } + + /** + * Delete a contact by ID. + * + * @param int $id + * @return bool + */ + public function deleteContactById(int $id): bool + { + try { + Logger::info("[DEBUG] Deleting contact with ID: $id"); + + $stmt = $this->db->prepare("DELETE FROM contacts WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + Logger::info("[DEBUG] Contact with ID $id successfully deleted."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to delete contact with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } +} diff --git a/app/Models/ServiceModel.php b/app/Models/ServiceModel.php new file mode 100644 index 0000000..479858b --- /dev/null +++ b/app/Models/ServiceModel.php @@ -0,0 +1,101 @@ +db = $db; + } + + /** + * Get all services. + * + * @return array + */ + public function getAllServices(): array + { + try { + Logger::info("[DEBUG] Fetching all services"); + + $stmt = $this->db->query("SELECT * FROM services"); + $services = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Retrieved services: " . json_encode($services)); + + return $services; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch services: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } + + /** + * Get a service by ID. + * + * @param int $id + * @return array|null + */ + public function getServiceById(int $id): ?array + { + try { + Logger::info("[DEBUG] Fetching service with ID: $id"); + + $stmt = $this->db->prepare("SELECT * FROM services WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + $service = $stmt->fetch(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Service data retrieved: " . json_encode($service)); + + return $service ?: null; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch service with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return null; + } + } + + /** + * Add a new service to the database. + * + * @param array $serviceData + * @return bool + */ + public function addService(array $serviceData): bool + { + try { + Logger::info("[DEBUG] Adding new service: " . json_encode($serviceData)); + + $stmt = $this->db->prepare( + "INSERT INTO services (name, description, price) VALUES (:name, :description, :price)" + ); + $stmt->bindParam(':name', $serviceData['name']); + $stmt->bindParam(':description', $serviceData['description']); + $stmt->bindParam(':price', $serviceData['price']); + + $stmt->execute(); + + Logger::info("[DEBUG] Service successfully added."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to add service: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } +} diff --git a/app/Models/TestimonialModel.php b/app/Models/TestimonialModel.php new file mode 100644 index 0000000..479858b --- /dev/null +++ b/app/Models/TestimonialModel.php @@ -0,0 +1,101 @@ +db = $db; + } + + /** + * Get all services. + * + * @return array + */ + public function getAllServices(): array + { + try { + Logger::info("[DEBUG] Fetching all services"); + + $stmt = $this->db->query("SELECT * FROM services"); + $services = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Retrieved services: " . json_encode($services)); + + return $services; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch services: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } + + /** + * Get a service by ID. + * + * @param int $id + * @return array|null + */ + public function getServiceById(int $id): ?array + { + try { + Logger::info("[DEBUG] Fetching service with ID: $id"); + + $stmt = $this->db->prepare("SELECT * FROM services WHERE id = :id"); + $stmt->bindParam(':id', $id, \PDO::PARAM_INT); + $stmt->execute(); + + $service = $stmt->fetch(\PDO::FETCH_ASSOC); + + Logger::info("[DEBUG] Service data retrieved: " . json_encode($service)); + + return $service ?: null; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch service with ID $id: " . $e->getMessage()); + ErrorHandler::exception($e); + return null; + } + } + + /** + * Add a new service to the database. + * + * @param array $serviceData + * @return bool + */ + public function addService(array $serviceData): bool + { + try { + Logger::info("[DEBUG] Adding new service: " . json_encode($serviceData)); + + $stmt = $this->db->prepare( + "INSERT INTO services (name, description, price) VALUES (:name, :description, :price)" + ); + $stmt->bindParam(':name', $serviceData['name']); + $stmt->bindParam(':description', $serviceData['description']); + $stmt->bindParam(':price', $serviceData['price']); + + $stmt->execute(); + + Logger::info("[DEBUG] Service successfully added."); + + return true; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to add service: " . $e->getMessage()); + ErrorHandler::exception($e); + return false; + } + } +} diff --git a/app/Services/EmergencySupportService.php b/app/Services/EmergencySupportService.php new file mode 100644 index 0000000..9519ebf --- /dev/null +++ b/app/Services/EmergencySupportService.php @@ -0,0 +1,45 @@ + 'Emergency Support', + 'description' => 'Round-the-clock emergency IT support for critical issues.', + 'features' => [ + '24/7 availability', + 'Rapid response', + 'Critical system recovery', + ], + 'price' => 'Custom pricing based on severity and scope', + ]; + + Logger::info("[DEBUG] Retrieved emergency support service details: " . json_encode($details)); + + return $details; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch emergency support service details: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } +} diff --git a/app/Services/HelpDeskService.php b/app/Services/HelpDeskService.php new file mode 100644 index 0000000..de97002 --- /dev/null +++ b/app/Services/HelpDeskService.php @@ -0,0 +1,8 @@ + 'IT Consulting', + 'description' => 'Expert IT consulting services to drive your business forward.', + 'features' => [ + 'Infrastructure planning', + 'Cloud integration', + 'Technology strategy', + ], + 'price' => 'Custom pricing based on requirements', + ]; + + Logger::info("[DEBUG] Retrieved IT consulting service details: " . json_encode($details)); + + return $details; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch IT consulting service details: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } +} diff --git a/app/Services/ManagedHostingService.php b/app/Services/ManagedHostingService.php new file mode 100644 index 0000000..ff99145 --- /dev/null +++ b/app/Services/ManagedHostingService.php @@ -0,0 +1,45 @@ + 'Managed Hosting', + 'description' => 'Comprehensive managed hosting services to keep your business online.', + 'features' => [ + 'Server management', + 'Performance optimization', + 'Data backups and recovery', + ], + 'price' => 'Custom pricing based on hosting requirements', + ]; + + Logger::info("[DEBUG] Retrieved managed hosting service details: " . json_encode($details)); + + return $details; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch managed hosting service details: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } +} diff --git a/app/Services/OnlineBrandManagementService.php b/app/Services/OnlineBrandManagementService.php new file mode 100644 index 0000000..304eed8 --- /dev/null +++ b/app/Services/OnlineBrandManagementService.php @@ -0,0 +1,45 @@ + 'Online Brand Management', + 'description' => 'Strategic online brand management to enhance your digital presence.', + 'features' => [ + 'Social media management', + 'Reputation monitoring', + 'Content strategy', + ], + 'price' => 'Custom pricing based on campaign requirements', + ]; + + Logger::info("[DEBUG] Retrieved online brand management service details: " . json_encode($details)); + + return $details; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch online brand management service details: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } +} diff --git a/app/Services/ProjectManagementService.php b/app/Services/ProjectManagementService.php new file mode 100644 index 0000000..09659b1 --- /dev/null +++ b/app/Services/ProjectManagementService.php @@ -0,0 +1,45 @@ + 'Project Management', + 'description' => 'Professional project management to ensure success from start to finish.', + 'features' => [ + 'Planning and scheduling', + 'Resource allocation', + 'Risk management', + ], + 'price' => 'Custom pricing based on project scope', + ]; + + Logger::info("[DEBUG] Retrieved project management service details: " . json_encode($details)); + + return $details; + } catch (\Exception $e) { + Logger::error("[ERROR] Failed to fetch project management service details: " . $e->getMessage()); + ErrorHandler::exception($e); + return []; + } + } +} diff --git a/app/Utils/ClassInspector.php b/app/Utils/ClassInspector.php new file mode 100644 index 0000000..7d3b813 --- /dev/null +++ b/app/Utils/ClassInspector.php @@ -0,0 +1,169 @@ +getExtension() === 'php') { + $relativePath = str_replace([$baseDir, '/', '.php'], ['', '\\', ''], $file->getPathname()); + $className = $namespace . '\\' . $relativePath; + $className = str_replace('\\\\', '\\', $className); // Remove double backslashes + $allClasses[$className] = $file->getPathname(); + } + } + + // Separate loaded and not loaded + $classDetails = []; + foreach ($allClasses as $className => $path) { + $status = class_exists($className, true) ? 'Loaded' : 'Not Loaded'; + $classDetails[] = [ + 'class' => self::getClassNameOnly($className), + 'path' => $path, + 'status' => $status, + ]; + } + + return $classDetails; +} + + + /** + * Extract the class name from a fully qualified class name. + * + * @param string $class Fully qualified class name. + * @return string The class name without the namespace. + */ + private static function getClassNameOnly(string $class): string + { + $parts = explode('\\', $class); + return end($parts); + } + + /** + * Display the results in a table format. + * + * @param string $namespace The namespace to inspect. + * @param string $baseDir The base directory for the namespace. + * @param bool $useHtml Whether to generate the table as HTML (default: true). + * @return void + */ + public static function displayClassTable(string $namespace, string $baseDir, bool $useHtml = true): void + { + $classDetails = self::compareLoadedClasses($namespace, $baseDir); + + if ($useHtml) { + // Generate HTML table + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + foreach ($classDetails as $detail) { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + + echo ""; + echo "
ClassPathStatus
{$detail['class']}{$detail['path']}{$detail['status']}
"; + } else { + // Generate plain text table + echo str_pad("Class", 30) . str_pad("Path", 50) . "Status\n"; + echo str_repeat("-", 100) . "\n"; + + foreach ($classDetails as $detail) { + echo str_pad($detail['class'], 30) . + str_pad($detail['path'], 50) . + $detail['status'] . "\n"; + } + } + } + + /** + * Debug all classes in the top-level namespace, showing a table of results. + * + * @param bool $useHtml Whether to generate the table as HTML (default: true). + * @return void + */ + public static function debugTopLevelNamespace(bool $useHtml = true): void + { + $namespace = self::getTopLevelNamespace(); + if (!$namespace) { + echo "Top-level namespace could not be determined.\n"; + return; + } + + // Assume PSR-4 base directory is app/ (adjust if needed) + $baseDir = realpath(__DIR__ . '/../../app'); + if (!$baseDir) { + echo "Base directory could not be resolved.\n"; + return; + } + + self::displayClassTable($namespace, $baseDir, $useHtml); + } +} diff --git a/app/Utils/Database.php b/app/Utils/Database.php new file mode 100644 index 0000000..b0234dc --- /dev/null +++ b/app/Utils/Database.php @@ -0,0 +1,78 @@ +connect(); + } + + /** + * Establishes a connection to the database. + */ + private function connect(): void + { + $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8mb4', getenv('DB_HOST'), getenv('DB_NAME')); + + try { + $this->connection = new PDO($dsn, getenv('DB_USER'), getenv('DB_PASSWORD')); + $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + Logger::info('Database connection established successfully.'); + } catch (PDOException $e) { + Logger::error('Database connection failed: ' . $e->getMessage()); + throw $e; + } + } + + /** + * Executes a query and returns the result. + * + * @param string $query The SQL query to execute. + * @param array $params Parameters for prepared statements (optional). + * @return array The query result. + */ + public function query(string $query, array $params = []): array + { + try { + $stmt = $this->connection->prepare($query); + $stmt->execute($params); + Logger::info('Query executed successfully: ' . $query); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + Logger::error('Query failed: ' . $query . ' | Error: ' . $e->getMessage()); + throw $e; + } + } + + /** + * Retrieves the PDO connection instance. + * + * @return PDO The PDO instance. + */ + public function getConnection(): PDO + { + return $this->connection; + } +} diff --git a/app/Utils/ErrorHandler.php b/app/Utils/ErrorHandler.php new file mode 100644 index 0000000..540f479 --- /dev/null +++ b/app/Utils/ErrorHandler.php @@ -0,0 +1,58 @@ +getMessage() . " in " . $exception->getFile() . " on line " . $exception->getLine(); + Logger::error($message); + http_response_code(500); + echo "An internal error occurred. Please try again later."; + exit; + } +} diff --git a/app/Utils/Logger.php b/app/Utils/Logger.php new file mode 100644 index 0000000..1496d0a --- /dev/null +++ b/app/Utils/Logger.php @@ -0,0 +1,62 @@ +mailer = new PHPMailer(true); + $this->configure(); + } + + /** + * Configures the PHPMailer instance. + * + * Reads email configuration from environment variables such as MAIL_HOST, MAIL_USER, MAIL_PASSWORD, etc. + * + * @throws Exception If any configuration errors occur. + */ + protected function configure(): void + { + $this->mailer->isSMTP(); + $this->mailer->Host = getenv('MAIL_HOST'); + $this->mailer->SMTPAuth = true; + $this->mailer->Username = getenv('MAIL_USER'); + $this->mailer->Password = getenv('MAIL_PASSWORD'); + $this->mailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $this->mailer->Port = (int) getenv('MAIL_PORT'); + $this->mailer->setFrom(getenv('MAIL_FROM_EMAIL'), getenv('MAIL_FROM_NAME')); + Logger::info('Mailer configured successfully.'); + } + + /** + * Sends an email. + * + * @param string $to The recipient's email address. + * @param string $subject The email subject. + * @param string $body The HTML content of the email. + * @param string $altBody The plain-text alternative content of the email (optional). + * + * @return bool True if the email was sent successfully, false otherwise. + */ + public function send(string $to, string $subject, string $body, string $altBody = ''): bool + { + try { + $this->mailer->addAddress($to); + $this->mailer->Subject = $subject; + $this->mailer->Body = $body; + $this->mailer->AltBody = $altBody; + + if ($this->mailer->send()) { + Logger::info("Email sent successfully to $to with subject: $subject."); + return true; + } else { + Logger::error("Failed to send email to $to with subject: $subject."); + return false; + } + } catch (Exception $e) { + Logger::error("Mailer error while sending email to $to: " . $e->getMessage()); + return false; + } + } +} diff --git a/app/Utils/NamespaceUpdater.php b/app/Utils/NamespaceUpdater.php new file mode 100644 index 0000000..81b4868 --- /dev/null +++ b/app/Utils/NamespaceUpdater.php @@ -0,0 +1,98 @@ +getNamespaceFromComposer($basePath) ?? 'App\\'; + $namespaceBase = rtrim(str_replace('\\', '\\', $namespaceBase), '\\') . '\\'; + + $files = $this->findPhpFiles($basePath); + foreach ($files as $file) { + $this->updateNamespace($file, $namespaceBase, $basePath); + } + + echo "Namespace update complete.\n"; + } + + private function getNamespaceFromComposer(string $basePath): ?string + { + $composerPath = $basePath . 'composer.json'; + + if (!file_exists($composerPath)) { + echo "composer.json not found. Using default namespace.\n"; + return null; + } + + $composerConfig = json_decode(file_get_contents($composerPath), true); + + if ( + isset($composerConfig['autoload']['psr-4']) && + is_array($composerConfig['autoload']['psr-4']) + ) { + $namespaces = array_keys($composerConfig['autoload']['psr-4']); + return $namespaces[0] ?? null; + } + + echo "No PSR-4 autoload namespace found in composer.json. Using default namespace.\n"; + return null; + } + + private function findPhpFiles(string $directory): array + { + $phpFiles = []; + $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory)); + + foreach ($iterator as $file) { + if ($file->getExtension() === 'php' && strpos($file->getPathname(), DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR) === false) { + $phpFiles[] = $file->getPathname(); + } + } + + return $phpFiles; + } + + private function updateNamespace(string $filePath, string $namespaceBase, string $basePath): void +{ + // Get the relative path from the base directory + $relativePath = str_replace($basePath, '', $filePath); + + // Remove the 'app/' prefix from the relative path + if (strpos($relativePath, 'app/') === 0) { + $relativePath = substr($relativePath, strlen('app/')); + } + + // Build the namespace + $namespaceParts = explode(DIRECTORY_SEPARATOR, dirname($relativePath)); + $namespace = $namespaceBase . implode('\\', $namespaceParts); + + // Get the file content + $content = file_get_contents($filePath); + + // Skip files without a namespace declaration + if (!preg_match('/^namespace\s+[^;]+;/m', $content)) { + echo "Skipping file without namespace: $filePath\n"; + return; + } + + // Skip if the namespace is already correct + if (preg_match('/^namespace\s+' . preg_quote($namespace, '/') . ';$/m', $content)) { + echo "Namespace already correct in file: $filePath\n"; + return; + } + + // Replace or add the namespace + $content = preg_replace('/^namespace\s+[^;]+;/m', "namespace $namespace;", $content); + + // Save the updated file + file_put_contents($filePath, $content); + echo "Updated namespace in file: $filePath\n"; +} + +} diff --git a/app/Utils/Sanitizer.php b/app/Utils/Sanitizer.php new file mode 100644 index 0000000..a81c8aa --- /dev/null +++ b/app/Utils/Sanitizer.php @@ -0,0 +1,65 @@ +structure as $folder) { + $path = rtrim($basePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $folder; + if (!is_dir($path)) { + mkdir($path, 0755, true); + echo "Created directory: $path\n"; + } else { + echo "Directory already exists: $path\n"; + } + } + + foreach ($this->files as $file) { + $filePath = rtrim($basePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $file; + if (!file_exists($filePath)) { + file_put_contents($filePath, $this->getDefaultContent($file)); + echo "Created file with default content: $filePath\n"; + } else { + $currentContent = file_get_contents($filePath); + $defaultContent = $this->getDefaultContent($file); + if (trim($currentContent) === '') { + file_put_contents($filePath, $defaultContent); + echo "Updated empty file with default content: $filePath\n"; + } elseif (trim($currentContent) === trim($defaultContent)) { + echo "File already has default content, no changes made: $filePath\n"; + } else { + echo "File has additional content, no changes made: $filePath\n"; + } + } + } + } + + private function getDefaultContent(string $file): string + { + if (preg_match('/app\/(Controllers|Core|Models|Services|Utils|Interfaces)\//', $file)) { + $namespace = preg_replace('/app\/(.*?)\//', 'WizdomNetworks\\WizeWeb\\$1', dirname($file)); + $namespace = str_replace('/', '\\', $namespace); + $className = pathinfo($file, PATHINFO_FILENAME); + return "\n"; + exit(1); + } + + $path = $argv[1]; + $generator = new StructureGenerator(); + $generator->createStructure($path); +} +?> diff --git a/app/Utils/Validator.php b/app/Utils/Validator.php new file mode 100644 index 0000000..4e5c8d2 --- /dev/null +++ b/app/Utils/Validator.php @@ -0,0 +1,235 @@ += $minLength; + + if (!$isValid) { + Logger::warning("[WARNING] String is shorter than minimum length: $string"); + } + + return $isValid; + } catch (\Throwable $e) { + ErrorHandler::exception($e); + return false; + } + } + + /** + * Check if a string has a maximum length. + * + * @param string $string The string to check. + * @param int $maxLength The maximum length. + * @return bool True if the string meets the maximum length, false otherwise. + */ + public static function hasMaxLength(string $string, int $maxLength): bool + { + try { + Logger::info("[DEBUG] Checking if string has maximum length: $maxLength"); + + $isValid = strlen($string) <= $maxLength; + + if (!$isValid) { + Logger::warning("[WARNING] String exceeds maximum length: $string"); + } + + return $isValid; + } catch (\Throwable $e) { + ErrorHandler::exception($e); + return false; + } + } + + /** + * Validate a string length. + * + * @param string $input The string to validate. + * @param int $min Minimum length. + * @param int $max Maximum length. + * @return bool True if the string length is valid, false otherwise. + */ + public static function validateStringLength(string $input, int $min, int $max): bool + { + try { + Logger::info("[DEBUG] Validating string length: Input='$input', Min=$min, Max=$max"); + + $length = strlen($input); + $isValid = $length >= $min && $length <= $max; + + if (!$isValid) { + Logger::warning("[WARNING] Invalid string length: $length (Expected between $min and $max)"); + } + + return $isValid; + } catch (\Throwable $e) { + ErrorHandler::exception($e); + return false; + } + } + + /** + * Validate a boolean value. + * + * @param mixed $input The input to validate as a boolean. + * @return bool True if the input is a valid boolean, false otherwise. + */ + public static function validateBoolean($input): bool + { + try { + Logger::info("[DEBUG] Validating boolean input: $input"); + + $isValid = is_bool(filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); + + if (!$isValid) { + Logger::warning("[WARNING] Invalid boolean input: $input"); + } + + return $isValid; + } catch (\Throwable $e) { + ErrorHandler::exception($e); + return false; + } + } + + /** + * Validate a date format. + * + * @param string $date The date string to validate. + * @param string $format The expected date format (e.g., 'Y-m-d'). + * @return bool True if the date matches the format, false otherwise. + */ + public static function validateDate(string $date, string $format = 'Y-m-d'): bool + { + try { + Logger::info("[DEBUG] Validating date: $date with format: $format"); + + $dateTime = \DateTime::createFromFormat($format, $date); + $isValid = $dateTime && $dateTime->format($format) === $date; + + if (!$isValid) { + Logger::warning("[WARNING] Invalid date: $date (Expected format: $format)"); + } + + return $isValid; + } catch (\Throwable $e) { + ErrorHandler::exception($e); + return false; + } + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1ae8fcf --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "wizdomnetworks/wizeweb", + "description": "A PHP project adhering to PSR standards.", + "type": "library", + "version": "0.1.0", + "require": { + "phpmailer/phpmailer": "^6.8", + "vlucas/phpdotenv": "^5.5" + }, + "require-dev": { + "squizlabs/php_codesniffer": "^3.7", + "friendsofphp/php-cs-fixer": "^3.20" + }, + "autoload": { + "psr-4": { + "WizdomNetworks\\WizeWeb\\": "app/" + } + }, + "scripts": { + "fix": "php-cs-fixer fix", + "lint": "phpcs" + }, + "license": "MIT" +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..8d11c75 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3015 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "9c8e6d8157663ffb1f1b8d0e3a36a9eb", + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "phpmailer/phpmailer", + "version": "v6.9.3", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e", + "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.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" + }, + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2024-11-24T18:04:13+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "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-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": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + } + ], + "packages-dev": [ + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.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-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.68.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/b9db2b2ea3cdba7201067acee46f984ef2397cff", + "reference": "b9db2b2ea3cdba7201067acee46f984ef2397cff", + "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" + }, + "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" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "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" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2025-01-17T09:20:36+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "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/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "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/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.6", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", + "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" + }, + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src/" + } + }, + "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/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-01-01T16:37:48+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "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" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "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/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "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/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-05-24T10:39:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "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" + }, + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "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/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "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/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.11.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/1368f4a58c3c52114b86b1abe8f4098869cb0079", + "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-12-11T16:04:26+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "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/v5.4.47" + }, + "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-06T11:30:55+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.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/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "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/v5.4.45" + }, + "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:11:13+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.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/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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 basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" + }, + "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-10-22T13:05:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "63741784cd7b9967975eec610b256eed3ede022b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.45" + }, + "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-28T13:32:08+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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 an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" + }, + "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:11:13+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-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-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "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\\Php73\\": "" + }, + "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 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/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-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "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\\Php81\\": "" + }, + "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.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/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": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.4.47" + }, + "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-06T11:36:42+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "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/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" + }, + "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:11:13+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.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/v5.4.47" + }, + "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-10T20:33:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..54742ac --- /dev/null +++ b/config/config.php @@ -0,0 +1,4 @@ + zl?Vm^007^3@iPDb3o}VXK~#90?VZn8Ttybgt6u-0X+W|we}x{Bm^jIJ#0{(_MAPd5 z$^{%Lo31dOx5Nu5=mVFu1w9hVyI`Gnix6# z&%gZXC#dK7L=fN+(@PsOTRWXEY?sq+HiFGl1Y-zTZ>PfKcy;#4r{9gjj?ytmA+RFt3P; zB0?8<^Tt{{HQ(yHfP@4@fYVDGGf)*hvk*i`&D4A=-s|ii``MNdK?DdH${xpuAN)W) zPnEDQdB`xKP0hFBx0g0Pf-En$0ByV(>95TKc&PN{FFTz(7p|{?^?5D<+MFNwI3KJs z4nokecc;5A-n#wx2Z(ZwErKBs-$eKg(;x&BJ8$oHUxO&yNPw8axNz+eT3KVG6|ADz zkf$#pbf7IjY_HULd4N{d)8#pq9?BLFeVO+eS^~Uy6MuCognvUZ2Ow>Fc45`{Sy}?z z-J@Hb1`)ymZOen${Bg-52P?K^%*BKK%Su>Ux;KLD;sP zh{=LcNq`)@U&7D7?)^wz2N%KULz4xgQywtE`T==F?yNw;bRfEAIVnIP>;^4tKDg?Q z0y&Ld{cu)*ITl`pfl7Qj^l67cut%AS4_bw}M2rWXFwqsmfkb!K&w3`h! zLWKTi!3A6upAf+NfE+~l%TDJGbsf@-j@Zrr#8rH%!M)Z5Lv0wymmyDEY`&D#HXejd zo2{LMw3`h{If*~F=*C8@DL#l#2+K!tn-A!=Y=&j!avhH1lhVxFql$yVa1bxR*@ac( zlLhD(kfZqWv=KEJq1|lAdJQcps}KUF!!}oVY{zgDU%3?Je!Q+BC(J3C{leu z!%ckcWw_O!J2u zYw?SY{;-#YiBV1KVp0|d@nOx+Sqm`X?E9?#)%466t(KY1v1UC3DB!sRh;mEy+C!8s=*=38&(#j@G9kq^zuX}1(;x47*J&l zD$mB$!n7__kXHbLydoLY5!CZBTW}Cw0-K6J;HzMu;3T{RCl(>9w3`iC#5B8EOw=n6 zIf_pR&pcon>iHE1s23P2u&x{g(8F@6B*l04`yc0VngVe3c)d7L$-H2!meX9iwH{MN z;J6~Z1g9#S2U8K|=}^pRfNR1_@M;kR+o_umu3BFdab94k;B3WB(D8zh zo%+s)pT7#7TDV+_1VltKHOCt8_R_{jsvmZrnix5ane_<*RRP-YC~qu2ieK)-BvEqN z^yAJi-;%dw>J3jq(nu`soW2$ z+u#RLl!al`>F%@2sZ0gO`!$Ln!bmc_`N(H3Twl`?)zo||cJ-2O70N+>xR_+v`uW$r zAE)M9N`E^xS`kl|=bY(PXHG&en3`|Ju5SSE>~^gU-8KSB!bwOEoTFh}LnXk(D*+D6 z|EH5+(uN2*L>zG;ZC@`0s3REFjQ2&zZcj<_b)mBx(e+x{=#IM0m8-H`%5FBKV1oEg zl0+&w=K-NS6Gn_6WEj4W)N5ro1UONzJpA`x=l%@+T-A1)L~C=mDHm98!*JOWNk?lB zdl?`_*V}eq1LxFGC5YA&H9^m zvmyU@`*FOp+r_AoRqC}0?GQXUUY&jNDUP>u0aeeR9JNt9jl4Wvo|EVTlv0TASLnSR zw~gUyrKJ5o?Pf#T$hv?DngF>Cv7E#wgfRZ(^e8)p%yXqIC018jd9TK@1;?Qadw-Jy z?Pfz-5g<2jmj^qz)V!h zAq5BLVL55*i3U@pFtbfw@tLFs(Jj-~9w^6QInmCEQ~7#r__`zs04S39UKy)?Y_dqu zwb9m&onh1F4WxN-MntCM6<^*=^Sb5R4yordED!X6J^?ZGwvjQ-flKz1u-#G6dl(*`5OQY$GuF7 zD zIo~kOEYP*B-E2sc3x0H99g?5L`D>5jZQyMS4lBbn)LV8*CWO2nSPinPvmWrwLM!ev z3#qaN2M_=4{r6JaW}IXHP|ofDN|^>)q!a_|Nw^zMI|z^U!Y ziAq*-_pFzO%^RhH%?{|jXT$~&^{-V+MyD$n^tMmMV>`15vHkYDk|qB|M?csV3zI2= z6GJekp@#!L*@L|RDUOF+z!wp+72xy-8#BHb*%s#(SDm*H%Q@hsTkG-Gb_b;_%t#Pu zI9|r63p?wpUMvko-hfjbOg=u(!u3&tl>n!gHfAuzhmGmS=UKQcLRJE_^-<0sTwHt% z!c`Hn5umFEaOnh{^5T*j_k}505!9%T%RM0_2#l8Vl@WPE}9^=t_zT zU*R|fLKUEm3kOxP5enrZ+=5uqhhVBzsI5>a*Web!N-_s5+Ez$EC~fe@BA-(dvPB4H z2TYD-EyGuV8|%r*Oge2^iVvxx&^1_JVz*kBe}*eoF_Z zDw~j%pV+ld5F(!!bg{h&&Q@HA!#hH@ce}5pf9Gmv=n4=cr7#B0H^3*dL>NiwT~Mu8 sjq!yfMcpf7)sO%6+2v2D>tmDO09xEa!Yra0ivR!s07*qoM6N<$g2bkJ+5i9m literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..abec89c --- /dev/null +++ b/public/index.php @@ -0,0 +1,33 @@ +add('', HomeController::class, 'index'); +$router->add('about', AboutController::class, 'index'); +$router->add('contact', ContactController::class, 'index'); +$router->add('testimonials', TestimonialsController::class, 'index'); +$router->add('services', ServicesController::class, 'index'); +$router->add('services/it-consulting', ServicesController::class, 'itConsulting'); +$router->add('services/emergency-support', ServicesController::class, 'emergencySupport'); +$router->add('services/managed-services', ServicesController::class, 'managedServices'); + +// Dispatch the request +$router->dispatch($_SERVER['REQUEST_URI']); diff --git a/resources/emails/contact_confirmation.php b/resources/emails/contact_confirmation.php new file mode 100644 index 0000000..677e364 --- /dev/null +++ b/resources/emails/contact_confirmation.php @@ -0,0 +1,4 @@ + +
+

© 2025 WizdomNetworks. All Rights Reserved.

+ +
+ + + + diff --git a/resources/views/layouts/head.php b/resources/views/layouts/head.php new file mode 100644 index 0000000..a412db4 --- /dev/null +++ b/resources/views/layouts/head.php @@ -0,0 +1,12 @@ + + + + + + + + <?php echo $title ?? 'Welcome'; ?> + + + + diff --git a/resources/views/layouts/header.php b/resources/views/layouts/header.php new file mode 100644 index 0000000..f2dedd8 --- /dev/null +++ b/resources/views/layouts/header.php @@ -0,0 +1,3 @@ +
+ +
diff --git a/resources/views/layouts/main.php b/resources/views/layouts/main.php new file mode 100644 index 0000000..4e216c5 --- /dev/null +++ b/resources/views/layouts/main.php @@ -0,0 +1,31 @@ + + + + render('layouts/head', $data); ?> + + + render('layouts/header', $data); ?> + render('partials/navbar', $data); ?> + +
+
+
+ render('partials/sidebar', $data); ?> +
+
+ + +
+
+
+
+ render('partials/contact_form', $data); ?> +
+
+
+ + + + render('layouts/footer', $data); ?> + + diff --git a/resources/views/pages/about.php b/resources/views/pages/about.php new file mode 100644 index 0000000..44825af --- /dev/null +++ b/resources/views/pages/about.php @@ -0,0 +1,8 @@ +About Wizdom Networks

At Wizdom Networks, we specialize in delivering top-notch IT solutions to help your business thrive.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/contact.php b/resources/views/pages/contact.php new file mode 100644 index 0000000..37ec390 --- /dev/null +++ b/resources/views/pages/contact.php @@ -0,0 +1,16 @@ +Get in Touch +

We would love to hear from you. Use the form below to send us a message, or reach out via email or phone.

+
+

Email: contact@wizdom.ca

+

Phone: +1-800-123-4567

+
+HTML; + +// Add the contact form +//$content .= $this->getContactForm($data); + +$this->render('layouts/main', compact('title', 'content')); diff --git a/resources/views/pages/error.php b/resources/views/pages/error.php new file mode 100644 index 0000000..0a7e19f --- /dev/null +++ b/resources/views/pages/error.php @@ -0,0 +1,8 @@ +Page Not Found

The page you are looking for does not exist. Please check the URL or go back to the home page.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/home.php b/resources/views/pages/home.php new file mode 100644 index 0000000..23c9b38 --- /dev/null +++ b/resources/views/pages/home.php @@ -0,0 +1,33 @@ +Welcome to Wizdom Networks +

Your trusted partner for IT Consulting and Services.

+

Explore Our Services

+HTML; + +// Debugging: Log title and content length +error_log("[DEBUG] Title: $title"); +error_log("[DEBUG] Content length: " . strlen($content)); + +// Prepare data for rendering +$data = [ + 'title' => $title, + 'content' => $content, +]; + +// Debugging: Log before rendering main layout +error_log("[DEBUG] Rendering main layout with data: " . json_encode($data)); + +// Render the main layout +$this->render('layouts/main', $data); + + +// Debugging: Exit point for home.php +error_log("[DEBUG] Exiting home.php"); + diff --git a/resources/views/pages/services.php b/resources/views/pages/services.php new file mode 100644 index 0000000..1da8d73 --- /dev/null +++ b/resources/views/pages/services.php @@ -0,0 +1,4 @@ +render('layouts/main', [ + 'content' => '

Our Services

Explore our wide range of IT services designed to meet your business needs.

', + 'title' => $title ?? 'Our Services' +]); ?> diff --git a/resources/views/pages/services/emergency_support.php b/resources/views/pages/services/emergency_support.php new file mode 100644 index 0000000..a6d6f71 --- /dev/null +++ b/resources/views/pages/services/emergency_support.php @@ -0,0 +1,8 @@ +Emergency Support

We offer 24/7 emergency IT support to ensure your business operations run smoothly.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/services/it_consulting.php b/resources/views/pages/services/it_consulting.php new file mode 100644 index 0000000..9f15128 --- /dev/null +++ b/resources/views/pages/services/it_consulting.php @@ -0,0 +1,8 @@ +IT Consulting

Our IT consulting services provide businesses with tailored solutions to maximize productivity and efficiency.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/services/managed_services.php b/resources/views/pages/services/managed_services.php new file mode 100644 index 0000000..71fd864 --- /dev/null +++ b/resources/views/pages/services/managed_services.php @@ -0,0 +1,8 @@ +Managed Services

We provide end-to-end managed IT services to keep your business running efficiently.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/services/online_brand_management.php b/resources/views/pages/services/online_brand_management.php new file mode 100644 index 0000000..c5c5bd2 --- /dev/null +++ b/resources/views/pages/services/online_brand_management.php @@ -0,0 +1,8 @@ +Online Brand Management

Enhance your online presence with our expert brand management services.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/services/project_management.php b/resources/views/pages/services/project_management.php new file mode 100644 index 0000000..3f8b114 --- /dev/null +++ b/resources/views/pages/services/project_management.php @@ -0,0 +1,8 @@ +Project Management

Efficient project management to ensure your IT projects are delivered on time and within budget.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/pages/testimonials.php b/resources/views/pages/testimonials.php new file mode 100644 index 0000000..bbe039c --- /dev/null +++ b/resources/views/pages/testimonials.php @@ -0,0 +1,8 @@ +Testimonials

Here's what our clients have to say about us.

+HTML; + +$this->render('layouts/main', $data); \ No newline at end of file diff --git a/resources/views/partials/contact_form.php b/resources/views/partials/contact_form.php new file mode 100644 index 0000000..4d8b3b7 --- /dev/null +++ b/resources/views/partials/contact_form.php @@ -0,0 +1,18 @@ +
+

Contact Us

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
diff --git a/resources/views/partials/navbar.php b/resources/views/partials/navbar.php new file mode 100644 index 0000000..73065ea --- /dev/null +++ b/resources/views/partials/navbar.php @@ -0,0 +1,16 @@ + diff --git a/resources/views/partials/sidebar.php b/resources/views/partials/sidebar.php new file mode 100644 index 0000000..a1ba549 --- /dev/null +++ b/resources/views/partials/sidebar.php @@ -0,0 +1,8 @@ + diff --git a/scripts/autload-test.php b/scripts/autload-test.php new file mode 100644 index 0000000..930ba3b --- /dev/null +++ b/scripts/autload-test.php @@ -0,0 +1,7 @@ + '

Welcome to Wizdom Networks

Your trusted partner for IT Consulting and Services.

Explore Our Services

', + 'about.php' => '

About Wizdom Networks

At Wizdom Networks, we specialize in delivering top-notch IT solutions to help your business thrive.

', + 'contact.php' => '

Contact Us

', + 'testimonials.php' => '

Testimonials

Here\'s what our clients have to say about us.

', + 'error.php' => '

Page Not Found

The page you are looking for does not exist. Please check the URL or go back to the home page.

', + 'services/it_consulting.php' => '

IT Consulting

Our IT consulting services provide businesses with tailored solutions to maximize productivity and efficiency.

', + 'services/emergency_support.php' => '

Emergency Support

We offer 24/7 emergency IT support to ensure your business operations run smoothly.

', + 'services/managed_services.php' => '

Managed Services

We provide end-to-end managed IT services to keep your business running efficiently.

', + 'services/online_brand_management.php' => '

Online Brand Management

Enhance your online presence with our expert brand management services.

', + 'services/project_management.php' => '

Project Management

Efficient project management to ensure your IT projects are delivered on time and within budget.

' +]; + +// Use the agreed directory structure for pages +$basePath = realpath(__DIR__ . '/../resources/views/pages'); + +if (!$basePath) { + die("Error: The base directory for pages does not exist. Please ensure the directory structure is correct.\n"); +} + +foreach ($pages as $file => $content) { + $filePath = $basePath . '/' . $file; + $dirPath = dirname($filePath); + + // Ensure the directory exists + if (!is_dir($dirPath)) { + mkdir($dirPath, 0755, true); + echo "Created directory: $dirPath\n"; + } + + $title = ucwords(str_replace(['_', '.php'], [' ', ''], basename($file))) . ' - Wizdom Networks'; + + // Create the PHP file with the correct structure + $template = <<\n"; + exit(1); + } + + $path = $argv[1]; + $generator = new StructureGenerator(); + $generator->createStructure($path); +} diff --git a/scripts/update_namespaces.php b/scripts/update_namespaces.php new file mode 100644 index 0000000..03283ad --- /dev/null +++ b/scripts/update_namespaces.php @@ -0,0 +1,20 @@ + []\n"; + exit(1); + } + + $path = $argv[1]; + $autoloadNamespace = $argv[2] ?? null; + + $updater = new NamespaceUpdater(); + $updater->updateNamespaces($path, $autoloadNamespace); +}