From 4b4e10d2cbdab75e63f5e9826f2153c7ed6d5703 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:38:16 +1300 Subject: [PATCH 01/46] Add adapter base --- src/Messaging/Adapter.php | 76 +++++++++++++++++++++++++++++++ src/Messaging/LimitableSender.php | 13 ++++++ src/Messaging/Message.php | 10 ++++ 3 files changed, 99 insertions(+) create mode 100644 src/Messaging/Adapter.php create mode 100644 src/Messaging/LimitableSender.php create mode 100644 src/Messaging/Message.php diff --git a/src/Messaging/Adapter.php b/src/Messaging/Adapter.php new file mode 100644 index 00000000..76eff640 --- /dev/null +++ b/src/Messaging/Adapter.php @@ -0,0 +1,76 @@ +getName()} Sender"); + + if (!is_null($body)) { + \curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + } + + $response = \curl_exec($ch); + + if (\curl_errno($ch)) { + throw new \Exception('Error:' . \curl_error($ch)); + } + if (\curl_getinfo($ch, CURLINFO_HTTP_CODE) >= 400) { + throw new \Exception($response); + } + + \curl_close($ch); + + return $response; + } +} \ No newline at end of file diff --git a/src/Messaging/LimitableSender.php b/src/Messaging/LimitableSender.php new file mode 100644 index 00000000..5009a005 --- /dev/null +++ b/src/Messaging/LimitableSender.php @@ -0,0 +1,13 @@ + Date: Tue, 27 Sep 2022 15:39:04 +1300 Subject: [PATCH 02/46] Add email base adapter --- src/Messaging/Email/EmailAdapter.php | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/Messaging/Email/EmailAdapter.php diff --git a/src/Messaging/Email/EmailAdapter.php b/src/Messaging/Email/EmailAdapter.php new file mode 100644 index 00000000..d99cfa39 --- /dev/null +++ b/src/Messaging/Email/EmailAdapter.php @@ -0,0 +1,37 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->sendMessage($message); + } + + /** + * Send an email message. + * + * @param EmailMessage $message Message to send. + * @return string The response body. + */ + protected abstract function sendMessage(EmailMessage $message): string; +} \ No newline at end of file From 5534b91e74e64bd3f4bce7f19c2060e0be3def1f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:39:11 +1300 Subject: [PATCH 03/46] Add email message type --- src/Messaging/Email/EmailMessage.php | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/Messaging/Email/EmailMessage.php diff --git a/src/Messaging/Email/EmailMessage.php b/src/Messaging/Email/EmailMessage.php new file mode 100644 index 00000000..f1ece91f --- /dev/null +++ b/src/Messaging/Email/EmailMessage.php @@ -0,0 +1,75 @@ +to; + } + + /** + * @return string + */ + public function getSubject(): string + { + return $this->subject; + } + + /** + * @return string + */ + public function getContent(): string + { + return $this->content; + } + + /** + * @return string|null + */ + public function getFrom(): ?string + { + return $this->from; + } + + /** + * @return array|null + */ + public function getAttachments(): ?array + { + return $this->attachments; + } + + /** + * @return bool + */ + public function isHtml(): bool + { + return $this->html; + } +} \ No newline at end of file From 13f82ef8c5e4a3e01335c04c258be46d4bdfb63c Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:39:26 +1300 Subject: [PATCH 04/46] Add mailgun adapter --- src/Messaging/Email/Mailgun.php | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/Messaging/Email/Mailgun.php diff --git a/src/Messaging/Email/Mailgun.php b/src/Messaging/Email/Mailgun.php new file mode 100644 index 00000000..03d99ca1 --- /dev/null +++ b/src/Messaging/Email/Mailgun.php @@ -0,0 +1,49 @@ +request( + method: 'POST', + url: "https://api.mailgun.net/v3/{$this->domain}/messages", + headers: [ + 'Authorization: Basic ' . base64_encode('api:' . $this->apiKey) + ], + body: \http_build_query([ + 'from' => $message->getFrom(), + 'to' => \join(',', $message->getTo()), + 'subject' => $message->getSubject(), + 'text' => $message->isHtml() ? null : $message->getContent(), + 'html' => $message->isHtml() ? $message->getContent() : null, + ]), + ); + } +} From e4b1c413e8759647342bd9433dbc615e3ccab744 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:39:44 +1300 Subject: [PATCH 05/46] Add SMS base adapter --- src/Messaging/SMS/SMSAdapter.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/Messaging/SMS/SMSAdapter.php diff --git a/src/Messaging/SMS/SMSAdapter.php b/src/Messaging/SMS/SMSAdapter.php new file mode 100644 index 00000000..04b6fc7b --- /dev/null +++ b/src/Messaging/SMS/SMSAdapter.php @@ -0,0 +1,31 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->sendMessage($message); + } + + protected abstract function sendMessage(SMSMessage $message): string; +} \ No newline at end of file From cb69920d7d15f1b8b1db84eb92e45772ee4593e8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:39:58 +1300 Subject: [PATCH 06/46] Add SMS message type --- src/Messaging/SMS/SMSMessage.php | 51 ++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Messaging/SMS/SMSMessage.php diff --git a/src/Messaging/SMS/SMSMessage.php b/src/Messaging/SMS/SMSMessage.php new file mode 100644 index 00000000..7d84cf70 --- /dev/null +++ b/src/Messaging/SMS/SMSMessage.php @@ -0,0 +1,51 @@ +to; + } + + /** + * @return string + */ + public function getContent(): string + { + return $this->content; + } + + /** + * @return string|null + */ + public function getFrom(): ?string + { + return $this->from; + } + + /** + * @return array|null + */ + public function getAttachments(): ?array + { + return $this->attachments; + } + + +} \ No newline at end of file From c86af93192db4705912fb988f2f130bf6e83d9ee Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:40:47 +1300 Subject: [PATCH 07/46] Add Twilio adapter --- src/Messaging/SMS/TwilioAdapter.php | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Messaging/SMS/TwilioAdapter.php diff --git a/src/Messaging/SMS/TwilioAdapter.php b/src/Messaging/SMS/TwilioAdapter.php new file mode 100644 index 00000000..faa3f2e9 --- /dev/null +++ b/src/Messaging/SMS/TwilioAdapter.php @@ -0,0 +1,39 @@ +request( + method: 'POST', + url: "https://api.twilio.com/2010-04-01/Accounts/{$this->user}/Messages.json", + headers: [ + 'Authorization: Basic ' . base64_encode("{$this->user}:{$this->secret}") + ], + body: \http_build_query([ + 'Body' => $message->getContent(), + 'From' => $message->getFrom(), + 'To' => \join(',', $message->getTo()) + ]), + ); + } +} \ No newline at end of file From 405fa2cb72f613529279923d95d597394aa00e65 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:40:56 +1300 Subject: [PATCH 08/46] Add ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..485dee64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea From 490437ddc26938d3445452436d38e703cfddedb6 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:41:27 +1300 Subject: [PATCH 09/46] Add push base adapter --- src/Messaging/Push/PushAdapter.php | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/Messaging/Push/PushAdapter.php diff --git a/src/Messaging/Push/PushAdapter.php b/src/Messaging/Push/PushAdapter.php new file mode 100644 index 00000000..ecae6a0d --- /dev/null +++ b/src/Messaging/Push/PushAdapter.php @@ -0,0 +1,31 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->sendMessage($message); + } + + protected abstract function sendMessage(PushMessage $message): string; +} \ No newline at end of file From 76d651549b4453eb4762a3e756c1d9980ba8ef98 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:41:39 +1300 Subject: [PATCH 10/46] Add push message type --- src/Messaging/Push/PushMessage.php | 116 +++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/Messaging/Push/PushMessage.php diff --git a/src/Messaging/Push/PushMessage.php b/src/Messaging/Push/PushMessage.php new file mode 100644 index 00000000..40ecafea --- /dev/null +++ b/src/Messaging/Push/PushMessage.php @@ -0,0 +1,116 @@ +
On Apple platforms, if the message is sent via APNs, it represents the custom data fields. If it is sent via FCM, it would be represented as key value dictionary in AppDelegate application:didReceiveRemoteNotification:.

On Android, this would result in an intent extra named score with the string value 3x1.

The key should not be a reserved word ("from", "message_type", or any word starting with "google" or "gcm"). Do not use any of the words defined in this table (such as collapse_key).

Values in string types are recommended. You have to convert values in objects or other non-string data types (e.g., integers or booleans) to string. + * @param string|null $sound The sound to play when the device receives the notification.

On Android, sound files must reside in /res/raw/.

On iOS, sounds files must reside in the main bundle of the client app or in the Library/Sounds folder of the app's data container. + * @param string|null $action The action associated with a user click on the notification.

On Android, this is the activity to launch.

On iOS, this is the category to launch. + * @param string|null $icon Android only. The icon of the push notification. Sets the notification icon to myicon for drawable resource myicon. If you don't send this key in the request, FCM displays the launcher icon specified in your app manifest. + * @param string|null $color Android only. The icon color of the push notification, expressed in #rrggbb format. + * @param string|null $tag Android only. Identifier used to replace existing notifications in the notification drawer.

If not specified, each request creates a new notification.

If specified and a notification with the same tag is already being shown, the new notification replaces the existing one in the notification drawer. + * @param string|null $badge iOS only. The value of the badge on the home screen app icon. If not specified, the badge is not changed. If set to 0, the badge is removed. + */ + public function __construct( + private array $to, + private string $title, + private string $body, + private ?array $data = null, + private ?string $action = null, + private ?string $sound = null, + private ?string $icon = null, + private ?string $color = null, + private ?string $tag = null, + private ?string $badge = null, + + ) + { + } + + /** + * @return array + */ + public function getTo(): array + { + return $this->to; + } + + /** + * @return string + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * @return string + */ + public function getBody(): string + { + return $this->body; + } + + /** + * @return array|null + */ + public function getData(): ?array + { + return $this->data; + } + + /** + * @return string|null + */ + public function getAction(): ?string + { + return $this->action; + } + + /** + * @return string|null + */ + public function getSound(): ?string + { + return $this->sound; + } + + /** + * @return string|null + */ + public function getIcon(): ?string + { + return $this->icon; + } + + /** + * @return string|null + */ + public function getColor(): ?string + { + return $this->color; + } + + /** + * @return string|null + */ + public function getTag(): ?string + { + return $this->tag; + } + + /** + * @return string|null + */ + public function getBadge(): ?string + { + return $this->badge; + } +} \ No newline at end of file From 0190b2f724c854761b30d61dcea52abddbdfce58 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 15:43:04 +1300 Subject: [PATCH 11/46] Add FCM adapter --- src/Messaging/Push/FCM.php | 55 +++++++++++++++++++++++++++++ src/Messaging/SMS/TwilioAdapter.php | 4 +++ 2 files changed, 59 insertions(+) create mode 100644 src/Messaging/Push/FCM.php diff --git a/src/Messaging/Push/FCM.php b/src/Messaging/Push/FCM.php new file mode 100644 index 00000000..0e3560a6 --- /dev/null +++ b/src/Messaging/Push/FCM.php @@ -0,0 +1,55 @@ +request( + method: 'POST', + url: 'https://fcm.googleapis.com/fcm/send', + headers: [ + "Content-Type: application/json", + "Authorization: key={$this->serverKey}", + ], + body: \json_encode([ + 'registration_ids' => $message->getTo(), + 'notification' => [ + 'title' => $message->getTitle(), + 'body' => $message->getBody(), + 'click_action' => $message->getAction(), + 'icon' => $message->getIcon(), + 'badge' => $message->getBadge(), + 'color' => $message->getColor(), + 'sound' => $message->getSound(), + 'tag' => $message->getTag(), + ], + 'data' => $message->getData(), + ]) + ); + } +} \ No newline at end of file diff --git a/src/Messaging/SMS/TwilioAdapter.php b/src/Messaging/SMS/TwilioAdapter.php index faa3f2e9..be1efe69 100644 --- a/src/Messaging/SMS/TwilioAdapter.php +++ b/src/Messaging/SMS/TwilioAdapter.php @@ -4,6 +4,10 @@ class Twilio extends SMSAdapter { + /** + * @param string $user Twilio Account SID + * @param string $secret Twilio Auth Token + */ public function __construct( private string $user, private string $secret From 3351fd7deaa97cc7d7b236e0677e691a6b2d2fac Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 17:20:22 +1300 Subject: [PATCH 12/46] Allow mixed body for base request --- src/Messaging/Adapter.php | 7 ++----- src/Messaging/Email/Mailgun.php | 4 ++-- src/Messaging/SMS/{TwilioAdapter.php => Twilio.php} | 0 3 files changed, 4 insertions(+), 7 deletions(-) rename src/Messaging/SMS/{TwilioAdapter.php => Twilio.php} (100%) diff --git a/src/Messaging/Adapter.php b/src/Messaging/Adapter.php index 76eff640..941d188a 100644 --- a/src/Messaging/Adapter.php +++ b/src/Messaging/Adapter.php @@ -2,9 +2,6 @@ namespace Messaging; -/** - * Adapter interface for sending messages. - */ abstract class Adapter implements LimitableSender { /** @@ -43,7 +40,7 @@ protected function request( string $method, string $url, array $headers = [], - ?string $body = null, + mixed $body = null, ): string { $headers[] = 'Content-length: ' . \strlen($body); @@ -54,7 +51,7 @@ protected function request( \curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); \curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); \curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - \curl_setopt($ch, CURLOPT_USERAGENT, "Appwrite {$this->getName()} Sender"); + \curl_setopt($ch, CURLOPT_USERAGENT, "Appwrite {$this->getName()} Message Sender"); if (!is_null($body)) { \curl_setopt($ch, CURLOPT_POSTFIELDS, $body); diff --git a/src/Messaging/Email/Mailgun.php b/src/Messaging/Email/Mailgun.php index 03d99ca1..444426b7 100644 --- a/src/Messaging/Email/Mailgun.php +++ b/src/Messaging/Email/Mailgun.php @@ -37,13 +37,13 @@ protected function sendMessage(EmailMessage $message): string headers: [ 'Authorization: Basic ' . base64_encode('api:' . $this->apiKey) ], - body: \http_build_query([ + body: [ 'from' => $message->getFrom(), 'to' => \join(',', $message->getTo()), 'subject' => $message->getSubject(), 'text' => $message->isHtml() ? null : $message->getContent(), 'html' => $message->isHtml() ? $message->getContent() : null, - ]), + ], ); } } diff --git a/src/Messaging/SMS/TwilioAdapter.php b/src/Messaging/SMS/Twilio.php similarity index 100% rename from src/Messaging/SMS/TwilioAdapter.php rename to src/Messaging/SMS/Twilio.php From 995eaedb586783756e90f6c93b2c1a5ea79c74a4 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 17:39:14 +1300 Subject: [PATCH 13/46] Add composer --- composer.json | 24 +++++++++++++++++++ phpunit.xml | 17 +++++++++++++ src/{ => Utopia}/Messaging/Adapter.php | 2 +- .../Messaging/Email/EmailAdapter.php | 6 ++--- .../Messaging/Email/EmailMessage.php | 4 ++-- src/{ => Utopia}/Messaging/Email/Mailgun.php | 2 +- .../Messaging/LimitableSender.php | 2 +- src/{ => Utopia}/Messaging/Message.php | 2 +- src/{ => Utopia}/Messaging/Push/FCM.php | 2 +- .../Messaging/Push/PushAdapter.php | 6 ++--- .../Messaging/Push/PushMessage.php | 4 ++-- src/{ => Utopia}/Messaging/SMS/SMSAdapter.php | 6 ++--- src/{ => Utopia}/Messaging/SMS/SMSMessage.php | 4 ++-- src/{ => Utopia}/Messaging/SMS/Twilio.php | 2 +- 14 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 composer.json create mode 100644 phpunit.xml rename src/{ => Utopia}/Messaging/Adapter.php (98%) rename src/{ => Utopia}/Messaging/Email/EmailAdapter.php (90%) rename src/{ => Utopia}/Messaging/Email/EmailMessage.php (95%) rename src/{ => Utopia}/Messaging/Email/Mailgun.php (97%) rename src/{ => Utopia}/Messaging/LimitableSender.php (88%) rename src/{ => Utopia}/Messaging/Message.php (75%) rename src/{ => Utopia}/Messaging/Push/FCM.php (97%) rename src/{ => Utopia}/Messaging/Push/PushAdapter.php (88%) rename src/{ => Utopia}/Messaging/Push/PushMessage.php (98%) rename src/{ => Utopia}/Messaging/SMS/SMSAdapter.php (88%) rename src/{ => Utopia}/Messaging/SMS/SMSMessage.php (92%) rename src/{ => Utopia}/Messaging/SMS/Twilio.php (96%) diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..00c50aba --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "utopia-php/messaging", + "description": "A simple, light and advanced PHP messaging library", + "type": "library", + "keywords": ["php","messaging", "upf", "utopia", "utopia-php", "library"], + "license": "MIT", + "minimum-stability": "stable", + "authors": [ + { + "name": "Jake Barnby", + "email": "jake@appwrite.io" + } + ], + "autoload": { + "psr-4": {"Utopia\\": "src/"} + }, + "require": { + "php": ">=8.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10", + "vimeo/psalm": "4.13.1" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..98cc9a69 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,17 @@ + + + + ./tests/e2e/Client.php + ./tests/ + + + \ No newline at end of file diff --git a/src/Messaging/Adapter.php b/src/Utopia/Messaging/Adapter.php similarity index 98% rename from src/Messaging/Adapter.php rename to src/Utopia/Messaging/Adapter.php index 941d188a..07fa485a 100644 --- a/src/Messaging/Adapter.php +++ b/src/Utopia/Messaging/Adapter.php @@ -1,6 +1,6 @@ Date: Tue, 27 Sep 2022 18:56:28 +1300 Subject: [PATCH 14/46] Add mock SMS adapter --- src/Utopia/Messaging/SMS/Mock.php | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/Utopia/Messaging/SMS/Mock.php diff --git a/src/Utopia/Messaging/SMS/Mock.php b/src/Utopia/Messaging/SMS/Mock.php new file mode 100644 index 00000000..813dddd0 --- /dev/null +++ b/src/Utopia/Messaging/SMS/Mock.php @@ -0,0 +1,45 @@ +request( + method: 'POST', + url: 'http://request-catcher:5000/mock-sms', + headers: [ + "content-type: application/json", + "x-username: {$this->user}", + "x-key: {$this->secret}", + ], + body: \json_encode([ + 'message' => $message->getContent(), + 'from' => $message->getFrom(), + 'to' => \join(',', $message->getTo()), + ]), + ); + } +} \ No newline at end of file From 5a2a8dce649525ea8ad6eca20620e405b6bb65bf Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 18:56:40 +1300 Subject: [PATCH 15/46] Add composer --- composer.json | 17 +- composer.lock | 3594 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3609 insertions(+), 2 deletions(-) create mode 100644 composer.lock diff --git a/composer.json b/composer.json index 00c50aba..06bd792c 100644 --- a/composer.json +++ b/composer.json @@ -12,13 +12,26 @@ } ], "autoload": { - "psr-4": {"Utopia\\": "src/"} + "psr-4": { + "Utopia\\Messaging\\": "src/Utopia/Messaging" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\E2E\\": "tests/e2e", + "Tests\\Unit\\": "tests/unit" + } }, "require": { "php": ">=8.0.0" }, "require-dev": { - "phpunit/phpunit": "^9.5.10", + "phpunit/phpunit": "^9.5.20", "vimeo/psalm": "4.13.1" + }, + "config": { + "platform": { + "php": "8.0" + } } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..eaeafd50 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3594 @@ +{ + "_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": "0efd5f24e5b8a7af783639d7dbe9d827", + "packages": [], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php", + "lib/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.4", + "friendsofphp/php-cs-fixer": "^2.3", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^6 || ^7 || ^8", + "psalm/phar": "^3.11.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.5", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.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": "2022-01-17T14:14:24+00:00" + }, + { + "name": "composer/pcre", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.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/1.0.1" + }, + "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": "2022-01-21T20:24:37+00:00" + }, + { + "name": "composer/semver", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "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": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/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": "2022-04-01T19:23:25+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a", + "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a", + "shasum": "" + }, + "require": { + "composer/pcre": "^1", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + }, + "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": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.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": "2022-02-24T20:20:32+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "support": { + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + }, + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "php": "^7.1 || ^8.0", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + }, + "time": "2021-06-11T22:34:44+00:00" + }, + { + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "LanguageServerProtocol\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + } + ], + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], + "support": { + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + }, + "time": "2022-03-02T22:36:06+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "netresearch/jsonmapper", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JsonMapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" + } + ], + "description": "Map nested JSON structures onto PHP classes", + "support": { + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + }, + "time": "2020-12-01T19:48:11+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.15.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + }, + "time": "2022-09-04T07:30:47+00:00" + }, + { + "name": "openlss/lib-array2xml", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "bryan@nullivex.com", + "homepage": "https://www.nullivex.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "https://www.nullivex.com" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "https://www.nullivex.com", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "support": { + "issues": "https://github.com/nullivex/lib-array2xml/issues", + "source": "https://github.com/nullivex/lib-array2xml/tree/master" + }, + "time": "2019-03-29T20:06:56+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-08-30T12:24:04+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.25", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2022-09-25T03:44:45+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "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": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "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": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:03:37+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "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" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "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": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-12T14:47:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "symfony/console", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/7fccea8728aa2d431a6725b02b3ce759049fc84d", + "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^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/v6.1.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": "2022-08-26T10:32:31+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-02-25T11:15:52+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.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": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", + "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:18:58+00:00" + }, + { + "name": "symfony/string", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^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/v6.1.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": "2022-08-12T18:05:43+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "vimeo/psalm", + "version": "4.13.1", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/5cf660f63b548ccd4a56f62d916ee4d6028e01a3", + "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.4.2", + "amphp/byte-stream": "^1.5", + "composer/package-versions-deprecated": "^1.8.0", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^1.1 || ^2.0", + "dnoegel/php-xdg-base-dir": "^0.1.1", + "ext-ctype": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "felixfbecker/advanced-json-rpc": "^3.0.3", + "felixfbecker/language-server-protocol": "^1.5", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^4.13", + "openlss/lib-array2xml": "^1.0", + "php": "^7.1|^8", + "sebastian/diff": "^3.0 || ^4.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", + "webmozart/path-util": "^2.3" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", + "ext-curl": "*", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpdocumentor/reflection-docblock": "^5", + "phpmyadmin/sql-parser": "5.1.0||dev-master", + "phpspec/prophecy": ">=1.9.0", + "phpunit/phpunit": "^9.0", + "psalm/plugin-phpunit": "^0.16", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.3 || ^5.0 || ^6.0", + "weirdan/prophecy-shim": "^1.0 || ^2.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + }, + "bin": [ + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "dev-3.x": "3.x-dev", + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/spl_object_id.php" + ], + "psr-4": { + "Psalm\\": "src/Psalm/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Brown" + } + ], + "description": "A static analysis tool for finding errors in PHP applications", + "keywords": [ + "code", + "inspection", + "php" + ], + "support": { + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm/tree/4.13.1" + }, + "time": "2021-11-23T23:52:49+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webmozart/path-util", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/path-util.git", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "webmozart/assert": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\PathUtil\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", + "support": { + "issues": "https://github.com/webmozart/path-util/issues", + "source": "https://github.com/webmozart/path-util/tree/2.3.0" + }, + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.0.0" + }, + "platform-dev": [], + "platform-overrides": { + "php": "8.0" + }, + "plugin-api-version": "2.3.0" +} From 597a21648f28c817211859a2892a5d1d54ebf46b Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 18:56:48 +1300 Subject: [PATCH 16/46] Add docker --- Dockerfile | 25 +++++++++++++++++++++++++ docker-compose.yml | 18 ++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f56050c6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM composer:2.0 as composer + +ARG TESTING=false +ENV TESTING=$TESTING + +WORKDIR /usr/local/src/ + +COPY composer.lock /usr/local/src/ +COPY composer.json /usr/local/src/ + +RUN composer update \ + --ignore-platform-reqs \ + --optimize-autoloader \ + --no-plugins \ + --no-scripts \ + --prefer-dist + +FROM php:8.0-cli-alpine + +COPY --from=composer /usr/local/src/vendor /usr/local/src/vendor +COPY . /usr/local/src/ + +WORKDIR /usr/local/src/ + +CMD [ "tail", "-f", "/dev/null" ] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..5dc43372 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3.9' + +services: + tests: + build: + context: . + volumes: + - ./:/usr/local/src + + maildev: + image: appwrite/mailcatcher:1.0.0 + ports: + - '10000:1080' + + request-catcher: + image: appwrite/requestcatcher:1.0.0 + ports: + - '10001:5000' \ No newline at end of file From 69544d3623a65d21cc71d623d60fc1ea79c086bb Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 18:56:58 +1300 Subject: [PATCH 17/46] Add mock SMS test --- .gitignore | 2 ++ phpunit.xml | 8 +++++--- tests/e2e/Base.php | 31 +++++++++++++++++++++++++++++++ tests/e2e/SMS/SMSTest.php | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 tests/e2e/Base.php create mode 100644 tests/e2e/SMS/SMSTest.php diff --git a/.gitignore b/.gitignore index 485dee64..24265e89 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea +vendor +.phpunit.result.cache diff --git a/phpunit.xml b/phpunit.xml index 98cc9a69..8db6586a 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -9,9 +9,11 @@ stopOnFailure="false" > - - ./tests/e2e/Client.php - ./tests/ + + ./tests/unit + + + ./tests/e2e/ \ No newline at end of file diff --git a/tests/e2e/Base.php b/tests/e2e/Base.php new file mode 100644 index 00000000..2780f3be --- /dev/null +++ b/tests/e2e/Base.php @@ -0,0 +1,31 @@ +send($message); + } catch (\Exception $error) { + throw new \Exception('Error sending message: ' . $error->getMessage(), 500); + } + + $smsRequest = $this->getLastRequest(); + + $this->assertEquals('http://request-catcher:5000/mock-sms', $smsRequest['url']); + $this->assertEquals('Appwrite Mock Message Sender', $smsRequest['headers']['User-Agent']); + $this->assertEquals('username', $smsRequest['headers']['X-Username']); + $this->assertEquals('password', $smsRequest['headers']['X-Key']); + $this->assertEquals('POST', $smsRequest['method']); + $this->assertEquals('+987654321', $smsRequest['data']['from']); + $this->assertEquals('+123456789', $smsRequest['data']['to']); + } +} \ No newline at end of file From 6c0b334349beeecb261ed43675657264f12bd8dd Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:11:09 +1300 Subject: [PATCH 18/46] Add mock email adapter --- composer.json | 5 +- composer.lock | 80 ++++++++++++++++++++++++++++- src/Utopia/Messaging/Email/Mock.php | 56 ++++++++++++++++++++ 3 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 src/Utopia/Messaging/Email/Mock.php diff --git a/composer.json b/composer.json index 06bd792c..2af398bf 100644 --- a/composer.json +++ b/composer.json @@ -26,8 +26,9 @@ "php": ">=8.0.0" }, "require-dev": { - "phpunit/phpunit": "^9.5.20", - "vimeo/psalm": "4.13.1" + "phpmailer/phpmailer": "6.6.*", + "phpunit/phpunit": "9.5.*", + "vimeo/psalm": "4.13.*" }, "config": { "platform": { diff --git a/composer.lock b/composer.lock index eaeafd50..275e62c6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0efd5f24e5b8a7af783639d7dbe9d827", + "content-hash": "8d0a310d9b05f0f6626bdf8573708c8c", "packages": [], "packages-dev": [ { @@ -1162,6 +1162,84 @@ }, "time": "2022-03-15T21:29:03+00:00" }, + { + "name": "phpmailer/phpmailer", + "version": "v6.6.4", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b", + "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "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.6.2", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "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.6.4" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2022-08-22T09:22:00+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "9.2.17", diff --git a/src/Utopia/Messaging/Email/Mock.php b/src/Utopia/Messaging/Email/Mock.php new file mode 100644 index 00000000..fb82407a --- /dev/null +++ b/src/Utopia/Messaging/Email/Mock.php @@ -0,0 +1,56 @@ +isSMTP(); + $mail->XMailer = 'Utopia Mailer'; + $mail->Host = 'maildev'; + $mail->Port = 1025; + $mail->SMTPAuth = false; + $mail->Username = ''; + $mail->Password = ''; + $mail->SMTPSecure = false; + $mail->SMTPAutoTLS = false; + $mail->CharSet = 'UTF-8'; + $mail->Subject = $message->getSubject(); + $mail->Body = $message->getContent(); + $mail->AltBody = \strip_tags($message->getContent()); + $mail->setFrom($message->getFrom(), 'Utopia'); + $mail->addReplyTo($message->getFrom(), 'Utopia'); + $mail->isHTML($message->isHtml()); + + foreach ($message->getTo() as $to) { + $mail->addAddress($to); + } + + if (!$mail->send()) { + throw new \Exception($mail->ErrorInfo); + } + + return true; + } +} \ No newline at end of file From a08c44606fa0620ed2441c67ba3e6280dbf3b5f2 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:11:25 +1300 Subject: [PATCH 19/46] Add mock email test --- tests/e2e/Email/EmailTest.php | 38 +++++++++++++++++++++++++++++++++++ tests/e2e/SMS/SMSTest.php | 6 +----- 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 tests/e2e/Email/EmailTest.php diff --git a/tests/e2e/Email/EmailTest.php b/tests/e2e/Email/EmailTest.php new file mode 100644 index 00000000..e3825a0c --- /dev/null +++ b/tests/e2e/Email/EmailTest.php @@ -0,0 +1,38 @@ +send($message); + + $lastEmail = $this->getLastEmail(); + + $this->assertEquals($to, $lastEmail['to'][0]['address']); + $this->assertEquals($from, $lastEmail['from'][0]['address']); + $this->assertEquals($subject, $lastEmail['subject']); + $this->assertEquals($content, \trim($lastEmail['text'])); + } +} \ No newline at end of file diff --git a/tests/e2e/SMS/SMSTest.php b/tests/e2e/SMS/SMSTest.php index fa1936f2..6bb54837 100644 --- a/tests/e2e/SMS/SMSTest.php +++ b/tests/e2e/SMS/SMSTest.php @@ -20,11 +20,7 @@ public function testSendSMS() from: '+987654321' ); - try { - $sms->send($message); - } catch (\Exception $error) { - throw new \Exception('Error sending message: ' . $error->getMessage(), 500); - } + $sms->send($message); $smsRequest = $this->getLastRequest(); From bb15edb1ddcee378c75f7a9bf8fac94c6f68bb31 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:21:55 +1300 Subject: [PATCH 20/46] Move max message per request function to adapter base --- src/Utopia/Messaging/Adapter.php | 9 ++++++++- src/Utopia/Messaging/LimitableSender.php | 13 ------------- 2 files changed, 8 insertions(+), 14 deletions(-) delete mode 100644 src/Utopia/Messaging/LimitableSender.php diff --git a/src/Utopia/Messaging/Adapter.php b/src/Utopia/Messaging/Adapter.php index 07fa485a..1fbfcbe1 100644 --- a/src/Utopia/Messaging/Adapter.php +++ b/src/Utopia/Messaging/Adapter.php @@ -2,7 +2,7 @@ namespace Utopia\Messaging; -abstract class Adapter implements LimitableSender +abstract class Adapter { /** * Get the name of the adapter. @@ -18,6 +18,13 @@ public abstract function getName(): string; */ public abstract function getType(): string; + /** + * Get the maximum number of messages that can be sent in a single request. + * + * @return int + */ + public abstract function getMaxMessagesPerRequest(): int; + /** * Send a message. * diff --git a/src/Utopia/Messaging/LimitableSender.php b/src/Utopia/Messaging/LimitableSender.php deleted file mode 100644 index f61e13b6..00000000 --- a/src/Utopia/Messaging/LimitableSender.php +++ /dev/null @@ -1,13 +0,0 @@ - Date: Tue, 27 Sep 2022 21:39:41 +1300 Subject: [PATCH 21/46] Add github workflows + linter --- .github/ISSUE_TEMPLATE/bug.yaml | 75 + .github/ISSUE_TEMPLATE/documentation.yaml | 32 + .github/ISSUE_TEMPLATE/feature.yaml | 40 + .github/PULL_REQUEST_TEMPLATE.md | 26 + .github/workflows/linter.yml | 18 + .github/workflows/tests.yml | 18 + composer.json | 9 +- composer.lock | 3304 +++++---------------- phpcs.xml | 11 + 9 files changed, 987 insertions(+), 2546 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yaml create mode 100644 .github/ISSUE_TEMPLATE/documentation.yaml create mode 100644 .github/ISSUE_TEMPLATE/feature.yaml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/linter.yml create mode 100644 .github/workflows/tests.yml create mode 100644 phpcs.xml diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 00000000..2be9fdef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,75 @@ +name: "🐛 Bug Report" +description: "Submit a bug report to help us improve" +title: "🐛 Bug Report: " +labels: [bug] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out our bug report form 🙏 + - type: textarea + id: steps-to-reproduce + validations: + required: true + attributes: + label: "👟 Reproduction steps" + description: "How do you trigger this bug? Please walk us through it step by step." + placeholder: "When I ..." + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: "👍 Expected behavior" + description: "What did you think would happen?" + placeholder: "It should ..." + - type: textarea + id: actual-behavior + validations: + required: true + attributes: + label: "👎 Actual Behavior" + description: "What did actually happen? Add screenshots, if applicable." + placeholder: "It actually ..." + - type: textarea + id: version + attributes: + label: "🎲 Version" + description: "What version of are you running?" + validations: + required: true + - type: dropdown + id: operating-system + attributes: + label: "💻 Operating system" + description: "What OS is your server / device running on?" + options: + - Linux + - MacOS + - Windows + - Something else + validations: + required: true + - type: textarea + id: environment + validations: + required: false + attributes: + label: "🧱 Your Environment" + description: "Is your environment customized in any way?" + placeholder: "I use Cloudflare for ..." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this issue has been raised before?" + description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: "🏢 Have you read the Code of Conduct?" + options: + - label: "I have read the [Code of Conduct](https://github.com/utopia-php/messaging/blob/HEAD/CODE_OF_CONDUCT.md)" + required: true diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml new file mode 100644 index 00000000..141fbe92 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yaml @@ -0,0 +1,32 @@ +name: "📚 Documentation" +description: "Report an issue related to documentation" +title: "📚 Documentation: " +labels: [documentation] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to make our documentation better 🙏 + - type: textarea + id: issue-description + validations: + required: true + attributes: + label: "💭 Description" + description: "A clear and concise description of what the issue is." + placeholder: "Documentation should not ..." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this issue has been raised before?" + description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: "🏢 Have you read the Code of Conduct?" + options: + - label: "I have read the [Code of Conduct](https://github.com/utopia-php/messaging/blob/HEAD/CODE_OF_CONDUCT.md)" + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml new file mode 100644 index 00000000..88656130 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -0,0 +1,40 @@ +name: 🚀 Feature +description: "Submit a proposal for a new feature" +title: "🚀 Feature: " +labels: [feature] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out our feature request form 🙏 + - type: textarea + id: feature-description + validations: + required: true + attributes: + label: "🔖 Feature description" + description: "A clear and concise description of what the feature is." + placeholder: "You should add ..." + - type: textarea + id: pitch + validations: + required: true + attributes: + label: "🎤 Pitch" + description: "Please explain why this feature should be implemented and how it would be used. Add examples, if applicable." + placeholder: "In my use-case, ..." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this issue has been raised before?" + description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: "🏢 Have you read the Code of Conduct?" + options: + - label: "I have read the [Code of Conduct](https://github.com/utopia-php/messaging/blob/HEAD/CODE_OF_CONDUCT.md)" + required: true \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..faa18b5a --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ + + +## What does this PR do? + +(Provide a description of what this PR does.) + +## Test Plan + +(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work.) + +## Related PRs and Issues + +(If this PR is related to any other PR or resolves any issue or related to any issue link all related PR and issues here.) + +### Have you read the [Contributing Guidelines on issues](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md)? + +(Write your answer here.) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 00000000..4ee16844 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,18 @@ +name: "Linter" + +on: [pull_request] +jobs: + lint: + name: Linter + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 2 + - run: git checkout HEAD^2 + - name: Run Linter + run: | + docker run --rm -v $PWD:/app composer sh -c \ + "composer install --profile --ignore-platform-reqs && composer lint" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..638ced84 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,18 @@ +name: "Tests" + +on: [pull_request] +jobs: + tests: + name: Unit & E2E + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 2 + - run: git checkout HEAD^2 + - name: Run Tests + run: | + docker compose up -d --build + docker compose exec tests vendor/bin/phpunit \ No newline at end of file diff --git a/composer.json b/composer.json index 2af398bf..edf2ad73 100644 --- a/composer.json +++ b/composer.json @@ -5,6 +5,11 @@ "keywords": ["php","messaging", "upf", "utopia", "utopia-php", "library"], "license": "MIT", "minimum-stability": "stable", + "scripts": { + "test": "vendor/bin/phpunit", + "lint": "vendor/bin/phpcs", + "format": "vendor/bin/phpcbf" + }, "authors": [ { "name": "Jake Barnby", @@ -26,9 +31,9 @@ "php": ">=8.0.0" }, "require-dev": { - "phpmailer/phpmailer": "6.6.*", "phpunit/phpunit": "9.5.*", - "vimeo/psalm": "4.13.*" + "phpmailer/phpmailer": "6.6.*", + "squizlabs/php_codesniffer": "^3.6" }, "config": { "platform": { diff --git a/composer.lock b/composer.lock index 275e62c6..e3425e52 100644 --- a/composer.lock +++ b/composer.lock @@ -4,48 +4,40 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8d0a310d9b05f0f6626bdf8573708c8c", + "content-hash": "3501655e5e15c4774e6458f417309aab", "packages": [], "packages-dev": [ { - "name": "amphp/amp", - "version": "v2.6.2", + "name": "doctrine/instantiator", + "version": "1.4.1", "source": { "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { - "php": ">=7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { - "files": [ - "lib/functions.php", - "lib/Internal/functions.php" - ], "psr-4": { - "Amp\\": "lib" + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -54,1908 +46,381 @@ ], "authors": [ { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" + "constructor", + "instantiate" ], "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" } ], - "time": "2022-02-20T17:52:18+00:00" + "time": "2022-03-03T08:28:38+00:00" }, { - "name": "amphp/byte-stream", - "version": "v1.8.1", + "name": "myclabs/deep-copy", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { - "amphp/amp": "^2", - "php": ">=7.1" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.4", - "friendsofphp/php-cs-fixer": "^2.3", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^6 || ^7 || ^8", - "psalm/phar": "^3.11.4" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "files": [ - "lib/functions.php" + "src/DeepCopy/deep_copy.php" ], "psr-4": { - "Amp\\ByteStream\\": "lib" + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" } ], - "time": "2021-03-30T17:13:30+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", + "name": "nikic/php-parser", + "version": "v4.15.1", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" + "ext-tokenizer": "*", + "php": ">=7.0" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, - "type": "composer-plugin", + "bin": [ + "bin/php-parse" + ], + "type": "library", "extra": { - "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "4.9-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Nikita Popov" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" }, - "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": "2022-01-17T14:14:24+00:00" + "time": "2022-09-04T07:30:47+00:00" }, { - "name": "composer/pcre", - "version": "1.0.1", + "name": "phar-io/manifest", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", - "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5" + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "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/1.0.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "url": "https://github.com/composer", - "type": "github" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "time": "2022-01-21T20:24:37+00:00" + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" }, { - "name": "composer/semver", - "version": "3.3.2", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], + "description": "Library for handling version information and constraints", "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "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": "2022-04-01T19:23:25+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "composer/xdebug-handler", - "version": "2.0.5", + "name": "phpmailer/phpmailer", + "version": "v6.6.4", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a" + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a", - "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b", + "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b", "shasum": "" }, "require": { - "composer/pcre": "^1", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" }, "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "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.6.2", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" }, "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": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.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": "2022-02-24T20:20:32+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" - }, - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" - }, - { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "php": "^7.1 || ^8.0", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" - }, - "time": "2021-06-11T22:34:44+00:00" - }, - { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", - "source": { - "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "LanguageServerProtocol\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } - ], - "description": "PHP classes for the Language Server Protocol", - "keywords": [ - "language", - "microsoft", - "php", - "server" - ], - "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" - }, - "time": "2022-03-02T22:36:06+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" - }, - "type": "library", - "autoload": { - "psr-0": { - "JsonMapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OSL-3.0" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" - } - ], - "description": "Map nested JSON structures onto PHP classes", - "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" - }, - "time": "2020-12-01T19:48:11+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.15.1", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" - }, - "time": "2022-09-04T07:30:47+00:00" - }, - { - "name": "openlss/lib-array2xml", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "LSS": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Bryan Tong", - "email": "bryan@nullivex.com", - "homepage": "https://www.nullivex.com" - }, - { - "name": "Tony Butler", - "email": "spudz76@gmail.com", - "homepage": "https://www.nullivex.com" - } - ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", - "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" - ], - "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" - }, - "time": "2019-03-29T20:06:56+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.6.4", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a94fdebaea6bd17f51be0c2373ab80d3d681269b", - "reference": "a94fdebaea6bd17f51be0c2373ab80d3d681269b", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "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.6.2", - "yoast/phpunit-polyfills": "^1.0.0" - }, - "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" - }, - "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.6.4" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2022-08-22T09:22:00+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.17", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-08-30T12:24:04+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.25", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2022-09-25T03:44:45+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/log", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" - }, - "time": "2021-07-14T16:46:02+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] + "PHPMailer\\PHPMailer\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "LGPL-2.1-only" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "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": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.4" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/Synchro", "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2022-08-22T09:22:00+00:00" }, { - "name": "sebastian/comparator", - "version": "4.0.8", + "name": "phpunit/php-code-coverage", + "version": "9.2.17", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", "shasum": "" }, "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.14", "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -1970,31 +435,20 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ - "comparator", - "compare", - "equality" + "coverage", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" }, "funding": [ { @@ -2002,24 +456,23 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2022-08-30T12:24:04+00:00" }, { - "name": "sebastian/complexity", - "version": "2.0.2", + "name": "phpunit/php-file-iterator", + "version": "3.0.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", "php": ">=7.3" }, "require-dev": { @@ -2028,7 +481,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2047,11 +500,15 @@ "role": "lead" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -2059,33 +516,36 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "sebastian/diff", - "version": "4.0.4", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2100,24 +560,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { @@ -2125,20 +579,20 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "sebastian/environment", - "version": "5.1.4", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { @@ -2147,13 +601,10 @@ "require-dev": { "phpunit/phpunit": "^9.3" }, - "suggest": { - "ext-posix": "*" - }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2168,19 +619,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -2188,34 +638,32 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "sebastian/exporter", - "version": "4.0.5", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "php": ">=7.3" }, "require-dev": { - "ext-mbstring": "*", "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2230,34 +678,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "export", - "exporter" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -2265,41 +697,68 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { - "name": "sebastian/global-state", - "version": "5.0.5", + "name": "phpunit/phpunit", + "version": "9.5.25", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { + "doctrine/instantiator": "^1.3.1", "ext-dom": "*", - "phpunit/phpunit": "^9.3" + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" }, "suggest": { - "ext-uopz": "*" + "ext-soap": "*", + "ext-xdebug": "*" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "9.5-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -2311,42 +770,52 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "global state" + "phpunit", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" }, "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2022-09-25T03:44:45+00:00" }, { - "name": "sebastian/lines-of-code", - "version": "1.0.3", + "name": "sebastian/cli-parser", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", "php": ">=7.3" }, "require-dev": { @@ -2374,11 +843,11 @@ "role": "lead" } ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, "funding": [ { @@ -2386,26 +855,24 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2020-09-28T06:08:49+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "4.0.4", + "name": "sebastian/code-unit", + "version": "1.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" @@ -2413,7 +880,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -2428,14 +895,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "funding": [ { @@ -2443,20 +911,20 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2020-10-26T13:08:54+00:00" }, { - "name": "sebastian/object-reflector", - "version": "2.0.4", + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { @@ -2486,11 +954,11 @@ "email": "sebastian@phpunit.de" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -2498,24 +966,26 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { - "name": "sebastian/recursion-context", - "version": "4.0.4", + "name": "sebastian/comparator", + "version": "4.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" @@ -2545,15 +1015,24 @@ "email": "whatthejeff@gmail.com" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -2561,32 +1040,33 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { - "name": "sebastian/resource-operations", - "version": "3.0.3", + "name": "sebastian/complexity", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "shasum": "" }, "require": { + "nikic/php-parser": "^4.7", "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2601,14 +1081,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" }, "funding": [ { @@ -2616,32 +1097,33 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2020-10-26T15:52:27+00:00" }, { - "name": "sebastian/type", - "version": "3.2.0", + "name": "sebastian/diff", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2656,15 +1138,24 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, "funding": [ { @@ -2672,29 +1163,35 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { - "name": "sebastian/version", - "version": "3.0.2", + "name": "sebastian/environment", + "version": "5.1.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { "php": ">=7.3" }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2709,15 +1206,19 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { @@ -2725,692 +1226,515 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { - "name": "symfony/console", - "version": "v6.1.4", + "name": "sebastian/exporter", + "version": "4.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7fccea8728aa2d431a6725b02b3ce759049fc84d", - "reference": "7fccea8728aa2d431a6725b02b3ce759049fc84d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.4|^6.0" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ - "cli", - "command line", - "console", - "terminal" + "export", + "exporter" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.1.4" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-08-26T10:32:31+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.1.1", + "name": "sebastian/global-state", + "version": "5.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "5.0-dev" } }, "autoload": { - "files": [ - "function.php" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "name": "sebastian/lines-of-code", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" + "nikic/php-parser": "^4.6", + "php": ">=7.3" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "1.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2020-11-28T06:42:11+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "name": "sebastian/object-enumerator", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "name": "sebastian/object-reflector", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "2.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "name": "sebastian/recursion-context", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=7.3" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2020-10-26T13:17:30+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.1.1", + "name": "sebastian/resource-operations", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^2.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" + "php": ">=7.3" }, - "suggest": { - "symfony/service-implementation": "" + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "dev-master": "3.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-05-30T19:18:58+00:00" + "time": "2020-09-28T06:45:17+00:00" }, { - "name": "symfony/string", - "version": "v6.1.4", + "name": "sebastian/type", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", - "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.0" + "php": ">=7.3" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "phpunit/phpunit": "^9.5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "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" - ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/string/tree/v6.1.4" + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-08-12T18:05:43+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { - "name": "theseer/tokenizer", - "version": "1.2.1", + "name": "sebastian/version", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": ">=7.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -3422,238 +1746,130 @@ ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2020-09-28T06:39:44+00:00" }, { - "name": "vimeo/psalm", - "version": "4.13.1", + "name": "squizlabs/php_codesniffer", + "version": "3.7.1", "source": { "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3" + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/5cf660f63b548ccd4a56f62d916ee4d6028e01a3", - "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", "shasum": "" }, "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0", - "dnoegel/php-xdg-base-dir": "^0.1.1", - "ext-ctype": "*", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", "ext-simplexml": "*", "ext-tokenizer": "*", - "felixfbecker/advanced-json-rpc": "^3.0.3", - "felixfbecker/language-server-protocol": "^1.5", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^4.13", - "openlss/lib-array2xml": "^1.0", - "php": "^7.1|^8", - "sebastian/diff": "^3.0 || ^4.0", - "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0", - "webmozart/path-util": "^2.3" - }, - "provide": { - "psalm/psalm": "self.version" + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", - "ext-curl": "*", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpdocumentor/reflection-docblock": "^5", - "phpmyadmin/sql-parser": "5.1.0||dev-master", - "phpspec/prophecy": ">=1.9.0", - "phpunit/phpunit": "^9.0", - "psalm/plugin-phpunit": "^0.16", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/process": "^4.3 || ^5.0 || ^6.0", - "weirdan/prophecy-shim": "^1.0 || ^2.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" + "bin/phpcs", + "bin/phpcbf" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev", - "dev-3.x": "3.x-dev", - "dev-2.x": "2.x-dev", - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], - "psr-4": { - "Psalm\\": "src/Psalm/" + "dev-master": "3.x-dev" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Matthew Brown" + "name": "Greg Sherwood", + "role": "lead" } ], - "description": "A static analysis tool for finding errors in PHP applications", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ - "code", - "inspection", - "php" + "phpcs", + "standards" ], "support": { - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.13.1" + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-11-23T23:52:49+00:00" + "time": "2022-06-18T07:21:10+00:00" }, { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "theseer/tokenizer", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { - "ext-ctype": "*", + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" + "time": "2021-07-28T10:34:58+00:00" } ], "aliases": [], diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 00000000..c6f058ea --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,11 @@ + + + + ./src + ./tests + + + + * + + \ No newline at end of file From d837af73056859af71168dc3782b1be4cdd97e71 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:40:05 +1300 Subject: [PATCH 22/46] Lint --- src/Utopia/Messaging/Adapter.php | 13 ++++++------- src/Utopia/Messaging/Email/EmailAdapter.php | 4 ++-- src/Utopia/Messaging/Email/EmailMessage.php | 15 +++++++-------- src/Utopia/Messaging/Email/Mailgun.php | 3 +-- src/Utopia/Messaging/Email/Mock.php | 2 +- src/Utopia/Messaging/Push/FCM.php | 5 ++--- src/Utopia/Messaging/Push/PushAdapter.php | 4 ++-- src/Utopia/Messaging/Push/PushMessage.php | 12 +++++------- src/Utopia/Messaging/SMS/Mock.php | 5 ++--- src/Utopia/Messaging/SMS/SMSAdapter.php | 4 ++-- src/Utopia/Messaging/SMS/SMSMessage.php | 13 +++++-------- src/Utopia/Messaging/SMS/Twilio.php | 5 ++--- tests/e2e/Base.php | 2 +- tests/e2e/Email/EmailTest.php | 2 +- tests/e2e/SMS/SMSTest.php | 2 +- 15 files changed, 40 insertions(+), 51 deletions(-) diff --git a/src/Utopia/Messaging/Adapter.php b/src/Utopia/Messaging/Adapter.php index 1fbfcbe1..0e6c1a58 100644 --- a/src/Utopia/Messaging/Adapter.php +++ b/src/Utopia/Messaging/Adapter.php @@ -9,21 +9,21 @@ abstract class Adapter * * @return string */ - public abstract function getName(): string; + abstract public function getName(): string; /** * Get the type of the adapter. * * @return string */ - public abstract function getType(): string; + abstract public function getType(): string; /** * Get the maximum number of messages that can be sent in a single request. * * @return int */ - public abstract function getMaxMessagesPerRequest(): int; + abstract public function getMaxMessagesPerRequest(): int; /** * Send a message. @@ -31,7 +31,7 @@ public abstract function getMaxMessagesPerRequest(): int; * @param Message $message The message to send. * @return string The response body. */ - public abstract function send(Message $message): string; + abstract public function send(Message $message): string; /** * Send an HTTP request. @@ -48,8 +48,7 @@ protected function request( string $url, array $headers = [], mixed $body = null, - ): string - { + ): string { $headers[] = 'Content-length: ' . \strlen($body); $ch = \curl_init(); @@ -77,4 +76,4 @@ protected function request( return $response; } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Email/EmailAdapter.php b/src/Utopia/Messaging/Email/EmailAdapter.php index 17105d62..db31d993 100644 --- a/src/Utopia/Messaging/Email/EmailAdapter.php +++ b/src/Utopia/Messaging/Email/EmailAdapter.php @@ -33,5 +33,5 @@ public function send(Message $message): string * @param EmailMessage $message Message to send. * @return string The response body. */ - protected abstract function sendMessage(EmailMessage $message): string; -} \ No newline at end of file + abstract protected function sendMessage(EmailMessage $message): string; +} diff --git a/src/Utopia/Messaging/Email/EmailMessage.php b/src/Utopia/Messaging/Email/EmailMessage.php index 509ac240..dfdf2b66 100644 --- a/src/Utopia/Messaging/Email/EmailMessage.php +++ b/src/Utopia/Messaging/Email/EmailMessage.php @@ -15,14 +15,13 @@ class EmailMessage implements Message * @param bool $html Whether the message is HTML or not. */ public function __construct( - private array $to, - private string $subject, - private string $content, + private array $to, + private string $subject, + private string $content, private ?string $from = null, - private ?array $attachments = null, - private bool $html = false - ) - { + private ?array $attachments = null, + private bool $html = false + ) { } /** @@ -72,4 +71,4 @@ public function isHtml(): bool { return $this->html; } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Email/Mailgun.php b/src/Utopia/Messaging/Email/Mailgun.php index 86b23bb7..bd311ad2 100644 --- a/src/Utopia/Messaging/Email/Mailgun.php +++ b/src/Utopia/Messaging/Email/Mailgun.php @@ -11,8 +11,7 @@ class Mailgun extends EmailAdapter public function __construct( private string $apiKey, private string $domain, - ) - { + ) { } public function getName(): string diff --git a/src/Utopia/Messaging/Email/Mock.php b/src/Utopia/Messaging/Email/Mock.php index fb82407a..17dd9799 100644 --- a/src/Utopia/Messaging/Email/Mock.php +++ b/src/Utopia/Messaging/Email/Mock.php @@ -53,4 +53,4 @@ protected function sendMessage(EmailMessage $message): string return true; } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Push/FCM.php b/src/Utopia/Messaging/Push/FCM.php index f8a110e5..b196d221 100644 --- a/src/Utopia/Messaging/Push/FCM.php +++ b/src/Utopia/Messaging/Push/FCM.php @@ -9,8 +9,7 @@ class FCM extends PushAdapter */ public function __construct( private string $serverKey, - ) - { + ) { } public function getName(): string @@ -52,4 +51,4 @@ protected function sendMessage(PushMessage $message): string ]) ); } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Push/PushAdapter.php b/src/Utopia/Messaging/Push/PushAdapter.php index 06efa801..e8929dac 100644 --- a/src/Utopia/Messaging/Push/PushAdapter.php +++ b/src/Utopia/Messaging/Push/PushAdapter.php @@ -27,5 +27,5 @@ public function send(Message $message): string return $this->sendMessage($message); } - protected abstract function sendMessage(PushMessage $message): string; -} \ No newline at end of file + abstract protected function sendMessage(PushMessage $message): string; +} diff --git a/src/Utopia/Messaging/Push/PushMessage.php b/src/Utopia/Messaging/Push/PushMessage.php index 091080ae..80e985d4 100644 --- a/src/Utopia/Messaging/Push/PushMessage.php +++ b/src/Utopia/Messaging/Push/PushMessage.php @@ -19,9 +19,9 @@ class PushMessage implements Message * @param string|null $badge iOS only. The value of the badge on the home screen app icon. If not specified, the badge is not changed. If set to 0, the badge is removed. */ public function __construct( - private array $to, - private string $title, - private string $body, + private array $to, + private string $title, + private string $body, private ?array $data = null, private ?string $action = null, private ?string $sound = null, @@ -29,9 +29,7 @@ public function __construct( private ?string $color = null, private ?string $tag = null, private ?string $badge = null, - - ) - { + ) { } /** @@ -113,4 +111,4 @@ public function getBadge(): ?string { return $this->badge; } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/SMS/Mock.php b/src/Utopia/Messaging/SMS/Mock.php index 813dddd0..f07b6a4d 100644 --- a/src/Utopia/Messaging/SMS/Mock.php +++ b/src/Utopia/Messaging/SMS/Mock.php @@ -11,8 +11,7 @@ class Mock extends SMSAdapter public function __construct( private string $user, private string $secret - ) - { + ) { } public function getName(): string @@ -42,4 +41,4 @@ protected function sendMessage(SMSMessage $message): string ]), ); } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/SMS/SMSAdapter.php b/src/Utopia/Messaging/SMS/SMSAdapter.php index ae959370..1324a6f9 100644 --- a/src/Utopia/Messaging/SMS/SMSAdapter.php +++ b/src/Utopia/Messaging/SMS/SMSAdapter.php @@ -27,5 +27,5 @@ public function send(Message $message): string return $this->sendMessage($message); } - protected abstract function sendMessage(SMSMessage $message): string; -} \ No newline at end of file + abstract protected function sendMessage(SMSMessage $message): string; +} diff --git a/src/Utopia/Messaging/SMS/SMSMessage.php b/src/Utopia/Messaging/SMS/SMSMessage.php index d799a05d..26da2a47 100644 --- a/src/Utopia/Messaging/SMS/SMSMessage.php +++ b/src/Utopia/Messaging/SMS/SMSMessage.php @@ -7,12 +7,11 @@ class SMSMessage implements Message { public function __construct( - private array $to, - private string $content, + private array $to, + private string $content, private ?string $from = null, - private ?array $attachments = null, - ) - { + private ?array $attachments = null, + ) { } /** @@ -46,6 +45,4 @@ public function getAttachments(): ?array { return $this->attachments; } - - -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/SMS/Twilio.php b/src/Utopia/Messaging/SMS/Twilio.php index 80d53dd7..efcc6b8f 100644 --- a/src/Utopia/Messaging/SMS/Twilio.php +++ b/src/Utopia/Messaging/SMS/Twilio.php @@ -11,8 +11,7 @@ class Twilio extends SMSAdapter public function __construct( private string $user, private string $secret - ) - { + ) { } public function getName(): string @@ -40,4 +39,4 @@ protected function sendMessage(SMSMessage $message): string ]), ); } -} \ No newline at end of file +} diff --git a/tests/e2e/Base.php b/tests/e2e/Base.php index 2780f3be..14970e51 100644 --- a/tests/e2e/Base.php +++ b/tests/e2e/Base.php @@ -28,4 +28,4 @@ protected function getLastEmail(): array return []; } -} \ No newline at end of file +} diff --git a/tests/e2e/Email/EmailTest.php b/tests/e2e/Email/EmailTest.php index e3825a0c..79468f33 100644 --- a/tests/e2e/Email/EmailTest.php +++ b/tests/e2e/Email/EmailTest.php @@ -35,4 +35,4 @@ public function testSendEmail() $this->assertEquals($subject, $lastEmail['subject']); $this->assertEquals($content, \trim($lastEmail['text'])); } -} \ No newline at end of file +} diff --git a/tests/e2e/SMS/SMSTest.php b/tests/e2e/SMS/SMSTest.php index 6bb54837..1e5d5fe3 100644 --- a/tests/e2e/SMS/SMSTest.php +++ b/tests/e2e/SMS/SMSTest.php @@ -32,4 +32,4 @@ public function testSendSMS() $this->assertEquals('+987654321', $smsRequest['data']['from']); $this->assertEquals('+123456789', $smsRequest['data']['to']); } -} \ No newline at end of file +} From a60c759375be60f7ea43511193844bdca684bc51 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:57:11 +1300 Subject: [PATCH 23/46] Install deps instead of update --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f56050c6..7c1a9bf5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ WORKDIR /usr/local/src/ COPY composer.lock /usr/local/src/ COPY composer.json /usr/local/src/ -RUN composer update \ +RUN composer install \ --ignore-platform-reqs \ --optimize-autoloader \ --no-plugins \ From 604cd24c8dab1173b139d3341d593239c5f71d2e Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:57:21 +1300 Subject: [PATCH 24/46] Fix compose volume mounts --- docker-compose.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5dc43372..96054433 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,9 @@ services: build: context: . volumes: - - ./:/usr/local/src + - ./src:/usr/local/src/src + - ./tests:/usr/local/src/tests + - ./phpunit.xml:/usr/local/src/phpunit.xml maildev: image: appwrite/mailcatcher:1.0.0 From 5b28933d2d5196161476609b56cda589de41071a Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:57:32 +1300 Subject: [PATCH 25/46] Fix contributing refs --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index faa18b5a..29458712 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ Thank you for sending the PR! We appreciate you spending the time to work on the Help us understand your motivation by explaining why you decided to make this change. -You can learn more about contributing to appwrite here: https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md +You can learn more about contributing to appwrite here: https://github.com/utopia-php/messaging/blob/master/CONTRIBUTING.md Happy contributing! @@ -21,6 +21,6 @@ Happy contributing! (If this PR is related to any other PR or resolves any issue or related to any issue link all related PR and issues here.) -### Have you read the [Contributing Guidelines on issues](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md)? +### Have you read the [Contributing Guidelines on issues](https://github.com/utopia-php/messaging/blob/master/CONTRIBUTING.md)? (Write your answer here.) From c3a27fbf4bd8ffa8b7de38b32f2c3243749e3dff Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 21:59:27 +1300 Subject: [PATCH 26/46] Keep unit test folder --- tests/unit/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/unit/.gitkeep diff --git a/tests/unit/.gitkeep b/tests/unit/.gitkeep new file mode 100644 index 00000000..e69de29b From 2711fe19dec5b855bc7f6ff66db2fd2f58968f5e Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 27 Sep 2022 22:01:09 +1300 Subject: [PATCH 27/46] Sleep before tests --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 638ced84..901e25bf 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,4 +15,5 @@ jobs: - name: Run Tests run: | docker compose up -d --build + sleep 5 docker compose exec tests vendor/bin/phpunit \ No newline at end of file From 1f2f40704ec5b0057493a58265de02315c8c532d Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 13:19:13 +1300 Subject: [PATCH 28/46] Structure updates --- Dockerfile | 4 ++-- src/Utopia/Messaging/{ => Adapters}/Adapter.php | 4 +++- .../EmailAdapter.php => Adapters/Email/Base.php} | 15 ++++++++------- .../Messaging/{ => Adapters}/Email/Mailgun.php | 8 +++++--- .../Messaging/{ => Adapters}/Email/Mock.php | 7 ++++--- .../PushAdapter.php => Adapters/Push/Base.php} | 13 +++++++------ src/Utopia/Messaging/{ => Adapters}/Push/FCM.php | 8 +++++--- .../{SMS/SMSAdapter.php => Adapters/SMS/Base.php} | 13 +++++++------ src/Utopia/Messaging/{ => Adapters}/SMS/Mock.php | 12 +++++++++--- .../Messaging/{ => Adapters}/SMS/Twilio.php | 8 +++++--- .../EmailMessage.php => Messages/Email.php} | 6 ++---- src/Utopia/Messaging/{ => Messages}/Message.php | 2 +- .../{Push/PushMessage.php => Messages/Push.php} | 6 ++---- .../{SMS/SMSMessage.php => Messages/SMS.php} | 6 ++---- tests/e2e/Email/EmailTest.php | 10 +++++----- tests/e2e/SMS/SMSTest.php | 11 ++++++----- 16 files changed, 73 insertions(+), 60 deletions(-) rename src/Utopia/Messaging/{ => Adapters}/Adapter.php (96%) rename src/Utopia/Messaging/{Email/EmailAdapter.php => Adapters/Email/Base.php} (64%) rename src/Utopia/Messaging/{ => Adapters}/Email/Mailgun.php (87%) rename src/Utopia/Messaging/{ => Adapters}/Email/Mock.php (88%) rename src/Utopia/Messaging/{Push/PushAdapter.php => Adapters/Push/Base.php} (64%) rename src/Utopia/Messaging/{ => Adapters}/Push/FCM.php (89%) rename src/Utopia/Messaging/{SMS/SMSAdapter.php => Adapters/SMS/Base.php} (64%) rename src/Utopia/Messaging/{ => Adapters}/SMS/Mock.php (80%) rename src/Utopia/Messaging/{ => Adapters}/SMS/Twilio.php (84%) rename src/Utopia/Messaging/{Email/EmailMessage.php => Messages/Email.php} (92%) rename src/Utopia/Messaging/{ => Messages}/Message.php (69%) rename src/Utopia/Messaging/{Push/PushMessage.php => Messages/Push.php} (97%) rename src/Utopia/Messaging/{SMS/SMSMessage.php => Messages/SMS.php} (87%) diff --git a/Dockerfile b/Dockerfile index 7c1a9bf5..19d90e3a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,9 +17,9 @@ RUN composer install \ FROM php:8.0-cli-alpine +WORKDIR /usr/local/src/ + COPY --from=composer /usr/local/src/vendor /usr/local/src/vendor COPY . /usr/local/src/ -WORKDIR /usr/local/src/ - CMD [ "tail", "-f", "/dev/null" ] \ No newline at end of file diff --git a/src/Utopia/Messaging/Adapter.php b/src/Utopia/Messaging/Adapters/Adapter.php similarity index 96% rename from src/Utopia/Messaging/Adapter.php rename to src/Utopia/Messaging/Adapters/Adapter.php index 0e6c1a58..14aad43e 100644 --- a/src/Utopia/Messaging/Adapter.php +++ b/src/Utopia/Messaging/Adapters/Adapter.php @@ -1,6 +1,8 @@ getTo()) > $this->getMaxMessagesPerRequest()) { @@ -30,8 +31,8 @@ public function send(Message $message): string /** * Send an email message. * - * @param EmailMessage $message Message to send. + * @param Base $message Message to send. * @return string The response body. */ - abstract protected function sendMessage(EmailMessage $message): string; + abstract protected function sendMessage(Email $message): string; } diff --git a/src/Utopia/Messaging/Email/Mailgun.php b/src/Utopia/Messaging/Adapters/Email/Mailgun.php similarity index 87% rename from src/Utopia/Messaging/Email/Mailgun.php rename to src/Utopia/Messaging/Adapters/Email/Mailgun.php index bd311ad2..e214eb58 100644 --- a/src/Utopia/Messaging/Email/Mailgun.php +++ b/src/Utopia/Messaging/Adapters/Email/Mailgun.php @@ -1,8 +1,10 @@ request( method: 'POST', diff --git a/src/Utopia/Messaging/Email/Mock.php b/src/Utopia/Messaging/Adapters/Email/Mock.php similarity index 88% rename from src/Utopia/Messaging/Email/Mock.php rename to src/Utopia/Messaging/Adapters/Email/Mock.php index 17dd9799..a5cd88a1 100644 --- a/src/Utopia/Messaging/Email/Mock.php +++ b/src/Utopia/Messaging/Adapters/Email/Mock.php @@ -1,11 +1,12 @@ isSMTP(); diff --git a/src/Utopia/Messaging/Push/PushAdapter.php b/src/Utopia/Messaging/Adapters/Push/Base.php similarity index 64% rename from src/Utopia/Messaging/Push/PushAdapter.php rename to src/Utopia/Messaging/Adapters/Push/Base.php index e8929dac..6da347a4 100644 --- a/src/Utopia/Messaging/Push/PushAdapter.php +++ b/src/Utopia/Messaging/Adapters/Push/Base.php @@ -1,11 +1,12 @@ getTo()) > $this->getMaxMessagesPerRequest()) { @@ -27,5 +28,5 @@ public function send(Message $message): string return $this->sendMessage($message); } - abstract protected function sendMessage(PushMessage $message): string; + abstract protected function sendMessage(Push $message): string; } diff --git a/src/Utopia/Messaging/Push/FCM.php b/src/Utopia/Messaging/Adapters/Push/FCM.php similarity index 89% rename from src/Utopia/Messaging/Push/FCM.php rename to src/Utopia/Messaging/Adapters/Push/FCM.php index b196d221..0919b885 100644 --- a/src/Utopia/Messaging/Push/FCM.php +++ b/src/Utopia/Messaging/Adapters/Push/FCM.php @@ -1,8 +1,10 @@ request( method: 'POST', diff --git a/src/Utopia/Messaging/SMS/SMSAdapter.php b/src/Utopia/Messaging/Adapters/SMS/Base.php similarity index 64% rename from src/Utopia/Messaging/SMS/SMSAdapter.php rename to src/Utopia/Messaging/Adapters/SMS/Base.php index 1324a6f9..90b71f3e 100644 --- a/src/Utopia/Messaging/SMS/SMSAdapter.php +++ b/src/Utopia/Messaging/Adapters/SMS/Base.php @@ -1,11 +1,12 @@ getTo()) > $this->getMaxMessagesPerRequest()) { @@ -27,5 +28,5 @@ public function send(Message $message): string return $this->sendMessage($message); } - abstract protected function sendMessage(SMSMessage $message): string; + abstract protected function sendMessage(SMS $message): string; } diff --git a/src/Utopia/Messaging/SMS/Mock.php b/src/Utopia/Messaging/Adapters/SMS/Mock.php similarity index 80% rename from src/Utopia/Messaging/SMS/Mock.php rename to src/Utopia/Messaging/Adapters/SMS/Mock.php index f07b6a4d..088ec09c 100644 --- a/src/Utopia/Messaging/SMS/Mock.php +++ b/src/Utopia/Messaging/Adapters/SMS/Mock.php @@ -1,8 +1,10 @@ request( method: 'POST', diff --git a/src/Utopia/Messaging/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php similarity index 84% rename from src/Utopia/Messaging/SMS/Twilio.php rename to src/Utopia/Messaging/Adapters/SMS/Twilio.php index efcc6b8f..deb129e0 100644 --- a/src/Utopia/Messaging/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -1,8 +1,10 @@ request( method: 'POST', diff --git a/src/Utopia/Messaging/Email/EmailMessage.php b/src/Utopia/Messaging/Messages/Email.php similarity index 92% rename from src/Utopia/Messaging/Email/EmailMessage.php rename to src/Utopia/Messaging/Messages/Email.php index dfdf2b66..3121d4ae 100644 --- a/src/Utopia/Messaging/Email/EmailMessage.php +++ b/src/Utopia/Messaging/Messages/Email.php @@ -1,10 +1,8 @@ send($message); + $sender->send($message); $lastEmail = $this->getLastEmail(); diff --git a/tests/e2e/SMS/SMSTest.php b/tests/e2e/SMS/SMSTest.php index 1e5d5fe3..e889bc20 100644 --- a/tests/e2e/SMS/SMSTest.php +++ b/tests/e2e/SMS/SMSTest.php @@ -2,8 +2,9 @@ namespace Tests\E2E; -use Utopia\Messaging\SMS\Mock; -use Utopia\Messaging\SMS\SMSMessage; + +use Utopia\Messaging\Adapters\SMS\Mock; +use Utopia\Messaging\Messages\SMS; class SMSTest extends Base { @@ -12,15 +13,15 @@ class SMSTest extends Base */ public function testSendSMS() { - $sms = new Mock('username', 'password'); + $sender = new Mock('username', 'password'); - $message = new SMSMessage( + $message = new SMS( to: ['+123456789'], content: 'Test Content', from: '+987654321' ); - $sms->send($message); + $sender->send($message); $smsRequest = $this->getLastRequest(); From 37a693c786b24857e2cd8dc59c116b9e92a77b1b Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 13:49:51 +1300 Subject: [PATCH 29/46] Add Msg91 SMS adapter --- src/Utopia/Messaging/Adapters/Email/Base.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Base.php | 7 +++ src/Utopia/Messaging/Adapters/SMS/Msg91.php | 53 ++++++++++++++++++++ src/Utopia/Messaging/Adapters/SMS/Twilio.php | 4 ++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/Utopia/Messaging/Adapters/SMS/Msg91.php diff --git a/src/Utopia/Messaging/Adapters/Email/Base.php b/src/Utopia/Messaging/Adapters/Email/Base.php index 5f8666e2..c1f5c817 100644 --- a/src/Utopia/Messaging/Adapters/Email/Base.php +++ b/src/Utopia/Messaging/Adapters/Email/Base.php @@ -31,7 +31,7 @@ public function send(Message $message): string /** * Send an email message. * - * @param Base $message Message to send. + * @param Email $message Message to send. * @return string The response body. */ abstract protected function sendMessage(Email $message): string; diff --git a/src/Utopia/Messaging/Adapters/SMS/Base.php b/src/Utopia/Messaging/Adapters/SMS/Base.php index 90b71f3e..c6a7a697 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Base.php +++ b/src/Utopia/Messaging/Adapters/SMS/Base.php @@ -3,6 +3,7 @@ namespace Utopia\Messaging\Adapters\SMS; use Utopia\Messaging\Adapters\Adapter; +use Utopia\Messaging\Messages\Email; use Utopia\Messaging\Messages\Message; use Utopia\Messaging\Messages\SMS; @@ -28,5 +29,11 @@ public function send(Message $message): string return $this->sendMessage($message); } + /** + * Send an SMS message. + * + * @param SMS $message Message to send. + * @return string The response body. + */ abstract protected function sendMessage(SMS $message): string; } diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php new file mode 100644 index 00000000..6415787d --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -0,0 +1,53 @@ +request( + method: 'POST', + url: 'https://api.msg91.com/api/v5/flow/', + headers: [ + "content-type: application/json", + "authkey: {$this->secret}", + ], + body: \json_encode([ + 'sender' => $this->user, + 'otp' => $message->getContent(), + 'flow_id' => $message->getFrom(), + 'recipients' => [\array_map( + fn ($to) => ['mobiles' => $to], + $message->getTo() + )] + ]), + ); + } +} \ No newline at end of file diff --git a/src/Utopia/Messaging/Adapters/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php index deb129e0..9de54608 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -26,6 +26,10 @@ public function getMaxMessagesPerRequest(): int return 1; } + /** + * @inheritdoc + * @throws \Exception + */ protected function sendMessage(SMS $message): string { return $this->request( From d933a4310028dba99824824f2cd3084c3469b825 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 14:00:29 +1300 Subject: [PATCH 30/46] Add Telesign SMS adapter --- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 4 +- .../Messaging/Adapters/SMS/Telesign.php | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/Utopia/Messaging/Adapters/SMS/Telesign.php diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index 6415787d..e164694a 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -7,8 +7,8 @@ class Msg91 extends Base { /** - * @param string $user Twilio Account SID - * @param string $secret Twilio Auth Token + * @param string $user Msg91 Account User + * @param string $secret Msg91 API Key */ public function __construct( private string $user, diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php new file mode 100644 index 00000000..dc902100 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -0,0 +1,43 @@ +request( + method: 'POST', + url: 'https://rest-ww.telesign.com/v1/verify/bulk_sms', + headers: [ + 'Authorization: Basic ' . base64_encode("{$this->user}:{$this->secret}") + ], + body: [ + 'template' => $message->getContent(), + 'recipients' => \join(',', $message->getTo()) + ], + ); + } +} \ No newline at end of file From 93552df09887316e24bc7104270c392f8b054a3f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 14:44:01 +1300 Subject: [PATCH 31/46] Add Vonage SMS adapter --- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 51 ++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Utopia/Messaging/Adapters/SMS/Vonage.php diff --git a/src/Utopia/Messaging/Adapters/SMS/Vonage.php b/src/Utopia/Messaging/Adapters/SMS/Vonage.php new file mode 100644 index 00000000..f3b613a0 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/Vonage.php @@ -0,0 +1,51 @@ +request( + method: 'POST', + url: 'https://rest.nexmo.com/sms/json', + body: [ + 'text' => $message->getContent(), + 'from' => $message->getFrom(), + 'to' => \implode(',', $message->getTo()), + 'api_key' => $this->apiKey, + 'api_secret' => $this->apiSecret + ] + ); + } +} From 6bbcfe68be09d7f72dc1b8d95ecd3a6a95c36938 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 14:44:57 +1300 Subject: [PATCH 32/46] Refactor constructor params for clarity --- src/Utopia/Messaging/Adapters/Email/Mailgun.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Mock.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 16 ++++++++++------ src/Utopia/Messaging/Adapters/SMS/Telesign.php | 15 +++++++++------ src/Utopia/Messaging/Adapters/SMS/Twilio.php | 14 +++++++------- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/Utopia/Messaging/Adapters/Email/Mailgun.php b/src/Utopia/Messaging/Adapters/Email/Mailgun.php index e214eb58..9ea73325 100644 --- a/src/Utopia/Messaging/Adapters/Email/Mailgun.php +++ b/src/Utopia/Messaging/Adapters/Email/Mailgun.php @@ -40,7 +40,7 @@ protected function sendMessage(Email $message): string ], body: [ 'from' => $message->getFrom(), - 'to' => \join(',', $message->getTo()), + 'to' => \implode(',', $message->getTo()), 'subject' => $message->getSubject(), 'text' => $message->isHtml() ? null : $message->getContent(), 'html' => $message->isHtml() ? $message->getContent() : null, diff --git a/src/Utopia/Messaging/Adapters/SMS/Mock.php b/src/Utopia/Messaging/Adapters/SMS/Mock.php index 088ec09c..ff737eb7 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Mock.php +++ b/src/Utopia/Messaging/Adapters/SMS/Mock.php @@ -43,7 +43,7 @@ protected function sendMessage(SMS $message): string body: \json_encode([ 'message' => $message->getContent(), 'from' => $message->getFrom(), - 'to' => \join(',', $message->getTo()), + 'to' => \implode(',', $message->getTo()), ]), ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index e164694a..7d39211b 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -4,15 +4,18 @@ use Utopia\Messaging\Messages\SMS; +// Reference Material +// https://docs.msg91.com/p/tf9GTextN/e/7WESqQ4RLu/MSG91 + class Msg91 extends Base { /** - * @param string $user Msg91 Account User - * @param string $secret Msg91 API Key + * @param string $senderId Msg91 Sender ID + * @param string $authKey Msg91 Auth Key */ public function __construct( - private string $user, - private string $secret + private string $senderId, + private string $authKey ) { } @@ -23,6 +26,7 @@ public function getName(): string public function getMaxMessagesPerRequest(): int { + // TODO: Find real limit return 1000; } @@ -37,10 +41,10 @@ protected function sendMessage(SMS $message): string url: 'https://api.msg91.com/api/v5/flow/', headers: [ "content-type: application/json", - "authkey: {$this->secret}", + "authkey: {$this->authKey}", ], body: \json_encode([ - 'sender' => $this->user, + 'sender' => $this->senderId, 'otp' => $message->getContent(), 'flow_id' => $message->getFrom(), 'recipients' => [\array_map( diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php index dc902100..855470e9 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Telesign.php +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -4,15 +4,18 @@ use Utopia\Messaging\Messages\SMS; +// Reference Material +// https://developer.telesign.com/enterprise/reference/sendbulksms + class Telesign extends Base { /** - * @param string $user Telesign account username - * @param string $secret Telesign account password + * @param string $username Telesign account username + * @param string $password Telesign account password */ public function __construct( - private string $user, - private string $secret + private string $username, + private string $password ) { } @@ -32,11 +35,11 @@ protected function sendMessage(SMS $message): string method: 'POST', url: 'https://rest-ww.telesign.com/v1/verify/bulk_sms', headers: [ - 'Authorization: Basic ' . base64_encode("{$this->user}:{$this->secret}") + 'Authorization: Basic ' . base64_encode("{$this->username}:{$this->password}") ], body: [ 'template' => $message->getContent(), - 'recipients' => \join(',', $message->getTo()) + 'recipients' => \implode(',', $message->getTo()) ], ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php index 9de54608..112cef09 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -7,12 +7,12 @@ class Twilio extends Base { /** - * @param string $user Twilio Account SID - * @param string $secret Twilio Auth Token + * @param string $accountSid Twilio Account SID + * @param string $authToken Twilio Auth Token */ public function __construct( - private string $user, - private string $secret + private string $accountSid, + private string $authToken ) { } @@ -34,14 +34,14 @@ protected function sendMessage(SMS $message): string { return $this->request( method: 'POST', - url: "https://api.twilio.com/2010-04-01/Accounts/{$this->user}/Messages.json", + url: "https://api.twilio.com/2010-04-01/Accounts/{$this->accountSid}/Messages.json", headers: [ - 'Authorization: Basic ' . base64_encode("{$this->user}:{$this->secret}") + 'Authorization: Basic ' . base64_encode("{$this->accountSid}:{$this->authToken}") ], body: \http_build_query([ 'Body' => $message->getContent(), 'From' => $message->getFrom(), - 'To' => \join(',', $message->getTo()) + 'To' => \implode(',', $message->getTo()) ]), ); } From 1792c517c6354ec1c22e2d8e365eb23efa794421 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 14:45:07 +1300 Subject: [PATCH 33/46] Add TextMagic SMS adapter --- .../Messaging/Adapters/SMS/TextMagic.php | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/Utopia/Messaging/Adapters/SMS/TextMagic.php diff --git a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php new file mode 100644 index 00000000..f0e4c934 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php @@ -0,0 +1,52 @@ +request( + method: 'POST', + url: 'https://rest.textmagic.com/api/v2/messages', + headers: [ + "X-TM-Username: {$this->username}", + "X-TM-Key: {$this->apiKey}", + ], + body: [ + 'text' => $message->getContent(), + 'from' => $message->getFrom(), + 'phones' => \implode(',', $message->getTo()), + ], + ); + } +} From 2d92286726d96af031d5ac88af545fed0a824302 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 14:58:25 +1300 Subject: [PATCH 34/46] Update structure --- src/Utopia/Messaging/{Adapters => }/Adapter.php | 4 +--- src/Utopia/Messaging/Adapters/Email/Base.php | 5 +++-- src/Utopia/Messaging/Adapters/Push/Base.php | 5 +++-- src/Utopia/Messaging/Adapters/SMS/Base.php | 5 ++--- src/Utopia/Messaging/{Messages => }/Message.php | 2 +- src/Utopia/Messaging/Messages/Email.php | 2 ++ src/Utopia/Messaging/Messages/Push.php | 2 ++ src/Utopia/Messaging/Messages/SMS.php | 2 ++ 8 files changed, 16 insertions(+), 11 deletions(-) rename src/Utopia/Messaging/{Adapters => }/Adapter.php (96%) rename src/Utopia/Messaging/{Messages => }/Message.php (69%) diff --git a/src/Utopia/Messaging/Adapters/Adapter.php b/src/Utopia/Messaging/Adapter.php similarity index 96% rename from src/Utopia/Messaging/Adapters/Adapter.php rename to src/Utopia/Messaging/Adapter.php index 14aad43e..0e6c1a58 100644 --- a/src/Utopia/Messaging/Adapters/Adapter.php +++ b/src/Utopia/Messaging/Adapter.php @@ -1,8 +1,6 @@ Date: Wed, 28 Sep 2022 15:01:06 +1300 Subject: [PATCH 35/46] Lint --- src/Utopia/Messaging/Adapters/Email/Base.php | 1 - src/Utopia/Messaging/Adapters/Push/Base.php | 1 - src/Utopia/Messaging/Adapters/SMS/Msg91.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Telesign.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 3 +-- tests/e2e/SMS/SMSTest.php | 1 - 6 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Utopia/Messaging/Adapters/Email/Base.php b/src/Utopia/Messaging/Adapters/Email/Base.php index aec154d8..ddf9a609 100644 --- a/src/Utopia/Messaging/Adapters/Email/Base.php +++ b/src/Utopia/Messaging/Adapters/Email/Base.php @@ -2,7 +2,6 @@ namespace Utopia\Messaging\Adapters\Email; - use Utopia\Messaging\Adapter; use Utopia\Messaging\Message; use Utopia\Messaging\Messages\Email; diff --git a/src/Utopia/Messaging/Adapters/Push/Base.php b/src/Utopia/Messaging/Adapters/Push/Base.php index 293f479a..4457c51d 100644 --- a/src/Utopia/Messaging/Adapters/Push/Base.php +++ b/src/Utopia/Messaging/Adapters/Push/Base.php @@ -2,7 +2,6 @@ namespace Utopia\Messaging\Adapters\Push; - use Utopia\Messaging\Adapter; use Utopia\Messaging\Message; use Utopia\Messaging\Messages\Push; diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index 7d39211b..a38960a9 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -54,4 +54,4 @@ protected function sendMessage(SMS $message): string ]), ); } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php index 855470e9..53e1e181 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Telesign.php +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -43,4 +43,4 @@ protected function sendMessage(SMS $message): string ], ); } -} \ No newline at end of file +} diff --git a/src/Utopia/Messaging/Adapters/SMS/Vonage.php b/src/Utopia/Messaging/Adapters/SMS/Vonage.php index f3b613a0..7c9b5faf 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Vonage.php +++ b/src/Utopia/Messaging/Adapters/SMS/Vonage.php @@ -16,8 +16,7 @@ class Vonage extends Base public function __construct( private string $apiKey, private string $apiSecret - ) - { + ) { } public function getName(): string diff --git a/tests/e2e/SMS/SMSTest.php b/tests/e2e/SMS/SMSTest.php index e889bc20..b7cdb8be 100644 --- a/tests/e2e/SMS/SMSTest.php +++ b/tests/e2e/SMS/SMSTest.php @@ -2,7 +2,6 @@ namespace Tests\E2E; - use Utopia\Messaging\Adapters\SMS\Mock; use Utopia\Messaging\Messages\SMS; From bcb67aeac1088afe92ba3e9354fb777900203147 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 15:14:36 +1300 Subject: [PATCH 36/46] Add Sendgrid email adapter --- .../Messaging/Adapters/Email/Sendgrid.php | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/Utopia/Messaging/Adapters/Email/Sendgrid.php diff --git a/src/Utopia/Messaging/Adapters/Email/Sendgrid.php b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php new file mode 100644 index 00000000..86715530 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php @@ -0,0 +1,55 @@ +request( + method: 'POST', + url: 'https://api.sendgrid.com/v3/mail/send', + headers: [ + 'Authorization: Bearer ' . $this->apiKey, + 'Content-Type: application/json', + ], + body: \json_encode([ + 'personalizations' => [ + [ + 'to' => \array_map( + fn($to) => ['email' => $to], + $message->getTo() + ), + 'subject' => $message->getSubject(), + ], + ], + 'from' => [ + 'email' => $message->getFrom(), + ], + 'content' => [ + [ + 'type' => $message->isHtml() ? 'text/html' : 'text/plain', + 'value' => $message->getContent(), + ], + ], + ]), + ); + } +} From 52bc71093f0f689a4d5ab1081645ceff07e9c21d Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 15:51:05 +1300 Subject: [PATCH 37/46] Add + to twilio requests --- src/Utopia/Messaging/Adapters/SMS/Twilio.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Utopia/Messaging/Adapters/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php index 112cef09..17758e98 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -40,8 +40,8 @@ protected function sendMessage(SMS $message): string ], body: \http_build_query([ 'Body' => $message->getContent(), - 'From' => $message->getFrom(), - 'To' => \implode(',', $message->getTo()) + 'From' => '+' . $message->getFrom(), + 'To' => '+' . $message->getTo()[0] ]), ); } From 3e5eb897e2531a11026324103ea781b5d99539e7 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 19:36:59 +1300 Subject: [PATCH 38/46] Add curl ext dependency --- composer.json | 3 +- src/Utopia/Messaging/Adapters/Email/Base.php | 38 -------------------- src/Utopia/Messaging/Adapters/Push/Base.php | 32 ----------------- src/Utopia/Messaging/Adapters/SMS/Base.php | 38 -------------------- 4 files changed, 2 insertions(+), 109 deletions(-) delete mode 100644 src/Utopia/Messaging/Adapters/Email/Base.php delete mode 100644 src/Utopia/Messaging/Adapters/Push/Base.php delete mode 100644 src/Utopia/Messaging/Adapters/SMS/Base.php diff --git a/composer.json b/composer.json index edf2ad73..e94220b3 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,8 @@ } }, "require": { - "php": ">=8.0.0" + "php": ">=8.0.0", + "ext-curl": "*" }, "require-dev": { "phpunit/phpunit": "9.5.*", diff --git a/src/Utopia/Messaging/Adapters/Email/Base.php b/src/Utopia/Messaging/Adapters/Email/Base.php deleted file mode 100644 index ddf9a609..00000000 --- a/src/Utopia/Messaging/Adapters/Email/Base.php +++ /dev/null @@ -1,38 +0,0 @@ -getTo()) > $this->getMaxMessagesPerRequest()) { - throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); - } - return $this->sendMessage($message); - } - - /** - * Send an email message. - * - * @param Email $message Message to send. - * @return string The response body. - */ - abstract protected function sendMessage(Email $message): string; -} diff --git a/src/Utopia/Messaging/Adapters/Push/Base.php b/src/Utopia/Messaging/Adapters/Push/Base.php deleted file mode 100644 index 4457c51d..00000000 --- a/src/Utopia/Messaging/Adapters/Push/Base.php +++ /dev/null @@ -1,32 +0,0 @@ -getTo()) > $this->getMaxMessagesPerRequest()) { - throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); - } - return $this->sendMessage($message); - } - - abstract protected function sendMessage(Push $message): string; -} diff --git a/src/Utopia/Messaging/Adapters/SMS/Base.php b/src/Utopia/Messaging/Adapters/SMS/Base.php deleted file mode 100644 index 0d291a8e..00000000 --- a/src/Utopia/Messaging/Adapters/SMS/Base.php +++ /dev/null @@ -1,38 +0,0 @@ -getTo()) > $this->getMaxMessagesPerRequest()) { - throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); - } - return $this->sendMessage($message); - } - - /** - * Send an SMS message. - * - * @param SMS $message Message to send. - * @return string The response body. - */ - abstract protected function sendMessage(SMS $message): string; -} From 1c91ea8d019fd56debadca3bf9eb14fa0553348a Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 19:51:34 +1300 Subject: [PATCH 39/46] Update structure --- src/Utopia/Messaging/Adapters/Email/Email.php | 37 +++++++++++++++++++ .../Messaging/Adapters/Email/Mailgun.php | 4 +- src/Utopia/Messaging/Adapters/Email/Mock.php | 4 +- .../Messaging/Adapters/Email/Sendgrid.php | 4 +- src/Utopia/Messaging/Adapters/Push/FCM.php | 4 +- src/Utopia/Messaging/Adapters/Push/Push.php | 37 +++++++++++++++++++ src/Utopia/Messaging/Adapters/SMS/Mock.php | 4 +- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 4 +- src/Utopia/Messaging/Adapters/SMS/SMS.php | 37 +++++++++++++++++++ .../Messaging/Adapters/SMS/Telesign.php | 8 +++- .../Messaging/Adapters/SMS/TextMagic.php | 4 +- src/Utopia/Messaging/Adapters/SMS/Twilio.php | 8 ++-- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 4 +- 13 files changed, 137 insertions(+), 22 deletions(-) create mode 100644 src/Utopia/Messaging/Adapters/Email/Email.php create mode 100644 src/Utopia/Messaging/Adapters/Push/Push.php create mode 100644 src/Utopia/Messaging/Adapters/SMS/SMS.php diff --git a/src/Utopia/Messaging/Adapters/Email/Email.php b/src/Utopia/Messaging/Adapters/Email/Email.php new file mode 100644 index 00000000..236b4855 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/Email/Email.php @@ -0,0 +1,37 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->process($message); + } + + /** + * Process an email message. + * + * @param \Utopia\Messaging\Messages\Email $message Message to process. + * @return string The response body. + */ + abstract protected function process(\Utopia\Messaging\Messages\Email $message): string; +} diff --git a/src/Utopia/Messaging/Adapters/Email/Mailgun.php b/src/Utopia/Messaging/Adapters/Email/Mailgun.php index 9ea73325..4c083188 100644 --- a/src/Utopia/Messaging/Adapters/Email/Mailgun.php +++ b/src/Utopia/Messaging/Adapters/Email/Mailgun.php @@ -4,7 +4,7 @@ use Utopia\Messaging\Messages\Email; -class Mailgun extends Base +class Mailgun extends \Utopia\Messaging\Adapters\Email\Email { /** * @param string $apiKey Your Mailgun API key to authenticate with the API. @@ -30,7 +30,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(Email $message): string + protected function process(Email $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/Email/Mock.php b/src/Utopia/Messaging/Adapters/Email/Mock.php index a5cd88a1..708d8890 100644 --- a/src/Utopia/Messaging/Adapters/Email/Mock.php +++ b/src/Utopia/Messaging/Adapters/Email/Mock.php @@ -6,7 +6,7 @@ use PHPMailer\PHPMailer\PHPMailer; use Utopia\Messaging\Messages\Email; -class Mock extends Base +class Mock extends \Utopia\Messaging\Adapters\Email\Email { public function getName(): string { @@ -24,7 +24,7 @@ public function getMaxMessagesPerRequest(): int * @throws Exception * @throws \Exception */ - protected function sendMessage(Email $message): string + protected function process(Email $message): string { $mail = new PHPMailer(); $mail->isSMTP(); diff --git a/src/Utopia/Messaging/Adapters/Email/Sendgrid.php b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php index 86715530..ce253721 100644 --- a/src/Utopia/Messaging/Adapters/Email/Sendgrid.php +++ b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php @@ -4,7 +4,7 @@ use Utopia\Messaging\Messages\Email; -class Sendgrid extends Base +class Sendgrid extends \Utopia\Messaging\Adapters\Email\Email { public function __construct( private string $apiKey, @@ -21,7 +21,7 @@ public function getMaxMessagesPerRequest(): int return 1000; } - protected function sendMessage(Email $message): string + protected function process(Email $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/Push/FCM.php b/src/Utopia/Messaging/Adapters/Push/FCM.php index 0919b885..59752d0b 100644 --- a/src/Utopia/Messaging/Adapters/Push/FCM.php +++ b/src/Utopia/Messaging/Adapters/Push/FCM.php @@ -4,7 +4,7 @@ use Utopia\Messaging\Messages\Push; -class FCM extends Base +class FCM extends \Utopia\Messaging\Adapters\Push\Push { /** * @param string $serverKey The FCM server key. @@ -28,7 +28,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(Push $message): string + protected function process(Push $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/Push/Push.php b/src/Utopia/Messaging/Adapters/Push/Push.php new file mode 100644 index 00000000..6d6415f9 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/Push/Push.php @@ -0,0 +1,37 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->process($message); + } + + /** + * Send a push message. + * + * @param \Utopia\Messaging\Messages\Push $message Message to process. + * @return string The response body. + */ + abstract protected function process(\Utopia\Messaging\Messages\Push $message): string; +} diff --git a/src/Utopia/Messaging/Adapters/SMS/Mock.php b/src/Utopia/Messaging/Adapters/SMS/Mock.php index ff737eb7..f5dd640d 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Mock.php +++ b/src/Utopia/Messaging/Adapters/SMS/Mock.php @@ -4,7 +4,7 @@ use Utopia\Messaging\Messages\SMS; -class Mock extends Base +class Mock extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $user User ID @@ -30,7 +30,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(SMS $message): string + protected function process(SMS $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index a38960a9..c5e2f6de 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -7,7 +7,7 @@ // Reference Material // https://docs.msg91.com/p/tf9GTextN/e/7WESqQ4RLu/MSG91 -class Msg91 extends Base +class Msg91 extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $senderId Msg91 Sender ID @@ -34,7 +34,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(SMS $message): string + protected function process(SMS $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/SMS/SMS.php b/src/Utopia/Messaging/Adapters/SMS/SMS.php new file mode 100644 index 00000000..bf3f4a54 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/SMS.php @@ -0,0 +1,37 @@ +getTo()) > $this->getMaxMessagesPerRequest()) { + throw new \Exception("{$this->getName()} can only send {$this->getMaxMessagesPerRequest()} messages per request."); + } + return $this->process($message); + } + + /** + * Send an SMS message. + * + * @param \Utopia\Messaging\Messages\SMS $message Message to send. + * @return string The response body. + */ + abstract protected function process(\Utopia\Messaging\Messages\SMS $message): string; +} diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php index 53e1e181..616a4f6c 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Telesign.php +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -7,7 +7,7 @@ // Reference Material // https://developer.telesign.com/enterprise/reference/sendbulksms -class Telesign extends Base +class Telesign extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $username Telesign account username @@ -29,7 +29,11 @@ public function getMaxMessagesPerRequest(): int return 1000; } - protected function sendMessage(SMS $message): string + /** + * @inheritdoc + * @throws \Exception + */ + protected function process(SMS $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php index f0e4c934..5fd7bb48 100644 --- a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php +++ b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php @@ -7,7 +7,7 @@ use Utopia\Messaging\Messages\SMS; -class TextMagic extends Base +class TextMagic extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $username TextMagic account username @@ -33,7 +33,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(SMS $message): string + protected function process(SMS $message): string { return $this->request( method: 'POST', diff --git a/src/Utopia/Messaging/Adapters/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php index 17758e98..de112e90 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -4,7 +4,7 @@ use Utopia\Messaging\Messages\SMS; -class Twilio extends Base +class Twilio extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $accountSid Twilio Account SID @@ -30,7 +30,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(SMS $message): string + protected function process(SMS $message): string { return $this->request( method: 'POST', @@ -40,8 +40,8 @@ protected function sendMessage(SMS $message): string ], body: \http_build_query([ 'Body' => $message->getContent(), - 'From' => '+' . $message->getFrom(), - 'To' => '+' . $message->getTo()[0] + 'From' => $message->getFrom(), + 'To' => $message->getTo()[0] ]), ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/Vonage.php b/src/Utopia/Messaging/Adapters/SMS/Vonage.php index 7c9b5faf..ddddee89 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Vonage.php +++ b/src/Utopia/Messaging/Adapters/SMS/Vonage.php @@ -7,7 +7,7 @@ use Utopia\Messaging\Messages\SMS; -class Vonage extends Base +class Vonage extends \Utopia\Messaging\Adapters\SMS\SMS { /** * @param string $apiKey Vonage API Key @@ -33,7 +33,7 @@ public function getMaxMessagesPerRequest(): int * @inheritdoc * @throws \Exception */ - protected function sendMessage(SMS $message): string + protected function process(SMS $message): string { return $this->request( method: 'POST', From a5f707afb5c7265383381dcb8792a73646332734 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 19:57:01 +1300 Subject: [PATCH 40/46] Add get message type function --- src/Utopia/Messaging/Adapter.php | 7 +++++++ src/Utopia/Messaging/Adapters/Email/Email.php | 12 +++++++++--- src/Utopia/Messaging/Adapters/Push/Push.php | 12 +++++++++--- src/Utopia/Messaging/Adapters/SMS/SMS.php | 12 +++++++++--- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/Utopia/Messaging/Adapter.php b/src/Utopia/Messaging/Adapter.php index 0e6c1a58..83422709 100644 --- a/src/Utopia/Messaging/Adapter.php +++ b/src/Utopia/Messaging/Adapter.php @@ -18,6 +18,13 @@ abstract public function getName(): string; */ abstract public function getType(): string; + /** + * Get the type of the message the adapter can send. + * + * @return string + */ + abstract public function getMessageType(): string; + /** * Get the maximum number of messages that can be sent in a single request. * diff --git a/src/Utopia/Messaging/Adapters/Email/Email.php b/src/Utopia/Messaging/Adapters/Email/Email.php index 236b4855..b916b136 100644 --- a/src/Utopia/Messaging/Adapters/Email/Email.php +++ b/src/Utopia/Messaging/Adapters/Email/Email.php @@ -4,6 +4,7 @@ use Utopia\Messaging\Adapter; use Utopia\Messaging\Message; +use Utopia\Messaging\Messages\Email as EmailMessage; abstract class Email extends Adapter { @@ -12,13 +13,18 @@ public function getType(): string return 'email'; } + public function getMessageType(): string + { + return EmailMessage::class; + } + /** * @inheritdoc * @throws \Exception */ public function send(Message $message): string { - if (!($message instanceof \Utopia\Messaging\Messages\Email)) { + if (!\is_a($message, $this->getMessageType())) { throw new \Exception('Invalid message type.'); } if (\count($message->getTo()) > $this->getMaxMessagesPerRequest()) { @@ -30,8 +36,8 @@ public function send(Message $message): string /** * Process an email message. * - * @param \Utopia\Messaging\Messages\Email $message Message to process. + * @param EmailMessage $message Message to process. * @return string The response body. */ - abstract protected function process(\Utopia\Messaging\Messages\Email $message): string; + abstract protected function process(EmailMessage $message): string; } diff --git a/src/Utopia/Messaging/Adapters/Push/Push.php b/src/Utopia/Messaging/Adapters/Push/Push.php index 6d6415f9..6130b358 100644 --- a/src/Utopia/Messaging/Adapters/Push/Push.php +++ b/src/Utopia/Messaging/Adapters/Push/Push.php @@ -4,6 +4,7 @@ use Utopia\Messaging\Adapter; use Utopia\Messaging\Message; +use Utopia\Messaging\Messages\Push as PushMessage; abstract class Push extends Adapter { @@ -12,13 +13,18 @@ public function getType(): string return 'push'; } + public function getMessageType(): string + { + return PushMessage::class; + } + /** * @inheritdoc * @throws \Exception */ public function send(Message $message): string { - if (!($message instanceof \Utopia\Messaging\Messages\Push)) { + if (!\is_a($message, $this->getMessageType())) { throw new \Exception('Invalid message type.'); } if (\count($message->getTo()) > $this->getMaxMessagesPerRequest()) { @@ -30,8 +36,8 @@ public function send(Message $message): string /** * Send a push message. * - * @param \Utopia\Messaging\Messages\Push $message Message to process. + * @param PushMessage $message Message to process. * @return string The response body. */ - abstract protected function process(\Utopia\Messaging\Messages\Push $message): string; + abstract protected function process(PushMessage $message): string; } diff --git a/src/Utopia/Messaging/Adapters/SMS/SMS.php b/src/Utopia/Messaging/Adapters/SMS/SMS.php index bf3f4a54..ff5d0c0d 100644 --- a/src/Utopia/Messaging/Adapters/SMS/SMS.php +++ b/src/Utopia/Messaging/Adapters/SMS/SMS.php @@ -4,6 +4,7 @@ use Utopia\Messaging\Adapter; use Utopia\Messaging\Message; +use Utopia\Messaging\Messages\SMS as SMSMessage; abstract class SMS extends Adapter { @@ -12,13 +13,18 @@ public function getType(): string return 'sms'; } + public function getMessageType(): string + { + return SMSMessage::class; + } + /** * @inheritdoc * @throws \Exception */ public function send(Message $message): string { - if (!($message instanceof \Utopia\Messaging\Messages\SMS)) { + if (!\is_a($message, $this->getMessageType())) { throw new \Exception('Invalid message type.'); } if (\count($message->getTo()) > $this->getMaxMessagesPerRequest()) { @@ -30,8 +36,8 @@ public function send(Message $message): string /** * Send an SMS message. * - * @param \Utopia\Messaging\Messages\SMS $message Message to send. + * @param SMSMessage $message Message to send. * @return string The response body. */ - abstract protected function process(\Utopia\Messaging\Messages\SMS $message): string; + abstract protected function process(SMSMessage $message): string; } From cbad65e2c0f0d34b85919ad3015815c236e86583 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 19:57:43 +1300 Subject: [PATCH 41/46] Import aliases --- src/Utopia/Messaging/Adapters/Email/Mailgun.php | 3 ++- src/Utopia/Messaging/Adapters/Email/Mock.php | 3 ++- src/Utopia/Messaging/Adapters/Email/Sendgrid.php | 3 ++- src/Utopia/Messaging/Adapters/Push/FCM.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/Mock.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/Telesign.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/TextMagic.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/Twilio.php | 3 ++- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 3 ++- 10 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/Utopia/Messaging/Adapters/Email/Mailgun.php b/src/Utopia/Messaging/Adapters/Email/Mailgun.php index 4c083188..411d1c4b 100644 --- a/src/Utopia/Messaging/Adapters/Email/Mailgun.php +++ b/src/Utopia/Messaging/Adapters/Email/Mailgun.php @@ -3,8 +3,9 @@ namespace Utopia\Messaging\Adapters\Email; use Utopia\Messaging\Messages\Email; +use Utopia\Messaging\Adapters\Email\Email as EmailAdapter; -class Mailgun extends \Utopia\Messaging\Adapters\Email\Email +class Mailgun extends EmailAdapter { /** * @param string $apiKey Your Mailgun API key to authenticate with the API. diff --git a/src/Utopia/Messaging/Adapters/Email/Mock.php b/src/Utopia/Messaging/Adapters/Email/Mock.php index 708d8890..35669321 100644 --- a/src/Utopia/Messaging/Adapters/Email/Mock.php +++ b/src/Utopia/Messaging/Adapters/Email/Mock.php @@ -5,8 +5,9 @@ use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\PHPMailer; use Utopia\Messaging\Messages\Email; +use Utopia\Messaging\Adapters\Email\Email as EmailAdapter; -class Mock extends \Utopia\Messaging\Adapters\Email\Email +class Mock extends EmailAdapter { public function getName(): string { diff --git a/src/Utopia/Messaging/Adapters/Email/Sendgrid.php b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php index ce253721..c2e580e4 100644 --- a/src/Utopia/Messaging/Adapters/Email/Sendgrid.php +++ b/src/Utopia/Messaging/Adapters/Email/Sendgrid.php @@ -3,8 +3,9 @@ namespace Utopia\Messaging\Adapters\Email; use Utopia\Messaging\Messages\Email; +use Utopia\Messaging\Adapters\Email\Email as EmailAdapter; -class Sendgrid extends \Utopia\Messaging\Adapters\Email\Email +class Sendgrid extends EmailAdapter { public function __construct( private string $apiKey, diff --git a/src/Utopia/Messaging/Adapters/Push/FCM.php b/src/Utopia/Messaging/Adapters/Push/FCM.php index 59752d0b..32a1fa2d 100644 --- a/src/Utopia/Messaging/Adapters/Push/FCM.php +++ b/src/Utopia/Messaging/Adapters/Push/FCM.php @@ -3,8 +3,9 @@ namespace Utopia\Messaging\Adapters\Push; use Utopia\Messaging\Messages\Push; +use Utopia\Messaging\Adapters\Push\Push as PushAdapter; -class FCM extends \Utopia\Messaging\Adapters\Push\Push +class FCM extends PushAdapter { /** * @param string $serverKey The FCM server key. diff --git a/src/Utopia/Messaging/Adapters/SMS/Mock.php b/src/Utopia/Messaging/Adapters/SMS/Mock.php index f5dd640d..7f66495e 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Mock.php +++ b/src/Utopia/Messaging/Adapters/SMS/Mock.php @@ -3,8 +3,9 @@ namespace Utopia\Messaging\Adapters\SMS; use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; -class Mock extends \Utopia\Messaging\Adapters\SMS\SMS +class Mock extends SMSAdapter { /** * @param string $user User ID diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index c5e2f6de..fdcfb9a1 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -3,11 +3,12 @@ namespace Utopia\Messaging\Adapters\SMS; use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; // Reference Material // https://docs.msg91.com/p/tf9GTextN/e/7WESqQ4RLu/MSG91 -class Msg91 extends \Utopia\Messaging\Adapters\SMS\SMS +class Msg91 extends SMSAdapter { /** * @param string $senderId Msg91 Sender ID diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php index 616a4f6c..43e6e70f 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Telesign.php +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -3,11 +3,12 @@ namespace Utopia\Messaging\Adapters\SMS; use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; // Reference Material // https://developer.telesign.com/enterprise/reference/sendbulksms -class Telesign extends \Utopia\Messaging\Adapters\SMS\SMS +class Telesign extends SMSAdapter { /** * @param string $username Telesign account username diff --git a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php index 5fd7bb48..af084948 100644 --- a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php +++ b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php @@ -6,8 +6,9 @@ // https://www.textmagic.com/docs/api/send-sms/#How-to-send-bulk-text-messages use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; -class TextMagic extends \Utopia\Messaging\Adapters\SMS\SMS +class TextMagic extends SMSAdapter { /** * @param string $username TextMagic account username diff --git a/src/Utopia/Messaging/Adapters/SMS/Twilio.php b/src/Utopia/Messaging/Adapters/SMS/Twilio.php index de112e90..3090c8c7 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Twilio.php +++ b/src/Utopia/Messaging/Adapters/SMS/Twilio.php @@ -3,8 +3,9 @@ namespace Utopia\Messaging\Adapters\SMS; use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; -class Twilio extends \Utopia\Messaging\Adapters\SMS\SMS +class Twilio extends SMSAdapter { /** * @param string $accountSid Twilio Account SID diff --git a/src/Utopia/Messaging/Adapters/SMS/Vonage.php b/src/Utopia/Messaging/Adapters/SMS/Vonage.php index ddddee89..e388b337 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Vonage.php +++ b/src/Utopia/Messaging/Adapters/SMS/Vonage.php @@ -6,8 +6,9 @@ // https://www.textmagic.com/docs/api/send-sms/#How-to-send-bulk-text-messages use Utopia\Messaging\Messages\SMS; +use Utopia\Messaging\Adapters\SMS\SMS as SMSAdapter; -class Vonage extends \Utopia\Messaging\Adapters\SMS\SMS +class Vonage extends SMSAdapter { /** * @param string $apiKey Vonage API Key From 3d04104fb8db3d4433e388c47975b31ce09159d6 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 28 Sep 2022 20:29:03 +1300 Subject: [PATCH 42/46] Strip '+' where required --- composer.lock | 5 +++-- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 10 ++++++---- src/Utopia/Messaging/Adapters/SMS/Telesign.php | 7 ++++++- src/Utopia/Messaging/Adapters/SMS/TextMagic.php | 9 +++++++-- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 7 ++++++- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index e3425e52..88f16b81 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3501655e5e15c4774e6458f417309aab", + "content-hash": "e33a07c2dd4a4d32669369f3e04a7a21", "packages": [], "packages-dev": [ { @@ -1878,7 +1878,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.0.0" + "php": ">=8.0.0", + "ext-curl": "*" }, "platform-dev": [], "platform-overrides": { diff --git a/src/Utopia/Messaging/Adapters/SMS/Msg91.php b/src/Utopia/Messaging/Adapters/SMS/Msg91.php index fdcfb9a1..282b26c3 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Msg91.php +++ b/src/Utopia/Messaging/Adapters/SMS/Msg91.php @@ -37,6 +37,11 @@ public function getMaxMessagesPerRequest(): int */ protected function process(SMS $message): string { + $to = \array_map( + fn($to) => ['mobiles' => \ltrim($to, '+')], + $message->getTo() + ); + return $this->request( method: 'POST', url: 'https://api.msg91.com/api/v5/flow/', @@ -48,10 +53,7 @@ protected function process(SMS $message): string 'sender' => $this->senderId, 'otp' => $message->getContent(), 'flow_id' => $message->getFrom(), - 'recipients' => [\array_map( - fn ($to) => ['mobiles' => $to], - $message->getTo() - )] + 'recipients' => [$to] ]), ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/Telesign.php b/src/Utopia/Messaging/Adapters/SMS/Telesign.php index 43e6e70f..9d79b2b0 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Telesign.php +++ b/src/Utopia/Messaging/Adapters/SMS/Telesign.php @@ -36,6 +36,11 @@ public function getMaxMessagesPerRequest(): int */ protected function process(SMS $message): string { + $to = \array_map( + fn($to) => \ltrim($to, '+'), + $message->getTo() + ); + return $this->request( method: 'POST', url: 'https://rest-ww.telesign.com/v1/verify/bulk_sms', @@ -44,7 +49,7 @@ protected function process(SMS $message): string ], body: [ 'template' => $message->getContent(), - 'recipients' => \implode(',', $message->getTo()) + 'recipients' => \implode(',', $to) ], ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php index af084948..7a772d8f 100644 --- a/src/Utopia/Messaging/Adapters/SMS/TextMagic.php +++ b/src/Utopia/Messaging/Adapters/SMS/TextMagic.php @@ -36,6 +36,11 @@ public function getMaxMessagesPerRequest(): int */ protected function process(SMS $message): string { + $to = \array_map( + fn($to) => \ltrim($to, '+'), + $message->getTo() + ); + return $this->request( method: 'POST', url: 'https://rest.textmagic.com/api/v2/messages', @@ -45,8 +50,8 @@ protected function process(SMS $message): string ], body: [ 'text' => $message->getContent(), - 'from' => $message->getFrom(), - 'phones' => \implode(',', $message->getTo()), + 'from' => \ltrim($message->getFrom(), '+'), + 'phones' => \implode(',', $to), ], ); } diff --git a/src/Utopia/Messaging/Adapters/SMS/Vonage.php b/src/Utopia/Messaging/Adapters/SMS/Vonage.php index e388b337..19fe8d7e 100644 --- a/src/Utopia/Messaging/Adapters/SMS/Vonage.php +++ b/src/Utopia/Messaging/Adapters/SMS/Vonage.php @@ -36,13 +36,18 @@ public function getMaxMessagesPerRequest(): int */ protected function process(SMS $message): string { + $to = \array_map( + fn($to) => \ltrim($to, '+'), + $message->getTo() + ); + return $this->request( method: 'POST', url: 'https://rest.nexmo.com/sms/json', body: [ 'text' => $message->getContent(), 'from' => $message->getFrom(), - 'to' => \implode(',', $message->getTo()), + 'to' => \implode(',', $to), 'api_key' => $this->apiKey, 'api_secret' => $this->apiSecret ] From e85775ac3784acf8cf2abc5ab7f8c0a9be8090b0 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 29 Sep 2022 00:42:17 +1300 Subject: [PATCH 43/46] Update structure --- src/Utopia/Messaging/Adapters/{Email => }/Email.php | 2 +- src/Utopia/Messaging/Adapters/Email/Mailgun.php | 2 +- src/Utopia/Messaging/Adapters/Email/Mock.php | 2 +- src/Utopia/Messaging/Adapters/Email/Sendgrid.php | 2 +- src/Utopia/Messaging/Adapters/{Push => }/Push.php | 2 +- src/Utopia/Messaging/Adapters/Push/FCM.php | 2 +- src/Utopia/Messaging/Adapters/{SMS => }/SMS.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Mock.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Msg91.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Telesign.php | 2 +- src/Utopia/Messaging/Adapters/SMS/TextMagic.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Twilio.php | 2 +- src/Utopia/Messaging/Adapters/SMS/Vonage.php | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) rename src/Utopia/Messaging/Adapters/{Email => }/Email.php (96%) rename src/Utopia/Messaging/Adapters/{Push => }/Push.php (96%) rename src/Utopia/Messaging/Adapters/{SMS => }/SMS.php (96%) diff --git a/src/Utopia/Messaging/Adapters/Email/Email.php b/src/Utopia/Messaging/Adapters/Email.php similarity index 96% rename from src/Utopia/Messaging/Adapters/Email/Email.php rename to src/Utopia/Messaging/Adapters/Email.php index b916b136..4cfff3fc 100644 --- a/src/Utopia/Messaging/Adapters/Email/Email.php +++ b/src/Utopia/Messaging/Adapters/Email.php @@ -1,6 +1,6 @@ Date: Thu, 29 Sep 2022 12:44:59 +1300 Subject: [PATCH 44/46] Add Twilio Notify SMS adapter --- .../Messaging/Adapters/SMS/TwilioNotify.php | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php diff --git a/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php b/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php new file mode 100644 index 00000000..6be874e5 --- /dev/null +++ b/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php @@ -0,0 +1,52 @@ +request( + method: 'POST', + url: "https://notify.twilio.com/v1/Services/{$this->serviceSid}/Notifications", + headers: [ + 'Authorization: Basic ' . base64_encode("{$this->accountSid}:{$this->authToken}") + ], + body: \http_build_query([ + 'Body' => $message->getContent(), + 'ToBinding' => \json_encode(\array_map( + fn($to) => ['binding_type' => 'sms', 'address' => $to], + $message->getTo() + )), + ]), + ); + } +} From 249faf99c9104ed860402d921686f65b683cb4e1 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 29 Sep 2022 22:44:37 +1300 Subject: [PATCH 45/46] Add readme --- README.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..149dda4e --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# Utopia Messaging + +[![Build Status](https://travis-ci.org/utopia-php/abuse.svg?branch=master)](https://travis-ci.com/utopia-php/database) +![Total Downloads](https://img.shields.io/packagist/dt/utopia-php/messaging.svg) +[![Discord](https://img.shields.io/discord/564160730845151244?label=discord)](https://appwrite.io/discord) + +Utopia Messaging library is simple and lite library for sending messages using multiple messaging adapters. This library is aiming to be as simple and easy to learn and use. This library is maintained by the [Appwrite team](https://appwrite.io). + +Although this library is part of the [Utopia Framework](https://github.com/utopia-php/framework) project it is dependency free, and can be used as standalone with any other PHP project or framework. + +## Getting Started + +Install using composer: +```bash +composer require utopia-php/messaging +``` + +## Email + +```php +Hello World' +); + +$messaging = new Sendgrid('YOUR_API_KEY'); +$messaging->send($message); + +$messaging = new Mailgun('YOUR_API_KEY', 'YOUR_DOMAIN'); +$messaging->send($message); +``` + +## SMS + +```php +send($message); + +$messaging = new Telesign('YOUR_USERNAME', 'YOUR_PASSWORD'); +$messaging->send($message); +``` + +## Push + +```php +send($message); +``` + +## Adapters + +### Email +- [x] [SendGrid](https://sendgrid.com/) +- [x] [Mailgun](https://www.mailgun.com/) +- [ ] [Mailjet](https://www.mailjet.com/) +- [ ] [Mailchimp](https://www.mailchimp.com/) +- [ ] [Postmark](https://postmarkapp.com/) +- [ ] [SparkPost](https://www.sparkpost.com/) +- [ ] [SendinBlue](https://www.sendinblue.com/) +- [ ] [MailSlurp](https://www.mailslurp.com/) +- [ ] [ElasticEmail](https://elasticemail.com/) +- [ ] [SES](https://aws.amazon.com/ses/) + +### SMS +- [x] [Twilio](https://www.twilio.com/) +- [x] [Twilio Notify](https://www.twilio.com/notify) +- [x] [Telesign](https://www.telesign.com/) +- [x] [TextMagic](https://www.textmagic.com/) +- [x] [Msg91](https://msg91.com/) +- [x] [Vonage](https://www.vonage.com/) +- [ ] [Plivo](https://www.plivo.com/) +- [ ] [Infobip](https://www.infobip.com/) +- [ ] [Clickatell](https://www.clickatell.com/) +- [ ] [AfricasTalking](https://africastalking.com/) +- [ ] [Sinch](https://www.sinch.com/) +- [ ] [Sms77](https://www.sms77.io/) +- [ ] [SmsGlobal](https://www.smsglobal.com/) + +### Push +- [x] [FCM](https://firebase.google.com/docs/cloud-messaging) +- [ ] [APNS](https://developer.apple.com/documentation/usernotifications) +- [ ] [OneSignal](https://onesignal.com/) +- [ ] [Pusher](https://pusher.com/) +- [ ] [WebPush](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) +- [ ] [UrbanAirship](https://www.urbanairship.com/) +- [ ] [Pushwoosh](https://www.pushwoosh.com/) +- [ ] [PushBullet](https://www.pushbullet.com/) +- [ ] [Pushy](https://pushy.me/) + +## System Requirements + +Utopia Messaging requires PHP 8.0 or later. We recommend using the latest PHP version whenever possible. + +## Tests + +To run all unit tests, use the following Docker command: + +```bash +composer test +``` + +To run static code analysis, use the following Psalm command: + +```bash +composer lint +``` + +## Authors + +**Jake Barnby** + ++ [https://github.com/abnegate](https://github.com/abnegate) ++ [https://nz.linkedin.com/in/jakebarnby](https://nz.linkedin.com/in/jakebarnby) + +## Copyright and license + +The MIT License (MIT) [http://www.opensource.org/licenses/mit-license.php](http://www.opensource.org/licenses/mit-license.php) From b68972f491b770de6974e346858aa5a5ee5d4ce4 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 29 Sep 2022 22:47:47 +1300 Subject: [PATCH 46/46] Add adding new adapter guide --- README.md | 2 + docs/add-new-adapter.md | 150 ++++++++++++++++++ .../Messaging/Adapters/SMS/TwilioNotify.php | 2 +- 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 docs/add-new-adapter.md diff --git a/README.md b/README.md index 149dda4e..3baa3047 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ $messaging->send($message); ## Adapters +> Want to implement any of the missing adapters or have an idea for another? We would love to hear from you! Please check out our [contribution guide](./CONTRIBUTING.md) and [new adapter guide](./docs/add-new-adapter.md) for more information. + ### Email - [x] [SendGrid](https://sendgrid.com/) - [x] [Mailgun](https://www.mailgun.com/) diff --git a/docs/add-new-adapter.md b/docs/add-new-adapter.md new file mode 100644 index 00000000..a720bbc0 --- /dev/null +++ b/docs/add-new-adapter.md @@ -0,0 +1,150 @@ +# Adding A New Messaging Adapter + +This document is a part of Utopia PHP contributors guide. Before you continue reading this document make sure you have read the [Code of Conduct](../CODE_OF_CONDUCT.md) and the [Contribution Guide](../CONTRIBUTING.md). + +## Getting Started + +Messaging adapter allow utilization of different messaging services in a consistent way. This document will guide you through the process of adding a new messaging adapter to the Utopia PHP Messaging library. + +## 1. Prerequisites + +It's really easy to contribute to an open source project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of `utopia-php/messaging`, where you can make any changes without affecting the upstream repository right away. + +> If you are experienced with GitHub or have made a pull request before, you can skip to [Implement A New Messaging Adapter](#2-implement-new-messaging-adapter). + +### 1.1 Fork The Repository + +Before making any changes, you will need to fork the `utopia-php/messaging` repository to keep branches on the upstream repo clean. To do that, visit the [repository](https://github.com/utopia-php/messaging) and click the **Fork** button. + +This will redirect you from `github.com/utopia-php/messaging` to `github.com/YOUR_USERNAME/messaging`, meaning all further changes will reflect on your copy of the repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using either a Git UI or the `git clone` command: + +```shell +$ git clone COPIED_URL +``` + +> To fork a repository, you will need the git-cli binaries installed and a basic understanding of CLI. If you are a beginner, we recommend you to use `Github Desktop`. It is a clean and simple visual Git client. + +Finally, you will need to create a `feat-XXX-YYY-messaging-adapter` branch based on the `master` branch and switch to it. The `XXX` should represent the issue ID and `YYY` the Storage adapter name. + +## 2. Implement A New Messaging Adapter + +In order to start implementing a new messaging adapter, add new file inside `src/Utopia/Messaging/Adapters/XXX/YYY.php` where `XXX` is the type of adapter (**Email**, **SMS** or **Push**), and `YYY` is the name of the messaging provider in `PascalCase` casing. Inside the file you should create a class that extends the base `Email`, `SMS` or `Push` abstract adapter class. + +Inside the class, you need to implement four methods: + +- `__construct()` - This method should accept all the required parameters for the adapter to work. For example, the `SendGrid` adapter requires an API key, so the constructor should look like this: + +```php +public function __construct(private string $apiKey) +``` + +- `getName()` - This method should return the display name of the adapter. For example, the `SendGrid` adapter should return `SendGrid`: + +```php +public function getName(): string +{ + return 'SendGrid'; +} +``` + +- `getMaxMessagesPerRequest()` - This method should return the maximum number of messages that can be sent in a single request. For example, `SendGrid` can send 1000 messages per request, so this method should return 1000: + +```php +public function getMaxMessagesPerRequest(): int +{ + return 1000; +} +``` + +- `process()` - This method should accept a message object of the same type as the base adapter, and send it to the messaging provider, returning the response as a string. For example, the `SendGrid` adapter should accept an `Email` message object and send it to the SendGrid API: + +```php +public function process(Email $message): string +{ + // Send message to SendGrid API +} +``` + +The base `Adapter` class includes a helper method called `request()` that can be used to send HTTP requests to the messaging provider. It accepts the following parameters, and returns the response as a string: + +- `method` - The HTTP method to use. For example, `POST`, `GET`, `PUT`, `PATCH` or `DELETE`. +- `url` - The URL to send the request to. +- `headers` - An array of headers to send with the request. +- `body` - The body of the request. It can be either a string or an array. + +The default content type of the request is `x-www-form-urlencoded`, but you can change it by adding a `Content-Type` header. No encoding is applied to the body, so you need to make sure it is encoded properly before sending the request. + +Putting it all together, the `SendGrid` adapter should look like this: + +### Full Example + +```php +request( + method: 'POST', + url: 'https://api.sendgrid.com/v3/mail/send', + headers: [ + 'Content-Type: application/json', + 'Authorization: Bearer ' . $this->apiKey, + ], + body: \json_encode([ + 'personalizations' => [ + [ + 'to' => \array_map( + fn($to) => ['email' => $to], + $message->getTo() + ), + 'subject' => $message->getSubject(), + ], + ], + 'from' => [ + 'email' => $message->getFrom(), + ], + 'content' => [ + [ + 'type' => $message->isHtml() ? 'text/html' : 'text/plain', + 'value' => $message->getContent(), + ], + ], + ]), + ); + } +} +``` + +## 3. Test your adapter + +After you finish adding your new adapter, you need to ensure that it is usable. Use your newly created adapter to make some sample requests to your messaging service. + +If everything goes well, raise a pull request and be ready to respond to any feedback which can arise during code review. + +## 4. Raise a pull request + +First of all, commit the changes with the message `Added YYY Storage adapter` and push it. This will publish a new branch to your forked version of `utopia-php/messaging`. If you visit it at `github.com/YOUR_USERNAME/messaging`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. + +## 🤕 Stuck ? +If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. diff --git a/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php b/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php index 6be874e5..64e07d8c 100644 --- a/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php +++ b/src/Utopia/Messaging/Adapters/SMS/TwilioNotify.php @@ -20,7 +20,7 @@ public function __construct( public function getName(): string { - return 'Twilio'; + return 'Twilio Notify'; } public function getMaxMessagesPerRequest(): int