├── .gitattributes ├── src ├── Exceptions │ ├── BaseException.php │ ├── ApiException.php │ └── ValidationException.php ├── Contracts │ └── HttpClient.php ├── Source.php ├── Providers │ ├── GuzzleClientFactory.php │ ├── LaravelServiceProvider.php │ ├── PaymentService.php │ ├── InvoiceService.php │ └── HttpClient.php ├── OnlineResource.php ├── PaginationResult.php ├── Facades │ ├── Payment.php │ └── Invoice.php ├── Sadad.php ├── ApplePay.php ├── StcPay.php ├── CreditCard.php ├── Moyasar.php ├── Search.php ├── Resource.php ├── Invoice.php └── Payment.php ├── config └── config.php ├── announcements └── 001.md ├── LICENSE ├── composer.json ├── CHANGELOG.md ├── README.md └── composer.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | /.gitignore export-ignore 2 | /tests export-ignore 3 | /phpunit.xml export-ignore 4 | -------------------------------------------------------------------------------- /src/Exceptions/BaseException.php: -------------------------------------------------------------------------------- 1 | type; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Providers/GuzzleClientFactory.php: -------------------------------------------------------------------------------- 1 | options()); 13 | } 14 | 15 | public function options() 16 | { 17 | return [ 18 | 'base_uri' => Moyasar::CURRENT_VERSION_URL, 19 | 'auth' => [Moyasar::getApiKey(), ''] 20 | ]; 21 | } 22 | } -------------------------------------------------------------------------------- /src/OnlineResource.php: -------------------------------------------------------------------------------- 1 | client = $client; 26 | } 27 | } -------------------------------------------------------------------------------- /src/PaginationResult.php: -------------------------------------------------------------------------------- 1 | result = $result; 23 | return $this; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Facades/Payment.php: -------------------------------------------------------------------------------- 1 | type = $type; 22 | $this->errors = $errors; 23 | } 24 | 25 | public function type() 26 | { 27 | return $this->type; 28 | } 29 | 30 | public function errors() 31 | { 32 | return $this->errors; 33 | } 34 | } -------------------------------------------------------------------------------- /src/Exceptions/ValidationException.php: -------------------------------------------------------------------------------- 1 | $value) { 19 | $errorMessages .= $key . ': ' . implode(', ', $value) . "\n"; 20 | } 21 | 22 | $message .= "\nErrors:\n" . $errorMessages; 23 | 24 | parent::__construct($message, $code, $previous); 25 | 26 | $this->errors = $errors; 27 | } 28 | 29 | public function errors() 30 | { 31 | return $this->errors; 32 | } 33 | } -------------------------------------------------------------------------------- /src/ApplePay.php: -------------------------------------------------------------------------------- 1 | env('MOYASAR_API_KEY'), 17 | 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Moyasar Publishable API Key 22 | |-------------------------------------------------------------------------- 23 | | 24 | | This key is used for payment forms on the frontend 25 | | 26 | | 27 | | 28 | */ 29 | 30 | 'publishable_key' => env('MOYASAR_API_PUBLISHABLE_KEY'), 31 | 32 | ]; 33 | -------------------------------------------------------------------------------- /src/CreditCard.php: -------------------------------------------------------------------------------- 1 | 21 | ``` 22 | 23 | Now you can typehint `PaymentService` or `InvoiceService` in your controllers or use the `Payment` or `Invoice` facades. 24 | 25 | Checkout our [API Documentation](https://moyasar.com/docs/api/) or our Github repository for more details [moyasar-php](https://github.com/moyasar/moyasar-php) 26 | 27 | Happy coding friends 👋 28 | -------------------------------------------------------------------------------- /src/Moyasar.php: -------------------------------------------------------------------------------- 1 | app->bind('moyasar-http-client', function ($app) { 18 | return (new GuzzleClientFactory)->build(); 19 | }); 20 | 21 | $this->app->bind(\Moyasar\Contracts\HttpClient::class, function ($app) { 22 | return new HttpClient($app->make('moyasar-http-client')); 23 | }); 24 | 25 | $this->app->bind(PaymentService::class, function ($app) { 26 | return new PaymentService($app->make(\Moyasar\Contracts\HttpClient::class)); 27 | }); 28 | 29 | $this->app->bind(InvoiceService::class, function ($app) { 30 | return new InvoiceService($app->make(\Moyasar\Contracts\HttpClient::class)); 31 | }); 32 | } 33 | 34 | /** 35 | * Bootstrap any application services. 36 | * 37 | * @return void 38 | * @throws \Illuminate\Contracts\Container\BindingResolutionException 39 | */ 40 | public function boot() 41 | { 42 | $path = realpath(__DIR__ . '/../../config/config.php'); 43 | 44 | $this->publishes([$path => config_path('moyasar.php')], 'config'); 45 | 46 | $this->mergeConfigFrom($path, 'moyasar'); 47 | 48 | $config = $this->app->make('config'); 49 | 50 | Moyasar::setApiKey($config->get('moyasar.key')); 51 | Moyasar::setPublishableApiKey($config->get('moyasar.publishable_key')); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Providers/PaymentService.php: -------------------------------------------------------------------------------- 1 | client = $client; 26 | } 27 | 28 | /** 29 | * Fetches a payment from Moyasar servers 30 | * 31 | * @param string $id 32 | * @return Payment 33 | * @throws \GuzzleHttp\Exception\GuzzleException 34 | * @throws \Moyasar\Exceptions\ApiException 35 | */ 36 | public function fetch($id) 37 | { 38 | $response = $this->client->get(self::PAYMENT_PATH . "/$id"); 39 | $payment = Payment::fromArray($response['body_assoc']); 40 | $payment->setClient($this->client); 41 | return $payment; 42 | } 43 | 44 | /** 45 | * Fetches all payments from Moyasar servers 46 | * 47 | * @param Search|array|null $query 48 | * @return PaginationResult 49 | * @throws \GuzzleHttp\Exception\GuzzleException 50 | * @throws \Moyasar\Exceptions\ApiException 51 | */ 52 | public function all($query = null) 53 | { 54 | if ($query instanceof Search) { 55 | $query = $query->toArray(); 56 | } 57 | 58 | $response = $this->client->get(self::PAYMENT_PATH, $query); 59 | $data = $response['body_assoc']; 60 | $meta = $data['meta']; 61 | $payments = array_map(function ($i) { 62 | $payment = Payment::fromArray($i); 63 | $payment->setClient($this->client); 64 | return $payment; 65 | }, $data['payments']); 66 | 67 | return PaginationResult::fromArray($meta)->setResult($payments); 68 | } 69 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moyasar/moyasar", 3 | "description": "PHP/Laravel wrapper library for Moyasar payment services", 4 | "keywords": [ 5 | "moyasar", 6 | "payment", 7 | "invoice", 8 | "pay", 9 | "refund", 10 | "visa", 11 | "mada", 12 | "master", 13 | "card", 14 | "sadad", 15 | "laravel", 16 | "apple", 17 | "pay", 18 | "capture", 19 | "void", 20 | "credit" 21 | ], 22 | "type": "library", 23 | "license": "MIT", 24 | "prefer-stable": true, 25 | "minimum-stability": "dev", 26 | "authors": [ 27 | { 28 | "name": "Ali Alhoshaiyan", 29 | "email": "alialhoshaiyan@gmail.com" 30 | }, 31 | { 32 | "name": "Sohib H Algotimel", 33 | "email": "s@sgh.sa", 34 | "homepage": "https://sgh.sa" 35 | }, 36 | { 37 | "name": "Moyasar Development Team", 38 | "email": "developers@moyasar.com", 39 | "homepage": "https://moyasar.com/" 40 | } 41 | ], 42 | "require": { 43 | "php": "^7.2|^8.0", 44 | "guzzlehttp/guzzle": "^6.3|^7.0", 45 | "ext-json": "*", 46 | "guzzlehttp/psr7": "^2.1.1" 47 | }, 48 | "require-dev": { 49 | "phpunit/phpunit": "^8.5.19|^9.5.8", 50 | "mockery/mockery": "^1.2.4" 51 | }, 52 | "suggest": { 53 | "laravel/framework": "Allows Moyasar payment services to be auto injected into current app container" 54 | }, 55 | "autoload": { 56 | "psr-4": { 57 | "Moyasar\\": "src/" 58 | } 59 | }, 60 | "autoload-dev": { 61 | "psr-4": { 62 | "Tests\\": "tests/" 63 | } 64 | }, 65 | "extra": { 66 | "laravel": { 67 | "aliases": { 68 | "Payment": "Moyasar\\Facades\\Payment", 69 | "Invoice": "Moyasar\\Facades\\Invoice" 70 | }, 71 | "providers": [ 72 | "Moyasar\\Providers\\LaravelServiceProvider" 73 | ] 74 | } 75 | }, 76 | "scripts": { 77 | "test": "phpunit --colors=always", 78 | "test:ci": "composer test -- --verbose --coverage-text --coverage-clover=coverage.xml" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/Search.php: -------------------------------------------------------------------------------- 1 | id = $id; 61 | return $this; 62 | } 63 | 64 | public function source($source) 65 | { 66 | $this->source = $source; 67 | return $this; 68 | } 69 | 70 | public function status($status) 71 | { 72 | $this->status = $status; 73 | return $this; 74 | } 75 | 76 | public function page($page) 77 | { 78 | $this->page = $page; 79 | return $this; 80 | } 81 | 82 | public function createdAfter($date) 83 | { 84 | $this->createdAfter = $date; 85 | return $this; 86 | } 87 | 88 | public function createdBefore($date) 89 | { 90 | $this->createdBefore = $date; 91 | return $this; 92 | } 93 | 94 | public function toArray() 95 | { 96 | $result = []; 97 | 98 | if ($this->id !== null) $result['id'] = $this->id; 99 | if ($this->source !== null) $result['source'] = $this->source; 100 | if ($this->status !== null) $result['status'] = $this->status; 101 | if ($this->page !== null) $result['page'] = $this->page; 102 | if ($this->createdAfter !== null) $result['created[gt]'] = $this->createdAfter; 103 | if ($this->createdBefore !== null) $result['created[lt]'] = $this->createdBefore; 104 | 105 | return $result; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/Resource.php: -------------------------------------------------------------------------------- 1 | updateFromArray($items); 63 | 64 | return $instance; 65 | } 66 | 67 | /** 68 | * Creates a Sadad instance using provided data 69 | * 70 | * @param string $json 71 | * @return self 72 | */ 73 | public static function fromJson($json) 74 | { 75 | return static::fromArray(json_decode($json, true)); 76 | } 77 | 78 | /** 79 | * Transform instance property (complex) to a basic type 80 | * 81 | * @param string $key 82 | * @param mixed $value 83 | * @return mixed 84 | */ 85 | protected static function transformBack($key, $value) 86 | { 87 | return $value; 88 | } 89 | 90 | /** 91 | * Update the current instance from an array 92 | * 93 | * @param array $items 94 | */ 95 | protected function updateFromArray($items) 96 | { 97 | foreach ($items as $key => $value) { 98 | if (array_intersect([$key], $this->skipProps)) { 99 | continue; 100 | } 101 | 102 | try { 103 | $this->{static::snakeToCamel($key)} = static::transform($key, $value); 104 | } catch (\Exception $_) {} 105 | } 106 | } 107 | 108 | /** 109 | * Convert the current instance to an array of basic types 110 | * 111 | * @return array 112 | */ 113 | public function toSnakeArray() 114 | { 115 | $instanceProps = get_object_vars($this); 116 | 117 | $data = []; 118 | 119 | foreach ($instanceProps as $key => $value) { 120 | if ($key == 'skipProps') { 121 | continue; 122 | } 123 | 124 | if (array_intersect([$key], $this->skipProps)) { 125 | continue; 126 | } 127 | 128 | $data[static::camelToSnake($key)] = static::transformBack($key, $value); 129 | } 130 | 131 | return $data; 132 | } 133 | 134 | /** 135 | * Convert the current instance to a JSON string 136 | * 137 | * @return false|string 138 | */ 139 | public function toJson() 140 | { 141 | return json_encode($this->toSnakeArray()); 142 | } 143 | } -------------------------------------------------------------------------------- /src/Providers/InvoiceService.php: -------------------------------------------------------------------------------- 1 | client = $client; 27 | } 28 | 29 | /** 30 | * Creates a new invoice at Moyasar and return an Invoice object 31 | * 32 | * @param array $arguments 33 | * @return Invoice 34 | * @throws ValidationException 35 | * @throws \GuzzleHttp\Exception\GuzzleException 36 | * @throws \Moyasar\Exceptions\ApiException 37 | */ 38 | public function create($arguments) 39 | { 40 | $arguments = array_merge($this->defaultCreateArguments(), $arguments); 41 | $this->validateCreateArguments($arguments); 42 | 43 | $response = $this->client->post(self::INVOICE_PATH, $arguments); 44 | $data = $response['body_assoc']; 45 | 46 | $invoice = Invoice::fromArray($data); 47 | $invoice->setClient($this->client); 48 | return $invoice; 49 | } 50 | 51 | /** 52 | * Default values for invoice create 53 | * 54 | * @return array 55 | */ 56 | private function defaultCreateArguments() 57 | { 58 | return [ 59 | 'currency' => 'SAR' 60 | ]; 61 | } 62 | 63 | /** 64 | * Validates arguments meant to be used with invoice create 65 | * 66 | * @param $arguments 67 | * @throws ValidationException 68 | */ 69 | private function validateCreateArguments($arguments) 70 | { 71 | $errors = []; 72 | 73 | if (!isset($arguments['amount'])) { 74 | $errors['amount'][] = 'Amount is required'; 75 | } 76 | 77 | if (isset($arguments['amount']) && (!is_int($arguments['amount']) || $arguments['amount'] <= 0)) { 78 | $errors['amount'][] = 'Amount must be a positive integer greater than 0'; 79 | } 80 | 81 | if (!isset($arguments['currency'])) { 82 | $errors['currency'][] = 'Currency is required'; 83 | } 84 | 85 | if (isset($arguments['currency']) && strlen($arguments['currency']) != 3) { 86 | $errors['currency'][] = 'Currency must be a 3-letter currency ISO code'; 87 | } 88 | 89 | if (!isset($arguments['description']) || strlen(trim($arguments['description'])) == 0) { 90 | $errors['description'][] = 'A description is required'; 91 | } 92 | 93 | if (count($errors)) { 94 | throw new ValidationException('Invoice arguments are invalid', $errors); 95 | } 96 | } 97 | 98 | /** 99 | * Fetches an invoice from Moyasar's servers 100 | * 101 | * @param string $id 102 | * @return Invoice 103 | * @throws \GuzzleHttp\Exception\GuzzleException 104 | * @throws \Moyasar\Exceptions\ApiException 105 | */ 106 | public function fetch($id) 107 | { 108 | $response = $this->client->get(self::INVOICE_PATH . "/$id"); 109 | $invoice = Invoice::fromArray($response['body_assoc']); 110 | $invoice->setClient($this->client); 111 | return $invoice; 112 | } 113 | 114 | /** 115 | * @param Search|array\null $query 116 | * @return PaginationResult 117 | * @throws \GuzzleHttp\Exception\GuzzleException 118 | * @throws \Moyasar\Exceptions\ApiException 119 | */ 120 | public function all($query = null) 121 | { 122 | if ($query instanceof Search) { 123 | $query = $query->toArray(); 124 | } 125 | 126 | $response = $this->client->get(self::INVOICE_PATH, $query); 127 | $data = $response['body_assoc']; 128 | $meta = $data['meta']; 129 | $invoices = array_map(function ($i) { 130 | $invoice = Invoice::fromArray($i); 131 | $invoice->setClient($this->client); 132 | return $invoice; 133 | }, $data['invoices']); 134 | 135 | return PaginationResult::fromArray($meta)->setResult($invoices); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/Providers/HttpClient.php: -------------------------------------------------------------------------------- 1 | build(); 24 | } 25 | 26 | $this->httpClient = $httpClient; 27 | } 28 | 29 | /** 30 | * @param $method string 31 | * @param $url string 32 | * @param $data array 33 | * @return array 34 | * @throws ApiException 35 | * @throws \GuzzleHttp\Exception\GuzzleException 36 | */ 37 | public function request($method, $url, $data = null) 38 | { 39 | $options = $this->clientOptions(); 40 | $method = strtolower($method); 41 | 42 | if ($method == 'get') { 43 | $options[RequestOptions::QUERY] = $data; 44 | } else { 45 | $options[RequestOptions::JSON] = $data; 46 | } 47 | 48 | try { 49 | $response = $this->httpClient->request($method, $url, $options); 50 | return $this->formatResponse($response); 51 | } catch (ClientException $exception) { 52 | $response = $exception->getResponse(); 53 | 54 | if ($response->getStatusCode() >= 400 && $response->getStatusCode() < 600) { 55 | $responseBody = json_decode($response->getBody()->getContents(), true); 56 | 57 | $message = isset($responseBody['message']) ? $responseBody['message'] : ''; 58 | $type = isset($responseBody['type']) ? $responseBody['type'] : ''; 59 | $errors = isset($responseBody['errors']) ? $responseBody['errors'] : []; 60 | 61 | throw new ApiException($message, $type, $errors, $response->getStatusCode(), $exception); 62 | } 63 | 64 | throw $exception; 65 | } 66 | } 67 | 68 | /** 69 | * @param $url string 70 | * @param $data array 71 | * @return array 72 | * @throws ApiException 73 | * @throws \GuzzleHttp\Exception\GuzzleException 74 | */ 75 | public function get($url, $data = null) 76 | { 77 | return $this->request('get', $url, $data); 78 | } 79 | 80 | /** 81 | * @param $url string 82 | * @param $data array 83 | * @return array 84 | * @throws ApiException 85 | * @throws \GuzzleHttp\Exception\GuzzleException 86 | */ 87 | public function post($url, $data = null) 88 | { 89 | return $this->request('post', $url, $data); 90 | } 91 | 92 | /** 93 | * @param $url string 94 | * @param $data array 95 | * @return array 96 | * @throws ApiException 97 | * @throws \GuzzleHttp\Exception\GuzzleException 98 | */ 99 | public function put($url, $data = null) 100 | { 101 | return $this->request('put', $url, $data); 102 | } 103 | 104 | /** 105 | * @param $url string 106 | * @param $data array 107 | * @return array 108 | * @throws ApiException 109 | * @throws \GuzzleHttp\Exception\GuzzleException 110 | */ 111 | public function patch($url, $data = null) 112 | { 113 | return $this->request('patch', $url, $data); 114 | } 115 | 116 | /** 117 | * @param $url string 118 | * @param $data array 119 | * @return array 120 | * @throws ApiException 121 | * @throws \GuzzleHttp\Exception\GuzzleException 122 | */ 123 | public function delete($url, $data = null) 124 | { 125 | return $this->request('delete', $url, $data); 126 | } 127 | 128 | private function clientOptions() 129 | { 130 | return [ 131 | RequestOptions::AUTH => [Moyasar::getApiKey(), ''] 132 | ]; 133 | } 134 | 135 | private function formatResponse(ResponseInterface $response) 136 | { 137 | $body = $response->getBody()->getContents(); 138 | 139 | return [ 140 | 'status' => $response->getStatusCode(), 141 | 'headers' => $response->getHeaders(), 142 | 'body' => $body, 143 | 'body_assoc' => json_decode($body, true) 144 | ]; 145 | } 146 | } -------------------------------------------------------------------------------- /src/Invoice.php: -------------------------------------------------------------------------------- 1 | toSnakeArray(); 133 | }, $value); 134 | } 135 | 136 | return $value; 137 | } 138 | 139 | /** 140 | * Update the current invoice instance 141 | * 142 | * @param array $arguments 143 | * @return void 144 | * @throws ValidationException 145 | * @throws \GuzzleHttp\Exception\GuzzleException 146 | * @throws \Moyasar\Exceptions\ApiException 147 | */ 148 | public function update($arguments) 149 | { 150 | $this->validateUpdateArguments($arguments); 151 | $response = $this->client->put(InvoiceService::INVOICE_PATH . "/$this->id", $arguments); 152 | $this->updateFromArray($response['body_assoc']); 153 | } 154 | 155 | /** 156 | * Cancels this invoice instance 157 | * 158 | * @return void 159 | * @throws \GuzzleHttp\Exception\GuzzleException 160 | * @throws \Moyasar\Exceptions\ApiException 161 | */ 162 | public function cancel() 163 | { 164 | $response = $this->client->put(InvoiceService::INVOICE_PATH . "/$this->id/cancel"); 165 | $this->updateFromArray($response['body_assoc']); 166 | } 167 | 168 | /** 169 | * Validates arguments meant to be used with invoice create 170 | * 171 | * @param $arguments 172 | * @throws ValidationException 173 | */ 174 | private function validateUpdateArguments($arguments) 175 | { 176 | $errors = []; 177 | 178 | if (isset($arguments['amount']) && (!is_int($arguments['amount']) || $arguments['amount'] <= 0)) { 179 | $errors['amount'][] = 'Amount must be a positive integer greater than 0'; 180 | } 181 | 182 | if (isset($arguments['currency']) && strlen($arguments['currency']) != 3) { 183 | $errors['currency'][] = 'Currency must be a 3-letter currency ISO code'; 184 | } 185 | 186 | if (isset($arguments['description']) && strlen(trim($arguments['description'])) == 0) { 187 | $errors['description'][] = 'A description is required'; 188 | } 189 | 190 | if (count($errors)) { 191 | throw new ValidationException('Invoice arguments are invalid', $errors); 192 | } 193 | } 194 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this library will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [Unreleased] 8 | * Nothing New 9 | 10 | ## [1.1.1] - 2021-11-12 11 | 12 | Update guzzlehttp/psr7 to resolve CVE-2022-24775. 13 | 14 | ## [1.1.0] - 2021-11-12 15 | 16 | Add new payment source parameters and Apple Pay source. 17 | 18 | ## [1.0.2] - 2020-12-28 19 | 20 | Upgraded GuzzleHttp version in composer.json 21 | 22 | ## [1.0.0] - 2020-04-06 23 | 24 | This version of the library is a complete reimplementation from ground up. 25 | Please checkout the following sections to see what changed 26 | 27 | ### Summary 28 | 29 | There is many changes to the library API, so let's get going. 30 | First we need to set the secret API key: 31 | 32 | Before 33 | 34 | ```php 35 | \Moyasar\Client::setApiKey("API-KEY"); 36 | ``` 37 | 38 | After 39 | 40 | ```php 41 | \Moyasar\Moyasar::setApiKey('API-KEY'); 42 | ``` 43 | 44 | #### Payment and Invoice Fetch 45 | 46 | In case of fetching a payment, we use `PaymentService` class. 47 | 48 | Before: 49 | 50 | ```php 51 | $data = \Moyasar\Payment::fetch("760878ec-d1d3-5f72-9056-191683f55872"); 52 | $data = \Moyasar\Invoice::fetch("760878ec-d1d3-5f72-9056-191683f55872"); 53 | ``` 54 | 55 | After: 56 | 57 | ```php 58 | $paymentService = new \Moyasar\Providers\PaymentService(); 59 | $invoiceService = new \Moyasar\Providers\InvoiceService(); 60 | 61 | $payment = $paymentService->fetch('760878ec-d1d3-5f72-9056-191683f55872'); 62 | $invoice = $invoiceService->fetch('760878ec-d1d3-5f72-9056-191683f55872'); 63 | ``` 64 | 65 | The returned result is of type `\Moyasar\Payment` and `\Moyasar\Invoice` 66 | respectively and has the ability to perform operations on that 67 | payment instance like `update`, `refund`, `capture`, and `void`, and operations 68 | on the other invoice instance like `update` and `cancel`. 69 | 70 | #### Payment and Invoice Listing 71 | 72 | Before: 73 | 74 | ```php 75 | $payments = \Moyasar\Payment::all(); 76 | $invoices = \Moyasar\Invoice::all(); 77 | ``` 78 | 79 | Listing payments or invoices using `list` method in both `PaymentService` and `InvoiceService` class 80 | returns a `PaginationResult` instance: 81 | 82 | ```php 83 | $paymentService = new \Moyasar\Providers\PaymentService(); 84 | $invoiceService = new \Moyasar\Providers\InvoiceService(); 85 | 86 | $search = \Moyasar\Search::query(); 87 | $search = $search->createdAfter('date'); 88 | $search = $search->createdBefore('date'); 89 | $search = $search->id('id'); 90 | $search = $search->page('page-number-to-list'); 91 | $search = $search->source('payment-source-type'); 92 | $search = $search->status('status'); 93 | 94 | $paymentListing = $paymentService->all($search); 95 | $payments = $paymentListing->result; 96 | 97 | $invoiceListing = $invoiceService->all(); 98 | $invoices = $invoiceListing->result; 99 | 100 | $invoiceListing->currentPage; // Current Page 101 | $invoiceListing->nextPage; // Next Page or null 102 | $invoiceListing->previousPage; // Previous Page or null 103 | $invoiceListing->totalCount; // Total Invoices 104 | $invoiceListing->totalPages; // Total Pages 105 | ``` 106 | 107 | --- 108 | 109 | ### Removed 110 | * `Client` class 111 | * `HttpRequestNotFound` class 112 | * `Invoice` class (Used to perform all invoice operations) 113 | * `Payment` class (Used to perform all payment operations) 114 | 115 | ### Added 116 | * `Moyasar` class that stores API keys and version information 117 | * `HttpClient` interface 118 | * `HttpClient` class, implements all HTTP transactions 119 | * `Resource` class 120 | * `OnlineResource` class that represent resources that can perform some operations 121 | * `Invoice` class, extends `OnlineResource`, used to perform operations related to a single invoice 122 | * `Payment` class, extends `OnlineResource` 123 | * `InvoiceService` service class, used to create, fetch, and list invoices 124 | * `PaymentService` service class, used to fetch, and list payments 125 | * `Search` class, used to provide search parameters to list methods in `InvoiceService` and `PaymentService` 126 | * `Source` class to represent a payment source for `Payment` 127 | * `CreditCard` class that represents `creditcard` payment method in Moyasar's API 128 | * `Sadad` class that represents `sadad` payment method in Moyasar's API 129 | * `PaginationResult` class, returned by list methods on `InvoiceService` and `PaymentService` 130 | * `BaseException` as a base for all library exceptions 131 | * `ApiException` class that represent error returned by Moyasar's API 132 | * `ValidationException` thrown when data validation fails before sending a request to the backend 133 | * `Invoice` facade for Laravel 134 | * `Payment` facade for Laravel 135 | * `LaravelServiceProvider` class, used to automatically register Moyasar's services in Laravel's service container 136 | * `GuzzleClientFactory` factory class 137 | * Unit Testing 138 | * Laravel Configuration File `config/config.php` 139 | 140 | ### Changes 141 | * The library now requires PHP version `5.6.0` or higher instead of `5.5.0` 142 | 143 | 144 | ## [0.5.0] - 2019-03-27 145 | ### Removed 146 | * Disabled the ability to create payments from the library. We recommend you to use [Moyasar Payment Form] 147 | 148 | ### Changes 149 | * In this version, we change our library name to be only the word `moyasar`. 150 | 151 | 152 | ## [v0.4.3] - 2019-01-28 153 | ### Added 154 | * Add ability in PHP wrappers to do: 155 | * Update a payment. 156 | * Update an invoice. 157 | * Cancel an invoice. 158 | 159 | 160 | ## [v0.4.0] - 2016-11-02 161 | ### Changed 162 | * This version has a breaking change. We rename our main classes to be single not plural. So `Payments` class now `Payment` and `Invoices` changed to `Invoice` 163 | 164 | 165 | ## [v0.3.5] - 2016-09-05 166 | ### Changed 167 | * Fixed List Method 168 | 169 | 170 | ## [v0.3.0] - 2016-07-19 171 | * First Release 172 | 173 | 174 | [Unreleased]: https://github.com/moyasar/moyasar-php/compare/1.0.0...HEAD 175 | [1.0.0]: https://github.com/moyasar/moyasar-php/releases/tag/1.0.0 176 | [0.5.0]: https://github.com/moyasar/moyasar-php/releases/tag/0.5.0 177 | [v0.4.3]: https://github.com/moyasar/moyasar-php/releases/tag/v0.4.3 178 | [v0.4.0]: https://github.com/moyasar/moyasar-php/releases/tag/v0.4.0 179 | [v0.3.5]: https://github.com/moyasar/moyasar-php/releases/tag/v0.3.5 180 | [v0.3.0]: https://github.com/moyasar/moyasar-php/releases/tag/v0.3.0 181 | 182 | [Moyasar Payment Form]: https://moyasar.com/docs/payments/create-payment/mpf/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This project has been archived and is no longer maintained. 2 | 3 | 4 | # moyasar-php 5 | 6 | [![PHP version](https://badge.fury.io/ph/moyasar%2Fmoyasar.svg)](https://badge.fury.io/ph/moyasar%2Fmoyasar) 7 | 8 | Moyasar PHP wrapper library 9 | 10 | ## Documentation 11 | 12 | See the [PHP API docs](https://moyasar.com/docs/api/?php) 13 | 14 | ## Requirements 15 | 16 | - PHP 5.6.0 17 | - guzzlehttp/guzzle: ^6.3.0 18 | - laravel/framework (Optional) 19 | 20 | #### Notes 21 | 22 | - Please note that starting from version `1.0.0` the library was rewritten with breaking changes, so please do not update 23 | unless you need the new version. If you are new, it is recommended to use the new version. 24 | - To use the PHP stream handler, allow_url_fopen must be enabled in your system's php.ini. 25 | - To use the cURL handler, you must have a recent version of cURL >= 7.19.4 compiled with OpenSSL and zlib. 26 | - Please note that in version `0.5.0` the library name has been changed from `moyasar-php` to `moyasar` 27 | 28 | ## Installation 29 | 30 | You can install it via [composer](https://getcomposer.org/) 31 | 32 | $ composer require moyasar/moyasar 33 | 34 | ## Usage 35 | 36 | #### In a Standard Project 37 | 38 | After installing the library using composer and including `autoload.php`, the API key need 39 | to be set in order to use the services. 40 | 41 | ```php 42 | include_once 'vendor/autoload.php'; 43 | 44 | \Moyasar\Moyasar::setApiKey('api-key'); 45 | ``` 46 | 47 | Setup is complete, create an instance of the service you need and start using it. 48 | 49 | #### Payment 50 | 51 | Note: Moyasar does not allow creating payments using the API (with some exceptions), instead you can use 52 | the [payment form](https://moyasar.com/docs/payments/create-payment/mpf/). That is why, wrapper libraries does not support it. 53 | 54 | --- 55 | 56 | To fetch a payment, just simply do the following: 57 | 58 | ```php 59 | $paymentService = new \Moyasar\Providers\PaymentService(); 60 | 61 | $payment = $paymentService->fetch('ae5e8c6a-1622-45a5-b7ca-9ead69be722e'); 62 | ``` 63 | 64 | An instance of `Payment` will be returned, that has the data in addition to being able 65 | to perform operations like `update`, `refund`, `capture`, `void` on that payment instance, 66 | which we will get back to later. 67 | 68 | --- 69 | 70 | To list payments associated with your account, simply do the following: 71 | 72 | ```php 73 | $paymentService = new \Moyasar\Providers\PaymentService(); 74 | 75 | $paginationResult = $paymentService->all(); 76 | 77 | $payments = $paginationResult->result; 78 | ``` 79 | 80 | The `all` method will return an instance of `PaginationResult` this contains meta data 81 | about our result, like `currentPage`, `totalPages` etc... 82 | 83 | To get the payments from this object, we just read the `result` property of that object. 84 | 85 | --- 86 | 87 | The `all` method accepts an instance of `Search` or an array, this allows us to filter 88 | results and move along pages. It is quite simple to use: 89 | 90 | ```php 91 | $search = \Moyasar\Search::query()->status('paid')->page(2); 92 | 93 | $paginationResult = $paymentService->all($search); 94 | ``` 95 | 96 | The following methods are supported: 97 | 98 | - `id($id)` 99 | - `status($status)` 100 | - `source($source)` 101 | - `page($page)` 102 | - `createdAfter($date)` 103 | - `createdBefore($date)` 104 | 105 | --- 106 | 107 | Once we fetch the desired payment, we can either `update` the description, `refund` it, 108 | `capture` it, or `void` it. 109 | 110 | ```php 111 | $payment->update('new description here'); 112 | 113 | // OR 114 | 115 | $payment->refund(1000); // 10.00 SAR 116 | 117 | // OR 118 | 119 | $payment->capture(1000); 120 | 121 | // OR 122 | 123 | $payment->void(); 124 | ``` 125 | 126 | #### Invoice 127 | 128 | For invoices, fetching and listing them is the same as payments, instead we use `InvoiceService`. 129 | 130 | Although, we can use the API to create a new invoice, by doing the following: 131 | 132 | ```php 133 | $invoiceService = new \Moyasar\Providers\InvoiceService(); 134 | 135 | $invoiceService->create([ 136 | 'amount' => 1000000, // 10000.00 SAR 137 | 'currency' => 'SAR', 138 | 'description' => 'iPhone XII Purchase', 139 | 'callback_url' => 'http://www.example.com/invoice-status-changed', // Optional 140 | 'expired_at' => '2020-01-20' // Optional 141 | ]); 142 | ``` 143 | 144 | --- 145 | 146 | With an instance of `Invoice`, we can either `update`, or `cancel` a given instance. 147 | 148 | ```php 149 | $invoice->update([ 150 | 'amount' => 900000, // 9000.00 SAR 151 | 'currency' => 'SAR', 152 | 'description' => 'iPhone XII Purchase (Updated)', 153 | 'callback_url' => 'http://www.example.com/invoice-status-changed', // Optional 154 | 'expired_at' => '2020-01-25' // Optional 155 | ]); 156 | 157 | // OR 158 | 159 | $invoice->cancel(); 160 | ``` 161 | 162 | #### Laravel 163 | 164 | First thing we need to add `moyasar/moyasar` to our Laravel project, to do it we need: 165 | 166 | $ composer require moyasar/moyasar 167 | 168 | After that, moyasar services need to be configured, so let us publish the configuration file: 169 | 170 | $ php artisan vendor:publish --provider="Moyasar\Providers\LaravelServiceProvider" 171 | 172 | Now edit `config/moyasar.php` and add your API key, by default the API key is read from 173 | an environment variable called `MOYASAR_API_KEY`, thus `.env` can be used to add the key. 174 | 175 | ```env 176 | MOYASAR_API_KEY= 177 | ``` 178 | 179 | If everything goes to plan, you should be able to get `PaymentService` and `InvoiceService` 180 | from laravel service container by simply called `app` helper function 181 | 182 | ```php 183 | app(PaymentService::class) 184 | ``` 185 | 186 | ```php 187 | app(InvoiceService::class) 188 | ``` 189 | 190 | Or inside your controller, you can simply type-hint one of the services in the constructor: 191 | 192 | ```php 193 | public function __construct(PaymentService $paymentService) 194 | { 195 | $this->paymentService = $paymentService; 196 | } 197 | ``` 198 | 199 | --- 200 | 201 | Or if you want a quick way to use these services, you can use the `Payment` and `Invoice` facades: 202 | 203 | - `Moyasar\Facades\Payment` 204 | - `Moyasar\Facades\Invoice` 205 | 206 | For example: 207 | 208 | ```php 209 | $payment = \Moyasar\Facades\Payment::fetch('id'); 210 | ``` 211 | 212 | ## Contributing 213 | 214 | Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/moyasar-php. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct. 215 | 216 | ## License 217 | 218 | The package is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). 219 | -------------------------------------------------------------------------------- /src/Payment.php: -------------------------------------------------------------------------------- 1 | toSnakeArray(); 194 | } 195 | 196 | return $value; 197 | } 198 | 199 | /** 200 | * @param string $description 201 | * @throws Exceptions\ApiException 202 | * @throws ValidationException 203 | * @throws \GuzzleHttp\Exception\GuzzleException 204 | */ 205 | public function update($description) 206 | { 207 | $this->validateDescription($description); 208 | 209 | $response = $this->client->put(PaymentService::PAYMENT_PATH . "/$this->id", [ 210 | 'description' => $description 211 | ]); 212 | 213 | // A fix, because Moyasar won't return an updated instance of the payment 214 | if (! $response['body_assoc']) { 215 | $response = $this->client->get(PaymentService::PAYMENT_PATH . "/$this->id"); 216 | } 217 | 218 | $this->updateFromArray($response['body_assoc']); 219 | } 220 | 221 | /** 222 | * Refund the current payment instance 223 | * 224 | * @param int $amount 225 | * @throws Exceptions\ApiException 226 | * @throws ValidationException 227 | * @throws \GuzzleHttp\Exception\GuzzleException 228 | */ 229 | public function refund($amount = null) 230 | { 231 | if ($amount !== null && !is_int($amount)) { 232 | throw new InvalidArgumentException('amount must be an int type'); 233 | } 234 | 235 | if ($amount !== null && $amount <= 0) { 236 | throw new ValidationException('Refund arguments are invalid', [ 237 | 'amount' => ['Amount must be a positive integer'] 238 | ]); 239 | } 240 | 241 | $data = []; 242 | 243 | if ($amount) { 244 | $data['amount'] = $amount; 245 | } 246 | 247 | $response = $this->client->post(PaymentService::PAYMENT_PATH . "/$this->id/refund", $data); 248 | 249 | $this->updateFromArray($response['body_assoc']); 250 | } 251 | 252 | /** 253 | * Capture a given amount of the authorized payment instance 254 | * 255 | * @param int $amount 256 | * @throws Exceptions\ApiException 257 | * @throws ValidationException 258 | * @throws \GuzzleHttp\Exception\GuzzleException 259 | */ 260 | public function capture($amount = null) 261 | { 262 | if ($amount !== null && !is_int($amount)) { 263 | throw new InvalidArgumentException('amount must be an int type'); 264 | } 265 | 266 | if ($amount !== null && $amount <= 0) { 267 | throw new ValidationException('Capture arguments are invalid', [ 268 | 'amount' => ['Amount must be a positive integer'] 269 | ]); 270 | } 271 | 272 | $data = []; 273 | 274 | if ($amount) { 275 | $data['amount'] = $amount; 276 | } 277 | 278 | $response = $this->client->post(PaymentService::PAYMENT_PATH . "/$this->id/capture", $data); 279 | 280 | // TODO: Make sure response returns something 281 | if (! $response['body_assoc']) return; 282 | 283 | $this->updateFromArray($response['body_assoc']); 284 | } 285 | 286 | /** 287 | * Void the current payment instance 288 | * 289 | * @throws Exceptions\ApiException 290 | * @throws \GuzzleHttp\Exception\GuzzleException 291 | */ 292 | public function void() 293 | { 294 | $response = $this->client->post(PaymentService::PAYMENT_PATH . "/$this->id/void"); 295 | 296 | // TODO: Make sure response returns something 297 | if (! $response['body_assoc']) return; 298 | 299 | $this->updateFromArray($response['body_assoc']); 300 | } 301 | 302 | private function validateDescription($description) 303 | { 304 | if (trim(strlen($description)) == 0) { 305 | throw new ValidationException('Payment description is required', [ 306 | 'description' => 'A description is required' 307 | ]); 308 | } 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "4752f901d41bad0061abb76bfb5be0a5", 8 | "packages": [ 9 | { 10 | "name": "guzzlehttp/guzzle", 11 | "version": "7.4.2", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/guzzle/guzzle.git", 15 | "reference": "ac1ec1cd9b5624694c3a40be801d94137afb12b4" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ac1ec1cd9b5624694c3a40be801d94137afb12b4", 20 | "reference": "ac1ec1cd9b5624694c3a40be801d94137afb12b4", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-json": "*", 25 | "guzzlehttp/promises": "^1.5", 26 | "guzzlehttp/psr7": "^1.8.3 || ^2.1", 27 | "php": "^7.2.5 || ^8.0", 28 | "psr/http-client": "^1.0", 29 | "symfony/deprecation-contracts": "^2.2 || ^3.0" 30 | }, 31 | "provide": { 32 | "psr/http-client-implementation": "1.0" 33 | }, 34 | "require-dev": { 35 | "bamarni/composer-bin-plugin": "^1.4.1", 36 | "ext-curl": "*", 37 | "php-http/client-integration-tests": "^3.0", 38 | "phpunit/phpunit": "^8.5.5 || ^9.3.5", 39 | "psr/log": "^1.1 || ^2.0 || ^3.0" 40 | }, 41 | "suggest": { 42 | "ext-curl": "Required for CURL handler support", 43 | "ext-intl": "Required for Internationalized Domain Name (IDN) support", 44 | "psr/log": "Required for using the Log middleware" 45 | }, 46 | "type": "library", 47 | "extra": { 48 | "branch-alias": { 49 | "dev-master": "7.4-dev" 50 | } 51 | }, 52 | "autoload": { 53 | "files": [ 54 | "src/functions_include.php" 55 | ], 56 | "psr-4": { 57 | "GuzzleHttp\\": "src/" 58 | } 59 | }, 60 | "notification-url": "https://packagist.org/downloads/", 61 | "license": [ 62 | "MIT" 63 | ], 64 | "authors": [ 65 | { 66 | "name": "Graham Campbell", 67 | "email": "hello@gjcampbell.co.uk", 68 | "homepage": "https://github.com/GrahamCampbell" 69 | }, 70 | { 71 | "name": "Michael Dowling", 72 | "email": "mtdowling@gmail.com", 73 | "homepage": "https://github.com/mtdowling" 74 | }, 75 | { 76 | "name": "Jeremy Lindblom", 77 | "email": "jeremeamia@gmail.com", 78 | "homepage": "https://github.com/jeremeamia" 79 | }, 80 | { 81 | "name": "George Mponos", 82 | "email": "gmponos@gmail.com", 83 | "homepage": "https://github.com/gmponos" 84 | }, 85 | { 86 | "name": "Tobias Nyholm", 87 | "email": "tobias.nyholm@gmail.com", 88 | "homepage": "https://github.com/Nyholm" 89 | }, 90 | { 91 | "name": "Márk Sági-Kazár", 92 | "email": "mark.sagikazar@gmail.com", 93 | "homepage": "https://github.com/sagikazarmark" 94 | }, 95 | { 96 | "name": "Tobias Schultze", 97 | "email": "webmaster@tubo-world.de", 98 | "homepage": "https://github.com/Tobion" 99 | } 100 | ], 101 | "description": "Guzzle is a PHP HTTP client library", 102 | "keywords": [ 103 | "client", 104 | "curl", 105 | "framework", 106 | "http", 107 | "http client", 108 | "psr-18", 109 | "psr-7", 110 | "rest", 111 | "web service" 112 | ], 113 | "support": { 114 | "issues": "https://github.com/guzzle/guzzle/issues", 115 | "source": "https://github.com/guzzle/guzzle/tree/7.4.2" 116 | }, 117 | "funding": [ 118 | { 119 | "url": "https://github.com/GrahamCampbell", 120 | "type": "github" 121 | }, 122 | { 123 | "url": "https://github.com/Nyholm", 124 | "type": "github" 125 | }, 126 | { 127 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 128 | "type": "tidelift" 129 | } 130 | ], 131 | "time": "2022-03-20T14:16:28+00:00" 132 | }, 133 | { 134 | "name": "guzzlehttp/promises", 135 | "version": "1.5.1", 136 | "source": { 137 | "type": "git", 138 | "url": "https://github.com/guzzle/promises.git", 139 | "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" 140 | }, 141 | "dist": { 142 | "type": "zip", 143 | "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", 144 | "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", 145 | "shasum": "" 146 | }, 147 | "require": { 148 | "php": ">=5.5" 149 | }, 150 | "require-dev": { 151 | "symfony/phpunit-bridge": "^4.4 || ^5.1" 152 | }, 153 | "type": "library", 154 | "extra": { 155 | "branch-alias": { 156 | "dev-master": "1.5-dev" 157 | } 158 | }, 159 | "autoload": { 160 | "files": [ 161 | "src/functions_include.php" 162 | ], 163 | "psr-4": { 164 | "GuzzleHttp\\Promise\\": "src/" 165 | } 166 | }, 167 | "notification-url": "https://packagist.org/downloads/", 168 | "license": [ 169 | "MIT" 170 | ], 171 | "authors": [ 172 | { 173 | "name": "Graham Campbell", 174 | "email": "hello@gjcampbell.co.uk", 175 | "homepage": "https://github.com/GrahamCampbell" 176 | }, 177 | { 178 | "name": "Michael Dowling", 179 | "email": "mtdowling@gmail.com", 180 | "homepage": "https://github.com/mtdowling" 181 | }, 182 | { 183 | "name": "Tobias Nyholm", 184 | "email": "tobias.nyholm@gmail.com", 185 | "homepage": "https://github.com/Nyholm" 186 | }, 187 | { 188 | "name": "Tobias Schultze", 189 | "email": "webmaster@tubo-world.de", 190 | "homepage": "https://github.com/Tobion" 191 | } 192 | ], 193 | "description": "Guzzle promises library", 194 | "keywords": [ 195 | "promise" 196 | ], 197 | "support": { 198 | "issues": "https://github.com/guzzle/promises/issues", 199 | "source": "https://github.com/guzzle/promises/tree/1.5.1" 200 | }, 201 | "funding": [ 202 | { 203 | "url": "https://github.com/GrahamCampbell", 204 | "type": "github" 205 | }, 206 | { 207 | "url": "https://github.com/Nyholm", 208 | "type": "github" 209 | }, 210 | { 211 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 212 | "type": "tidelift" 213 | } 214 | ], 215 | "time": "2021-10-22T20:56:57+00:00" 216 | }, 217 | { 218 | "name": "guzzlehttp/psr7", 219 | "version": "2.2.1", 220 | "source": { 221 | "type": "git", 222 | "url": "https://github.com/guzzle/psr7.git", 223 | "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2" 224 | }, 225 | "dist": { 226 | "type": "zip", 227 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/c94a94f120803a18554c1805ef2e539f8285f9a2", 228 | "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2", 229 | "shasum": "" 230 | }, 231 | "require": { 232 | "php": "^7.2.5 || ^8.0", 233 | "psr/http-factory": "^1.0", 234 | "psr/http-message": "^1.0", 235 | "ralouphie/getallheaders": "^3.0" 236 | }, 237 | "provide": { 238 | "psr/http-factory-implementation": "1.0", 239 | "psr/http-message-implementation": "1.0" 240 | }, 241 | "require-dev": { 242 | "bamarni/composer-bin-plugin": "^1.4.1", 243 | "http-interop/http-factory-tests": "^0.9", 244 | "phpunit/phpunit": "^8.5.8 || ^9.3.10" 245 | }, 246 | "suggest": { 247 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 248 | }, 249 | "type": "library", 250 | "extra": { 251 | "branch-alias": { 252 | "dev-master": "2.2-dev" 253 | } 254 | }, 255 | "autoload": { 256 | "psr-4": { 257 | "GuzzleHttp\\Psr7\\": "src/" 258 | } 259 | }, 260 | "notification-url": "https://packagist.org/downloads/", 261 | "license": [ 262 | "MIT" 263 | ], 264 | "authors": [ 265 | { 266 | "name": "Graham Campbell", 267 | "email": "hello@gjcampbell.co.uk", 268 | "homepage": "https://github.com/GrahamCampbell" 269 | }, 270 | { 271 | "name": "Michael Dowling", 272 | "email": "mtdowling@gmail.com", 273 | "homepage": "https://github.com/mtdowling" 274 | }, 275 | { 276 | "name": "George Mponos", 277 | "email": "gmponos@gmail.com", 278 | "homepage": "https://github.com/gmponos" 279 | }, 280 | { 281 | "name": "Tobias Nyholm", 282 | "email": "tobias.nyholm@gmail.com", 283 | "homepage": "https://github.com/Nyholm" 284 | }, 285 | { 286 | "name": "Márk Sági-Kazár", 287 | "email": "mark.sagikazar@gmail.com", 288 | "homepage": "https://github.com/sagikazarmark" 289 | }, 290 | { 291 | "name": "Tobias Schultze", 292 | "email": "webmaster@tubo-world.de", 293 | "homepage": "https://github.com/Tobion" 294 | }, 295 | { 296 | "name": "Márk Sági-Kazár", 297 | "email": "mark.sagikazar@gmail.com", 298 | "homepage": "https://sagikazarmark.hu" 299 | } 300 | ], 301 | "description": "PSR-7 message implementation that also provides common utility methods", 302 | "keywords": [ 303 | "http", 304 | "message", 305 | "psr-7", 306 | "request", 307 | "response", 308 | "stream", 309 | "uri", 310 | "url" 311 | ], 312 | "support": { 313 | "issues": "https://github.com/guzzle/psr7/issues", 314 | "source": "https://github.com/guzzle/psr7/tree/2.2.1" 315 | }, 316 | "funding": [ 317 | { 318 | "url": "https://github.com/GrahamCampbell", 319 | "type": "github" 320 | }, 321 | { 322 | "url": "https://github.com/Nyholm", 323 | "type": "github" 324 | }, 325 | { 326 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 327 | "type": "tidelift" 328 | } 329 | ], 330 | "time": "2022-03-20T21:55:58+00:00" 331 | }, 332 | { 333 | "name": "psr/http-client", 334 | "version": "1.0.1", 335 | "source": { 336 | "type": "git", 337 | "url": "https://github.com/php-fig/http-client.git", 338 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" 339 | }, 340 | "dist": { 341 | "type": "zip", 342 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 343 | "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", 344 | "shasum": "" 345 | }, 346 | "require": { 347 | "php": "^7.0 || ^8.0", 348 | "psr/http-message": "^1.0" 349 | }, 350 | "type": "library", 351 | "extra": { 352 | "branch-alias": { 353 | "dev-master": "1.0.x-dev" 354 | } 355 | }, 356 | "autoload": { 357 | "psr-4": { 358 | "Psr\\Http\\Client\\": "src/" 359 | } 360 | }, 361 | "notification-url": "https://packagist.org/downloads/", 362 | "license": [ 363 | "MIT" 364 | ], 365 | "authors": [ 366 | { 367 | "name": "PHP-FIG", 368 | "homepage": "http://www.php-fig.org/" 369 | } 370 | ], 371 | "description": "Common interface for HTTP clients", 372 | "homepage": "https://github.com/php-fig/http-client", 373 | "keywords": [ 374 | "http", 375 | "http-client", 376 | "psr", 377 | "psr-18" 378 | ], 379 | "support": { 380 | "source": "https://github.com/php-fig/http-client/tree/master" 381 | }, 382 | "time": "2020-06-29T06:28:15+00:00" 383 | }, 384 | { 385 | "name": "psr/http-factory", 386 | "version": "1.0.1", 387 | "source": { 388 | "type": "git", 389 | "url": "https://github.com/php-fig/http-factory.git", 390 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" 391 | }, 392 | "dist": { 393 | "type": "zip", 394 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 395 | "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", 396 | "shasum": "" 397 | }, 398 | "require": { 399 | "php": ">=7.0.0", 400 | "psr/http-message": "^1.0" 401 | }, 402 | "type": "library", 403 | "extra": { 404 | "branch-alias": { 405 | "dev-master": "1.0.x-dev" 406 | } 407 | }, 408 | "autoload": { 409 | "psr-4": { 410 | "Psr\\Http\\Message\\": "src/" 411 | } 412 | }, 413 | "notification-url": "https://packagist.org/downloads/", 414 | "license": [ 415 | "MIT" 416 | ], 417 | "authors": [ 418 | { 419 | "name": "PHP-FIG", 420 | "homepage": "http://www.php-fig.org/" 421 | } 422 | ], 423 | "description": "Common interfaces for PSR-7 HTTP message factories", 424 | "keywords": [ 425 | "factory", 426 | "http", 427 | "message", 428 | "psr", 429 | "psr-17", 430 | "psr-7", 431 | "request", 432 | "response" 433 | ], 434 | "support": { 435 | "source": "https://github.com/php-fig/http-factory/tree/master" 436 | }, 437 | "time": "2019-04-30T12:38:16+00:00" 438 | }, 439 | { 440 | "name": "psr/http-message", 441 | "version": "1.0.1", 442 | "source": { 443 | "type": "git", 444 | "url": "https://github.com/php-fig/http-message.git", 445 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 446 | }, 447 | "dist": { 448 | "type": "zip", 449 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 450 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 451 | "shasum": "" 452 | }, 453 | "require": { 454 | "php": ">=5.3.0" 455 | }, 456 | "type": "library", 457 | "extra": { 458 | "branch-alias": { 459 | "dev-master": "1.0.x-dev" 460 | } 461 | }, 462 | "autoload": { 463 | "psr-4": { 464 | "Psr\\Http\\Message\\": "src/" 465 | } 466 | }, 467 | "notification-url": "https://packagist.org/downloads/", 468 | "license": [ 469 | "MIT" 470 | ], 471 | "authors": [ 472 | { 473 | "name": "PHP-FIG", 474 | "homepage": "http://www.php-fig.org/" 475 | } 476 | ], 477 | "description": "Common interface for HTTP messages", 478 | "homepage": "https://github.com/php-fig/http-message", 479 | "keywords": [ 480 | "http", 481 | "http-message", 482 | "psr", 483 | "psr-7", 484 | "request", 485 | "response" 486 | ], 487 | "support": { 488 | "source": "https://github.com/php-fig/http-message/tree/master" 489 | }, 490 | "time": "2016-08-06T14:39:51+00:00" 491 | }, 492 | { 493 | "name": "ralouphie/getallheaders", 494 | "version": "3.0.3", 495 | "source": { 496 | "type": "git", 497 | "url": "https://github.com/ralouphie/getallheaders.git", 498 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 499 | }, 500 | "dist": { 501 | "type": "zip", 502 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 503 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 504 | "shasum": "" 505 | }, 506 | "require": { 507 | "php": ">=5.6" 508 | }, 509 | "require-dev": { 510 | "php-coveralls/php-coveralls": "^2.1", 511 | "phpunit/phpunit": "^5 || ^6.5" 512 | }, 513 | "type": "library", 514 | "autoload": { 515 | "files": [ 516 | "src/getallheaders.php" 517 | ] 518 | }, 519 | "notification-url": "https://packagist.org/downloads/", 520 | "license": [ 521 | "MIT" 522 | ], 523 | "authors": [ 524 | { 525 | "name": "Ralph Khattar", 526 | "email": "ralph.khattar@gmail.com" 527 | } 528 | ], 529 | "description": "A polyfill for getallheaders.", 530 | "support": { 531 | "issues": "https://github.com/ralouphie/getallheaders/issues", 532 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 533 | }, 534 | "time": "2019-03-08T08:55:37+00:00" 535 | }, 536 | { 537 | "name": "symfony/deprecation-contracts", 538 | "version": "v3.0.0", 539 | "source": { 540 | "type": "git", 541 | "url": "https://github.com/symfony/deprecation-contracts.git", 542 | "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" 543 | }, 544 | "dist": { 545 | "type": "zip", 546 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", 547 | "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", 548 | "shasum": "" 549 | }, 550 | "require": { 551 | "php": ">=8.0.2" 552 | }, 553 | "type": "library", 554 | "extra": { 555 | "branch-alias": { 556 | "dev-main": "3.0-dev" 557 | }, 558 | "thanks": { 559 | "name": "symfony/contracts", 560 | "url": "https://github.com/symfony/contracts" 561 | } 562 | }, 563 | "autoload": { 564 | "files": [ 565 | "function.php" 566 | ] 567 | }, 568 | "notification-url": "https://packagist.org/downloads/", 569 | "license": [ 570 | "MIT" 571 | ], 572 | "authors": [ 573 | { 574 | "name": "Nicolas Grekas", 575 | "email": "p@tchwork.com" 576 | }, 577 | { 578 | "name": "Symfony Community", 579 | "homepage": "https://symfony.com/contributors" 580 | } 581 | ], 582 | "description": "A generic function and convention to trigger deprecation notices", 583 | "homepage": "https://symfony.com", 584 | "support": { 585 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" 586 | }, 587 | "funding": [ 588 | { 589 | "url": "https://symfony.com/sponsor", 590 | "type": "custom" 591 | }, 592 | { 593 | "url": "https://github.com/fabpot", 594 | "type": "github" 595 | }, 596 | { 597 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 598 | "type": "tidelift" 599 | } 600 | ], 601 | "time": "2021-11-01T23:48:49+00:00" 602 | } 603 | ], 604 | "packages-dev": [ 605 | { 606 | "name": "doctrine/instantiator", 607 | "version": "1.4.1", 608 | "source": { 609 | "type": "git", 610 | "url": "https://github.com/doctrine/instantiator.git", 611 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" 612 | }, 613 | "dist": { 614 | "type": "zip", 615 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", 616 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", 617 | "shasum": "" 618 | }, 619 | "require": { 620 | "php": "^7.1 || ^8.0" 621 | }, 622 | "require-dev": { 623 | "doctrine/coding-standard": "^9", 624 | "ext-pdo": "*", 625 | "ext-phar": "*", 626 | "phpbench/phpbench": "^0.16 || ^1", 627 | "phpstan/phpstan": "^1.4", 628 | "phpstan/phpstan-phpunit": "^1", 629 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 630 | "vimeo/psalm": "^4.22" 631 | }, 632 | "type": "library", 633 | "autoload": { 634 | "psr-4": { 635 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 636 | } 637 | }, 638 | "notification-url": "https://packagist.org/downloads/", 639 | "license": [ 640 | "MIT" 641 | ], 642 | "authors": [ 643 | { 644 | "name": "Marco Pivetta", 645 | "email": "ocramius@gmail.com", 646 | "homepage": "https://ocramius.github.io/" 647 | } 648 | ], 649 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 650 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 651 | "keywords": [ 652 | "constructor", 653 | "instantiate" 654 | ], 655 | "support": { 656 | "issues": "https://github.com/doctrine/instantiator/issues", 657 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1" 658 | }, 659 | "funding": [ 660 | { 661 | "url": "https://www.doctrine-project.org/sponsorship.html", 662 | "type": "custom" 663 | }, 664 | { 665 | "url": "https://www.patreon.com/phpdoctrine", 666 | "type": "patreon" 667 | }, 668 | { 669 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 670 | "type": "tidelift" 671 | } 672 | ], 673 | "time": "2022-03-03T08:28:38+00:00" 674 | }, 675 | { 676 | "name": "hamcrest/hamcrest-php", 677 | "version": "v2.0.1", 678 | "source": { 679 | "type": "git", 680 | "url": "https://github.com/hamcrest/hamcrest-php.git", 681 | "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" 682 | }, 683 | "dist": { 684 | "type": "zip", 685 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", 686 | "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", 687 | "shasum": "" 688 | }, 689 | "require": { 690 | "php": "^5.3|^7.0|^8.0" 691 | }, 692 | "replace": { 693 | "cordoval/hamcrest-php": "*", 694 | "davedevelopment/hamcrest-php": "*", 695 | "kodova/hamcrest-php": "*" 696 | }, 697 | "require-dev": { 698 | "phpunit/php-file-iterator": "^1.4 || ^2.0", 699 | "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" 700 | }, 701 | "type": "library", 702 | "extra": { 703 | "branch-alias": { 704 | "dev-master": "2.1-dev" 705 | } 706 | }, 707 | "autoload": { 708 | "classmap": [ 709 | "hamcrest" 710 | ] 711 | }, 712 | "notification-url": "https://packagist.org/downloads/", 713 | "license": [ 714 | "BSD-3-Clause" 715 | ], 716 | "description": "This is the PHP port of Hamcrest Matchers", 717 | "keywords": [ 718 | "test" 719 | ], 720 | "support": { 721 | "issues": "https://github.com/hamcrest/hamcrest-php/issues", 722 | "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" 723 | }, 724 | "time": "2020-07-09T08:09:16+00:00" 725 | }, 726 | { 727 | "name": "mockery/mockery", 728 | "version": "1.5.0", 729 | "source": { 730 | "type": "git", 731 | "url": "https://github.com/mockery/mockery.git", 732 | "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" 733 | }, 734 | "dist": { 735 | "type": "zip", 736 | "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", 737 | "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", 738 | "shasum": "" 739 | }, 740 | "require": { 741 | "hamcrest/hamcrest-php": "^2.0.1", 742 | "lib-pcre": ">=7.0", 743 | "php": "^7.3 || ^8.0" 744 | }, 745 | "conflict": { 746 | "phpunit/phpunit": "<8.0" 747 | }, 748 | "require-dev": { 749 | "phpunit/phpunit": "^8.5 || ^9.3" 750 | }, 751 | "type": "library", 752 | "extra": { 753 | "branch-alias": { 754 | "dev-master": "1.4.x-dev" 755 | } 756 | }, 757 | "autoload": { 758 | "psr-0": { 759 | "Mockery": "library/" 760 | } 761 | }, 762 | "notification-url": "https://packagist.org/downloads/", 763 | "license": [ 764 | "BSD-3-Clause" 765 | ], 766 | "authors": [ 767 | { 768 | "name": "Pádraic Brady", 769 | "email": "padraic.brady@gmail.com", 770 | "homepage": "http://blog.astrumfutura.com" 771 | }, 772 | { 773 | "name": "Dave Marshall", 774 | "email": "dave.marshall@atstsolutions.co.uk", 775 | "homepage": "http://davedevelopment.co.uk" 776 | } 777 | ], 778 | "description": "Mockery is a simple yet flexible PHP mock object framework", 779 | "homepage": "https://github.com/mockery/mockery", 780 | "keywords": [ 781 | "BDD", 782 | "TDD", 783 | "library", 784 | "mock", 785 | "mock objects", 786 | "mockery", 787 | "stub", 788 | "test", 789 | "test double", 790 | "testing" 791 | ], 792 | "support": { 793 | "issues": "https://github.com/mockery/mockery/issues", 794 | "source": "https://github.com/mockery/mockery/tree/1.5.0" 795 | }, 796 | "time": "2022-01-20T13:18:17+00:00" 797 | }, 798 | { 799 | "name": "myclabs/deep-copy", 800 | "version": "1.11.0", 801 | "source": { 802 | "type": "git", 803 | "url": "https://github.com/myclabs/DeepCopy.git", 804 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" 805 | }, 806 | "dist": { 807 | "type": "zip", 808 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", 809 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", 810 | "shasum": "" 811 | }, 812 | "require": { 813 | "php": "^7.1 || ^8.0" 814 | }, 815 | "conflict": { 816 | "doctrine/collections": "<1.6.8", 817 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 818 | }, 819 | "require-dev": { 820 | "doctrine/collections": "^1.6.8", 821 | "doctrine/common": "^2.13.3 || ^3.2.2", 822 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 823 | }, 824 | "type": "library", 825 | "autoload": { 826 | "files": [ 827 | "src/DeepCopy/deep_copy.php" 828 | ], 829 | "psr-4": { 830 | "DeepCopy\\": "src/DeepCopy/" 831 | } 832 | }, 833 | "notification-url": "https://packagist.org/downloads/", 834 | "license": [ 835 | "MIT" 836 | ], 837 | "description": "Create deep copies (clones) of your objects", 838 | "keywords": [ 839 | "clone", 840 | "copy", 841 | "duplicate", 842 | "object", 843 | "object graph" 844 | ], 845 | "support": { 846 | "issues": "https://github.com/myclabs/DeepCopy/issues", 847 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" 848 | }, 849 | "funding": [ 850 | { 851 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 852 | "type": "tidelift" 853 | } 854 | ], 855 | "time": "2022-03-03T13:19:32+00:00" 856 | }, 857 | { 858 | "name": "nikic/php-parser", 859 | "version": "v4.13.2", 860 | "source": { 861 | "type": "git", 862 | "url": "https://github.com/nikic/PHP-Parser.git", 863 | "reference": "210577fe3cf7badcc5814d99455df46564f3c077" 864 | }, 865 | "dist": { 866 | "type": "zip", 867 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", 868 | "reference": "210577fe3cf7badcc5814d99455df46564f3c077", 869 | "shasum": "" 870 | }, 871 | "require": { 872 | "ext-tokenizer": "*", 873 | "php": ">=7.0" 874 | }, 875 | "require-dev": { 876 | "ircmaxell/php-yacc": "^0.0.7", 877 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 878 | }, 879 | "bin": [ 880 | "bin/php-parse" 881 | ], 882 | "type": "library", 883 | "extra": { 884 | "branch-alias": { 885 | "dev-master": "4.9-dev" 886 | } 887 | }, 888 | "autoload": { 889 | "psr-4": { 890 | "PhpParser\\": "lib/PhpParser" 891 | } 892 | }, 893 | "notification-url": "https://packagist.org/downloads/", 894 | "license": [ 895 | "BSD-3-Clause" 896 | ], 897 | "authors": [ 898 | { 899 | "name": "Nikita Popov" 900 | } 901 | ], 902 | "description": "A PHP parser written in PHP", 903 | "keywords": [ 904 | "parser", 905 | "php" 906 | ], 907 | "support": { 908 | "issues": "https://github.com/nikic/PHP-Parser/issues", 909 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" 910 | }, 911 | "time": "2021-11-30T19:35:32+00:00" 912 | }, 913 | { 914 | "name": "phar-io/manifest", 915 | "version": "2.0.3", 916 | "source": { 917 | "type": "git", 918 | "url": "https://github.com/phar-io/manifest.git", 919 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 920 | }, 921 | "dist": { 922 | "type": "zip", 923 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 924 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 925 | "shasum": "" 926 | }, 927 | "require": { 928 | "ext-dom": "*", 929 | "ext-phar": "*", 930 | "ext-xmlwriter": "*", 931 | "phar-io/version": "^3.0.1", 932 | "php": "^7.2 || ^8.0" 933 | }, 934 | "type": "library", 935 | "extra": { 936 | "branch-alias": { 937 | "dev-master": "2.0.x-dev" 938 | } 939 | }, 940 | "autoload": { 941 | "classmap": [ 942 | "src/" 943 | ] 944 | }, 945 | "notification-url": "https://packagist.org/downloads/", 946 | "license": [ 947 | "BSD-3-Clause" 948 | ], 949 | "authors": [ 950 | { 951 | "name": "Arne Blankerts", 952 | "email": "arne@blankerts.de", 953 | "role": "Developer" 954 | }, 955 | { 956 | "name": "Sebastian Heuer", 957 | "email": "sebastian@phpeople.de", 958 | "role": "Developer" 959 | }, 960 | { 961 | "name": "Sebastian Bergmann", 962 | "email": "sebastian@phpunit.de", 963 | "role": "Developer" 964 | } 965 | ], 966 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 967 | "support": { 968 | "issues": "https://github.com/phar-io/manifest/issues", 969 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 970 | }, 971 | "time": "2021-07-20T11:28:43+00:00" 972 | }, 973 | { 974 | "name": "phar-io/version", 975 | "version": "3.2.1", 976 | "source": { 977 | "type": "git", 978 | "url": "https://github.com/phar-io/version.git", 979 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 980 | }, 981 | "dist": { 982 | "type": "zip", 983 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 984 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 985 | "shasum": "" 986 | }, 987 | "require": { 988 | "php": "^7.2 || ^8.0" 989 | }, 990 | "type": "library", 991 | "autoload": { 992 | "classmap": [ 993 | "src/" 994 | ] 995 | }, 996 | "notification-url": "https://packagist.org/downloads/", 997 | "license": [ 998 | "BSD-3-Clause" 999 | ], 1000 | "authors": [ 1001 | { 1002 | "name": "Arne Blankerts", 1003 | "email": "arne@blankerts.de", 1004 | "role": "Developer" 1005 | }, 1006 | { 1007 | "name": "Sebastian Heuer", 1008 | "email": "sebastian@phpeople.de", 1009 | "role": "Developer" 1010 | }, 1011 | { 1012 | "name": "Sebastian Bergmann", 1013 | "email": "sebastian@phpunit.de", 1014 | "role": "Developer" 1015 | } 1016 | ], 1017 | "description": "Library for handling version information and constraints", 1018 | "support": { 1019 | "issues": "https://github.com/phar-io/version/issues", 1020 | "source": "https://github.com/phar-io/version/tree/3.2.1" 1021 | }, 1022 | "time": "2022-02-21T01:04:05+00:00" 1023 | }, 1024 | { 1025 | "name": "phpdocumentor/reflection-common", 1026 | "version": "2.2.0", 1027 | "source": { 1028 | "type": "git", 1029 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1030 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 1031 | }, 1032 | "dist": { 1033 | "type": "zip", 1034 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1035 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1036 | "shasum": "" 1037 | }, 1038 | "require": { 1039 | "php": "^7.2 || ^8.0" 1040 | }, 1041 | "type": "library", 1042 | "extra": { 1043 | "branch-alias": { 1044 | "dev-2.x": "2.x-dev" 1045 | } 1046 | }, 1047 | "autoload": { 1048 | "psr-4": { 1049 | "phpDocumentor\\Reflection\\": "src/" 1050 | } 1051 | }, 1052 | "notification-url": "https://packagist.org/downloads/", 1053 | "license": [ 1054 | "MIT" 1055 | ], 1056 | "authors": [ 1057 | { 1058 | "name": "Jaap van Otterdijk", 1059 | "email": "opensource@ijaap.nl" 1060 | } 1061 | ], 1062 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1063 | "homepage": "http://www.phpdoc.org", 1064 | "keywords": [ 1065 | "FQSEN", 1066 | "phpDocumentor", 1067 | "phpdoc", 1068 | "reflection", 1069 | "static analysis" 1070 | ], 1071 | "support": { 1072 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 1073 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 1074 | }, 1075 | "time": "2020-06-27T09:03:43+00:00" 1076 | }, 1077 | { 1078 | "name": "phpdocumentor/reflection-docblock", 1079 | "version": "5.3.0", 1080 | "source": { 1081 | "type": "git", 1082 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1083 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" 1084 | }, 1085 | "dist": { 1086 | "type": "zip", 1087 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", 1088 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", 1089 | "shasum": "" 1090 | }, 1091 | "require": { 1092 | "ext-filter": "*", 1093 | "php": "^7.2 || ^8.0", 1094 | "phpdocumentor/reflection-common": "^2.2", 1095 | "phpdocumentor/type-resolver": "^1.3", 1096 | "webmozart/assert": "^1.9.1" 1097 | }, 1098 | "require-dev": { 1099 | "mockery/mockery": "~1.3.2", 1100 | "psalm/phar": "^4.8" 1101 | }, 1102 | "type": "library", 1103 | "extra": { 1104 | "branch-alias": { 1105 | "dev-master": "5.x-dev" 1106 | } 1107 | }, 1108 | "autoload": { 1109 | "psr-4": { 1110 | "phpDocumentor\\Reflection\\": "src" 1111 | } 1112 | }, 1113 | "notification-url": "https://packagist.org/downloads/", 1114 | "license": [ 1115 | "MIT" 1116 | ], 1117 | "authors": [ 1118 | { 1119 | "name": "Mike van Riel", 1120 | "email": "me@mikevanriel.com" 1121 | }, 1122 | { 1123 | "name": "Jaap van Otterdijk", 1124 | "email": "account@ijaap.nl" 1125 | } 1126 | ], 1127 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1128 | "support": { 1129 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 1130 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" 1131 | }, 1132 | "time": "2021-10-19T17:43:47+00:00" 1133 | }, 1134 | { 1135 | "name": "phpdocumentor/type-resolver", 1136 | "version": "1.6.1", 1137 | "source": { 1138 | "type": "git", 1139 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1140 | "reference": "77a32518733312af16a44300404e945338981de3" 1141 | }, 1142 | "dist": { 1143 | "type": "zip", 1144 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", 1145 | "reference": "77a32518733312af16a44300404e945338981de3", 1146 | "shasum": "" 1147 | }, 1148 | "require": { 1149 | "php": "^7.2 || ^8.0", 1150 | "phpdocumentor/reflection-common": "^2.0" 1151 | }, 1152 | "require-dev": { 1153 | "ext-tokenizer": "*", 1154 | "psalm/phar": "^4.8" 1155 | }, 1156 | "type": "library", 1157 | "extra": { 1158 | "branch-alias": { 1159 | "dev-1.x": "1.x-dev" 1160 | } 1161 | }, 1162 | "autoload": { 1163 | "psr-4": { 1164 | "phpDocumentor\\Reflection\\": "src" 1165 | } 1166 | }, 1167 | "notification-url": "https://packagist.org/downloads/", 1168 | "license": [ 1169 | "MIT" 1170 | ], 1171 | "authors": [ 1172 | { 1173 | "name": "Mike van Riel", 1174 | "email": "me@mikevanriel.com" 1175 | } 1176 | ], 1177 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1178 | "support": { 1179 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 1180 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" 1181 | }, 1182 | "time": "2022-03-15T21:29:03+00:00" 1183 | }, 1184 | { 1185 | "name": "phpspec/prophecy", 1186 | "version": "v1.15.0", 1187 | "source": { 1188 | "type": "git", 1189 | "url": "https://github.com/phpspec/prophecy.git", 1190 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" 1191 | }, 1192 | "dist": { 1193 | "type": "zip", 1194 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 1195 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 1196 | "shasum": "" 1197 | }, 1198 | "require": { 1199 | "doctrine/instantiator": "^1.2", 1200 | "php": "^7.2 || ~8.0, <8.2", 1201 | "phpdocumentor/reflection-docblock": "^5.2", 1202 | "sebastian/comparator": "^3.0 || ^4.0", 1203 | "sebastian/recursion-context": "^3.0 || ^4.0" 1204 | }, 1205 | "require-dev": { 1206 | "phpspec/phpspec": "^6.0 || ^7.0", 1207 | "phpunit/phpunit": "^8.0 || ^9.0" 1208 | }, 1209 | "type": "library", 1210 | "extra": { 1211 | "branch-alias": { 1212 | "dev-master": "1.x-dev" 1213 | } 1214 | }, 1215 | "autoload": { 1216 | "psr-4": { 1217 | "Prophecy\\": "src/Prophecy" 1218 | } 1219 | }, 1220 | "notification-url": "https://packagist.org/downloads/", 1221 | "license": [ 1222 | "MIT" 1223 | ], 1224 | "authors": [ 1225 | { 1226 | "name": "Konstantin Kudryashov", 1227 | "email": "ever.zet@gmail.com", 1228 | "homepage": "http://everzet.com" 1229 | }, 1230 | { 1231 | "name": "Marcello Duarte", 1232 | "email": "marcello.duarte@gmail.com" 1233 | } 1234 | ], 1235 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1236 | "homepage": "https://github.com/phpspec/prophecy", 1237 | "keywords": [ 1238 | "Double", 1239 | "Dummy", 1240 | "fake", 1241 | "mock", 1242 | "spy", 1243 | "stub" 1244 | ], 1245 | "support": { 1246 | "issues": "https://github.com/phpspec/prophecy/issues", 1247 | "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" 1248 | }, 1249 | "time": "2021-12-08T12:19:24+00:00" 1250 | }, 1251 | { 1252 | "name": "phpunit/php-code-coverage", 1253 | "version": "9.2.15", 1254 | "source": { 1255 | "type": "git", 1256 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1257 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" 1258 | }, 1259 | "dist": { 1260 | "type": "zip", 1261 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", 1262 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", 1263 | "shasum": "" 1264 | }, 1265 | "require": { 1266 | "ext-dom": "*", 1267 | "ext-libxml": "*", 1268 | "ext-xmlwriter": "*", 1269 | "nikic/php-parser": "^4.13.0", 1270 | "php": ">=7.3", 1271 | "phpunit/php-file-iterator": "^3.0.3", 1272 | "phpunit/php-text-template": "^2.0.2", 1273 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 1274 | "sebastian/complexity": "^2.0", 1275 | "sebastian/environment": "^5.1.2", 1276 | "sebastian/lines-of-code": "^1.0.3", 1277 | "sebastian/version": "^3.0.1", 1278 | "theseer/tokenizer": "^1.2.0" 1279 | }, 1280 | "require-dev": { 1281 | "phpunit/phpunit": "^9.3" 1282 | }, 1283 | "suggest": { 1284 | "ext-pcov": "*", 1285 | "ext-xdebug": "*" 1286 | }, 1287 | "type": "library", 1288 | "extra": { 1289 | "branch-alias": { 1290 | "dev-master": "9.2-dev" 1291 | } 1292 | }, 1293 | "autoload": { 1294 | "classmap": [ 1295 | "src/" 1296 | ] 1297 | }, 1298 | "notification-url": "https://packagist.org/downloads/", 1299 | "license": [ 1300 | "BSD-3-Clause" 1301 | ], 1302 | "authors": [ 1303 | { 1304 | "name": "Sebastian Bergmann", 1305 | "email": "sebastian@phpunit.de", 1306 | "role": "lead" 1307 | } 1308 | ], 1309 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1310 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1311 | "keywords": [ 1312 | "coverage", 1313 | "testing", 1314 | "xunit" 1315 | ], 1316 | "support": { 1317 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 1318 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" 1319 | }, 1320 | "funding": [ 1321 | { 1322 | "url": "https://github.com/sebastianbergmann", 1323 | "type": "github" 1324 | } 1325 | ], 1326 | "time": "2022-03-07T09:28:20+00:00" 1327 | }, 1328 | { 1329 | "name": "phpunit/php-file-iterator", 1330 | "version": "3.0.6", 1331 | "source": { 1332 | "type": "git", 1333 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1334 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 1335 | }, 1336 | "dist": { 1337 | "type": "zip", 1338 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1339 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1340 | "shasum": "" 1341 | }, 1342 | "require": { 1343 | "php": ">=7.3" 1344 | }, 1345 | "require-dev": { 1346 | "phpunit/phpunit": "^9.3" 1347 | }, 1348 | "type": "library", 1349 | "extra": { 1350 | "branch-alias": { 1351 | "dev-master": "3.0-dev" 1352 | } 1353 | }, 1354 | "autoload": { 1355 | "classmap": [ 1356 | "src/" 1357 | ] 1358 | }, 1359 | "notification-url": "https://packagist.org/downloads/", 1360 | "license": [ 1361 | "BSD-3-Clause" 1362 | ], 1363 | "authors": [ 1364 | { 1365 | "name": "Sebastian Bergmann", 1366 | "email": "sebastian@phpunit.de", 1367 | "role": "lead" 1368 | } 1369 | ], 1370 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1371 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1372 | "keywords": [ 1373 | "filesystem", 1374 | "iterator" 1375 | ], 1376 | "support": { 1377 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 1378 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 1379 | }, 1380 | "funding": [ 1381 | { 1382 | "url": "https://github.com/sebastianbergmann", 1383 | "type": "github" 1384 | } 1385 | ], 1386 | "time": "2021-12-02T12:48:52+00:00" 1387 | }, 1388 | { 1389 | "name": "phpunit/php-invoker", 1390 | "version": "3.1.1", 1391 | "source": { 1392 | "type": "git", 1393 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 1394 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 1395 | }, 1396 | "dist": { 1397 | "type": "zip", 1398 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1399 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1400 | "shasum": "" 1401 | }, 1402 | "require": { 1403 | "php": ">=7.3" 1404 | }, 1405 | "require-dev": { 1406 | "ext-pcntl": "*", 1407 | "phpunit/phpunit": "^9.3" 1408 | }, 1409 | "suggest": { 1410 | "ext-pcntl": "*" 1411 | }, 1412 | "type": "library", 1413 | "extra": { 1414 | "branch-alias": { 1415 | "dev-master": "3.1-dev" 1416 | } 1417 | }, 1418 | "autoload": { 1419 | "classmap": [ 1420 | "src/" 1421 | ] 1422 | }, 1423 | "notification-url": "https://packagist.org/downloads/", 1424 | "license": [ 1425 | "BSD-3-Clause" 1426 | ], 1427 | "authors": [ 1428 | { 1429 | "name": "Sebastian Bergmann", 1430 | "email": "sebastian@phpunit.de", 1431 | "role": "lead" 1432 | } 1433 | ], 1434 | "description": "Invoke callables with a timeout", 1435 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1436 | "keywords": [ 1437 | "process" 1438 | ], 1439 | "support": { 1440 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1441 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 1442 | }, 1443 | "funding": [ 1444 | { 1445 | "url": "https://github.com/sebastianbergmann", 1446 | "type": "github" 1447 | } 1448 | ], 1449 | "time": "2020-09-28T05:58:55+00:00" 1450 | }, 1451 | { 1452 | "name": "phpunit/php-text-template", 1453 | "version": "2.0.4", 1454 | "source": { 1455 | "type": "git", 1456 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1457 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 1458 | }, 1459 | "dist": { 1460 | "type": "zip", 1461 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1462 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1463 | "shasum": "" 1464 | }, 1465 | "require": { 1466 | "php": ">=7.3" 1467 | }, 1468 | "require-dev": { 1469 | "phpunit/phpunit": "^9.3" 1470 | }, 1471 | "type": "library", 1472 | "extra": { 1473 | "branch-alias": { 1474 | "dev-master": "2.0-dev" 1475 | } 1476 | }, 1477 | "autoload": { 1478 | "classmap": [ 1479 | "src/" 1480 | ] 1481 | }, 1482 | "notification-url": "https://packagist.org/downloads/", 1483 | "license": [ 1484 | "BSD-3-Clause" 1485 | ], 1486 | "authors": [ 1487 | { 1488 | "name": "Sebastian Bergmann", 1489 | "email": "sebastian@phpunit.de", 1490 | "role": "lead" 1491 | } 1492 | ], 1493 | "description": "Simple template engine.", 1494 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1495 | "keywords": [ 1496 | "template" 1497 | ], 1498 | "support": { 1499 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1500 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1501 | }, 1502 | "funding": [ 1503 | { 1504 | "url": "https://github.com/sebastianbergmann", 1505 | "type": "github" 1506 | } 1507 | ], 1508 | "time": "2020-10-26T05:33:50+00:00" 1509 | }, 1510 | { 1511 | "name": "phpunit/php-timer", 1512 | "version": "5.0.3", 1513 | "source": { 1514 | "type": "git", 1515 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1516 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 1517 | }, 1518 | "dist": { 1519 | "type": "zip", 1520 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1521 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1522 | "shasum": "" 1523 | }, 1524 | "require": { 1525 | "php": ">=7.3" 1526 | }, 1527 | "require-dev": { 1528 | "phpunit/phpunit": "^9.3" 1529 | }, 1530 | "type": "library", 1531 | "extra": { 1532 | "branch-alias": { 1533 | "dev-master": "5.0-dev" 1534 | } 1535 | }, 1536 | "autoload": { 1537 | "classmap": [ 1538 | "src/" 1539 | ] 1540 | }, 1541 | "notification-url": "https://packagist.org/downloads/", 1542 | "license": [ 1543 | "BSD-3-Clause" 1544 | ], 1545 | "authors": [ 1546 | { 1547 | "name": "Sebastian Bergmann", 1548 | "email": "sebastian@phpunit.de", 1549 | "role": "lead" 1550 | } 1551 | ], 1552 | "description": "Utility class for timing", 1553 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1554 | "keywords": [ 1555 | "timer" 1556 | ], 1557 | "support": { 1558 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1559 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1560 | }, 1561 | "funding": [ 1562 | { 1563 | "url": "https://github.com/sebastianbergmann", 1564 | "type": "github" 1565 | } 1566 | ], 1567 | "time": "2020-10-26T13:16:10+00:00" 1568 | }, 1569 | { 1570 | "name": "phpunit/phpunit", 1571 | "version": "9.5.19", 1572 | "source": { 1573 | "type": "git", 1574 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1575 | "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807" 1576 | }, 1577 | "dist": { 1578 | "type": "zip", 1579 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35ea4b7f3acabb26f4bb640f8c30866c401da807", 1580 | "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807", 1581 | "shasum": "" 1582 | }, 1583 | "require": { 1584 | "doctrine/instantiator": "^1.3.1", 1585 | "ext-dom": "*", 1586 | "ext-json": "*", 1587 | "ext-libxml": "*", 1588 | "ext-mbstring": "*", 1589 | "ext-xml": "*", 1590 | "ext-xmlwriter": "*", 1591 | "myclabs/deep-copy": "^1.10.1", 1592 | "phar-io/manifest": "^2.0.3", 1593 | "phar-io/version": "^3.0.2", 1594 | "php": ">=7.3", 1595 | "phpspec/prophecy": "^1.12.1", 1596 | "phpunit/php-code-coverage": "^9.2.13", 1597 | "phpunit/php-file-iterator": "^3.0.5", 1598 | "phpunit/php-invoker": "^3.1.1", 1599 | "phpunit/php-text-template": "^2.0.3", 1600 | "phpunit/php-timer": "^5.0.2", 1601 | "sebastian/cli-parser": "^1.0.1", 1602 | "sebastian/code-unit": "^1.0.6", 1603 | "sebastian/comparator": "^4.0.5", 1604 | "sebastian/diff": "^4.0.3", 1605 | "sebastian/environment": "^5.1.3", 1606 | "sebastian/exporter": "^4.0.3", 1607 | "sebastian/global-state": "^5.0.1", 1608 | "sebastian/object-enumerator": "^4.0.3", 1609 | "sebastian/resource-operations": "^3.0.3", 1610 | "sebastian/type": "^3.0", 1611 | "sebastian/version": "^3.0.2" 1612 | }, 1613 | "require-dev": { 1614 | "ext-pdo": "*", 1615 | "phpspec/prophecy-phpunit": "^2.0.1" 1616 | }, 1617 | "suggest": { 1618 | "ext-soap": "*", 1619 | "ext-xdebug": "*" 1620 | }, 1621 | "bin": [ 1622 | "phpunit" 1623 | ], 1624 | "type": "library", 1625 | "extra": { 1626 | "branch-alias": { 1627 | "dev-master": "9.5-dev" 1628 | } 1629 | }, 1630 | "autoload": { 1631 | "files": [ 1632 | "src/Framework/Assert/Functions.php" 1633 | ], 1634 | "classmap": [ 1635 | "src/" 1636 | ] 1637 | }, 1638 | "notification-url": "https://packagist.org/downloads/", 1639 | "license": [ 1640 | "BSD-3-Clause" 1641 | ], 1642 | "authors": [ 1643 | { 1644 | "name": "Sebastian Bergmann", 1645 | "email": "sebastian@phpunit.de", 1646 | "role": "lead" 1647 | } 1648 | ], 1649 | "description": "The PHP Unit Testing framework.", 1650 | "homepage": "https://phpunit.de/", 1651 | "keywords": [ 1652 | "phpunit", 1653 | "testing", 1654 | "xunit" 1655 | ], 1656 | "support": { 1657 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1658 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.19" 1659 | }, 1660 | "funding": [ 1661 | { 1662 | "url": "https://phpunit.de/sponsors.html", 1663 | "type": "custom" 1664 | }, 1665 | { 1666 | "url": "https://github.com/sebastianbergmann", 1667 | "type": "github" 1668 | } 1669 | ], 1670 | "time": "2022-03-15T09:57:31+00:00" 1671 | }, 1672 | { 1673 | "name": "sebastian/cli-parser", 1674 | "version": "1.0.1", 1675 | "source": { 1676 | "type": "git", 1677 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1678 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1679 | }, 1680 | "dist": { 1681 | "type": "zip", 1682 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1683 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1684 | "shasum": "" 1685 | }, 1686 | "require": { 1687 | "php": ">=7.3" 1688 | }, 1689 | "require-dev": { 1690 | "phpunit/phpunit": "^9.3" 1691 | }, 1692 | "type": "library", 1693 | "extra": { 1694 | "branch-alias": { 1695 | "dev-master": "1.0-dev" 1696 | } 1697 | }, 1698 | "autoload": { 1699 | "classmap": [ 1700 | "src/" 1701 | ] 1702 | }, 1703 | "notification-url": "https://packagist.org/downloads/", 1704 | "license": [ 1705 | "BSD-3-Clause" 1706 | ], 1707 | "authors": [ 1708 | { 1709 | "name": "Sebastian Bergmann", 1710 | "email": "sebastian@phpunit.de", 1711 | "role": "lead" 1712 | } 1713 | ], 1714 | "description": "Library for parsing CLI options", 1715 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1716 | "support": { 1717 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1718 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1719 | }, 1720 | "funding": [ 1721 | { 1722 | "url": "https://github.com/sebastianbergmann", 1723 | "type": "github" 1724 | } 1725 | ], 1726 | "time": "2020-09-28T06:08:49+00:00" 1727 | }, 1728 | { 1729 | "name": "sebastian/code-unit", 1730 | "version": "1.0.8", 1731 | "source": { 1732 | "type": "git", 1733 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1734 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1735 | }, 1736 | "dist": { 1737 | "type": "zip", 1738 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1739 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1740 | "shasum": "" 1741 | }, 1742 | "require": { 1743 | "php": ">=7.3" 1744 | }, 1745 | "require-dev": { 1746 | "phpunit/phpunit": "^9.3" 1747 | }, 1748 | "type": "library", 1749 | "extra": { 1750 | "branch-alias": { 1751 | "dev-master": "1.0-dev" 1752 | } 1753 | }, 1754 | "autoload": { 1755 | "classmap": [ 1756 | "src/" 1757 | ] 1758 | }, 1759 | "notification-url": "https://packagist.org/downloads/", 1760 | "license": [ 1761 | "BSD-3-Clause" 1762 | ], 1763 | "authors": [ 1764 | { 1765 | "name": "Sebastian Bergmann", 1766 | "email": "sebastian@phpunit.de", 1767 | "role": "lead" 1768 | } 1769 | ], 1770 | "description": "Collection of value objects that represent the PHP code units", 1771 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1772 | "support": { 1773 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1774 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1775 | }, 1776 | "funding": [ 1777 | { 1778 | "url": "https://github.com/sebastianbergmann", 1779 | "type": "github" 1780 | } 1781 | ], 1782 | "time": "2020-10-26T13:08:54+00:00" 1783 | }, 1784 | { 1785 | "name": "sebastian/code-unit-reverse-lookup", 1786 | "version": "2.0.3", 1787 | "source": { 1788 | "type": "git", 1789 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1790 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1791 | }, 1792 | "dist": { 1793 | "type": "zip", 1794 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1795 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1796 | "shasum": "" 1797 | }, 1798 | "require": { 1799 | "php": ">=7.3" 1800 | }, 1801 | "require-dev": { 1802 | "phpunit/phpunit": "^9.3" 1803 | }, 1804 | "type": "library", 1805 | "extra": { 1806 | "branch-alias": { 1807 | "dev-master": "2.0-dev" 1808 | } 1809 | }, 1810 | "autoload": { 1811 | "classmap": [ 1812 | "src/" 1813 | ] 1814 | }, 1815 | "notification-url": "https://packagist.org/downloads/", 1816 | "license": [ 1817 | "BSD-3-Clause" 1818 | ], 1819 | "authors": [ 1820 | { 1821 | "name": "Sebastian Bergmann", 1822 | "email": "sebastian@phpunit.de" 1823 | } 1824 | ], 1825 | "description": "Looks up which function or method a line of code belongs to", 1826 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1827 | "support": { 1828 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1829 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1830 | }, 1831 | "funding": [ 1832 | { 1833 | "url": "https://github.com/sebastianbergmann", 1834 | "type": "github" 1835 | } 1836 | ], 1837 | "time": "2020-09-28T05:30:19+00:00" 1838 | }, 1839 | { 1840 | "name": "sebastian/comparator", 1841 | "version": "4.0.6", 1842 | "source": { 1843 | "type": "git", 1844 | "url": "https://github.com/sebastianbergmann/comparator.git", 1845 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382" 1846 | }, 1847 | "dist": { 1848 | "type": "zip", 1849 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", 1850 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382", 1851 | "shasum": "" 1852 | }, 1853 | "require": { 1854 | "php": ">=7.3", 1855 | "sebastian/diff": "^4.0", 1856 | "sebastian/exporter": "^4.0" 1857 | }, 1858 | "require-dev": { 1859 | "phpunit/phpunit": "^9.3" 1860 | }, 1861 | "type": "library", 1862 | "extra": { 1863 | "branch-alias": { 1864 | "dev-master": "4.0-dev" 1865 | } 1866 | }, 1867 | "autoload": { 1868 | "classmap": [ 1869 | "src/" 1870 | ] 1871 | }, 1872 | "notification-url": "https://packagist.org/downloads/", 1873 | "license": [ 1874 | "BSD-3-Clause" 1875 | ], 1876 | "authors": [ 1877 | { 1878 | "name": "Sebastian Bergmann", 1879 | "email": "sebastian@phpunit.de" 1880 | }, 1881 | { 1882 | "name": "Jeff Welch", 1883 | "email": "whatthejeff@gmail.com" 1884 | }, 1885 | { 1886 | "name": "Volker Dusch", 1887 | "email": "github@wallbash.com" 1888 | }, 1889 | { 1890 | "name": "Bernhard Schussek", 1891 | "email": "bschussek@2bepublished.at" 1892 | } 1893 | ], 1894 | "description": "Provides the functionality to compare PHP values for equality", 1895 | "homepage": "https://github.com/sebastianbergmann/comparator", 1896 | "keywords": [ 1897 | "comparator", 1898 | "compare", 1899 | "equality" 1900 | ], 1901 | "support": { 1902 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1903 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" 1904 | }, 1905 | "funding": [ 1906 | { 1907 | "url": "https://github.com/sebastianbergmann", 1908 | "type": "github" 1909 | } 1910 | ], 1911 | "time": "2020-10-26T15:49:45+00:00" 1912 | }, 1913 | { 1914 | "name": "sebastian/complexity", 1915 | "version": "2.0.2", 1916 | "source": { 1917 | "type": "git", 1918 | "url": "https://github.com/sebastianbergmann/complexity.git", 1919 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1920 | }, 1921 | "dist": { 1922 | "type": "zip", 1923 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1924 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1925 | "shasum": "" 1926 | }, 1927 | "require": { 1928 | "nikic/php-parser": "^4.7", 1929 | "php": ">=7.3" 1930 | }, 1931 | "require-dev": { 1932 | "phpunit/phpunit": "^9.3" 1933 | }, 1934 | "type": "library", 1935 | "extra": { 1936 | "branch-alias": { 1937 | "dev-master": "2.0-dev" 1938 | } 1939 | }, 1940 | "autoload": { 1941 | "classmap": [ 1942 | "src/" 1943 | ] 1944 | }, 1945 | "notification-url": "https://packagist.org/downloads/", 1946 | "license": [ 1947 | "BSD-3-Clause" 1948 | ], 1949 | "authors": [ 1950 | { 1951 | "name": "Sebastian Bergmann", 1952 | "email": "sebastian@phpunit.de", 1953 | "role": "lead" 1954 | } 1955 | ], 1956 | "description": "Library for calculating the complexity of PHP code units", 1957 | "homepage": "https://github.com/sebastianbergmann/complexity", 1958 | "support": { 1959 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1960 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1961 | }, 1962 | "funding": [ 1963 | { 1964 | "url": "https://github.com/sebastianbergmann", 1965 | "type": "github" 1966 | } 1967 | ], 1968 | "time": "2020-10-26T15:52:27+00:00" 1969 | }, 1970 | { 1971 | "name": "sebastian/diff", 1972 | "version": "4.0.4", 1973 | "source": { 1974 | "type": "git", 1975 | "url": "https://github.com/sebastianbergmann/diff.git", 1976 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 1977 | }, 1978 | "dist": { 1979 | "type": "zip", 1980 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1981 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1982 | "shasum": "" 1983 | }, 1984 | "require": { 1985 | "php": ">=7.3" 1986 | }, 1987 | "require-dev": { 1988 | "phpunit/phpunit": "^9.3", 1989 | "symfony/process": "^4.2 || ^5" 1990 | }, 1991 | "type": "library", 1992 | "extra": { 1993 | "branch-alias": { 1994 | "dev-master": "4.0-dev" 1995 | } 1996 | }, 1997 | "autoload": { 1998 | "classmap": [ 1999 | "src/" 2000 | ] 2001 | }, 2002 | "notification-url": "https://packagist.org/downloads/", 2003 | "license": [ 2004 | "BSD-3-Clause" 2005 | ], 2006 | "authors": [ 2007 | { 2008 | "name": "Sebastian Bergmann", 2009 | "email": "sebastian@phpunit.de" 2010 | }, 2011 | { 2012 | "name": "Kore Nordmann", 2013 | "email": "mail@kore-nordmann.de" 2014 | } 2015 | ], 2016 | "description": "Diff implementation", 2017 | "homepage": "https://github.com/sebastianbergmann/diff", 2018 | "keywords": [ 2019 | "diff", 2020 | "udiff", 2021 | "unidiff", 2022 | "unified diff" 2023 | ], 2024 | "support": { 2025 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2026 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 2027 | }, 2028 | "funding": [ 2029 | { 2030 | "url": "https://github.com/sebastianbergmann", 2031 | "type": "github" 2032 | } 2033 | ], 2034 | "time": "2020-10-26T13:10:38+00:00" 2035 | }, 2036 | { 2037 | "name": "sebastian/environment", 2038 | "version": "5.1.3", 2039 | "source": { 2040 | "type": "git", 2041 | "url": "https://github.com/sebastianbergmann/environment.git", 2042 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac" 2043 | }, 2044 | "dist": { 2045 | "type": "zip", 2046 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", 2047 | "reference": "388b6ced16caa751030f6a69e588299fa09200ac", 2048 | "shasum": "" 2049 | }, 2050 | "require": { 2051 | "php": ">=7.3" 2052 | }, 2053 | "require-dev": { 2054 | "phpunit/phpunit": "^9.3" 2055 | }, 2056 | "suggest": { 2057 | "ext-posix": "*" 2058 | }, 2059 | "type": "library", 2060 | "extra": { 2061 | "branch-alias": { 2062 | "dev-master": "5.1-dev" 2063 | } 2064 | }, 2065 | "autoload": { 2066 | "classmap": [ 2067 | "src/" 2068 | ] 2069 | }, 2070 | "notification-url": "https://packagist.org/downloads/", 2071 | "license": [ 2072 | "BSD-3-Clause" 2073 | ], 2074 | "authors": [ 2075 | { 2076 | "name": "Sebastian Bergmann", 2077 | "email": "sebastian@phpunit.de" 2078 | } 2079 | ], 2080 | "description": "Provides functionality to handle HHVM/PHP environments", 2081 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2082 | "keywords": [ 2083 | "Xdebug", 2084 | "environment", 2085 | "hhvm" 2086 | ], 2087 | "support": { 2088 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2089 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" 2090 | }, 2091 | "funding": [ 2092 | { 2093 | "url": "https://github.com/sebastianbergmann", 2094 | "type": "github" 2095 | } 2096 | ], 2097 | "time": "2020-09-28T05:52:38+00:00" 2098 | }, 2099 | { 2100 | "name": "sebastian/exporter", 2101 | "version": "4.0.4", 2102 | "source": { 2103 | "type": "git", 2104 | "url": "https://github.com/sebastianbergmann/exporter.git", 2105 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" 2106 | }, 2107 | "dist": { 2108 | "type": "zip", 2109 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", 2110 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", 2111 | "shasum": "" 2112 | }, 2113 | "require": { 2114 | "php": ">=7.3", 2115 | "sebastian/recursion-context": "^4.0" 2116 | }, 2117 | "require-dev": { 2118 | "ext-mbstring": "*", 2119 | "phpunit/phpunit": "^9.3" 2120 | }, 2121 | "type": "library", 2122 | "extra": { 2123 | "branch-alias": { 2124 | "dev-master": "4.0-dev" 2125 | } 2126 | }, 2127 | "autoload": { 2128 | "classmap": [ 2129 | "src/" 2130 | ] 2131 | }, 2132 | "notification-url": "https://packagist.org/downloads/", 2133 | "license": [ 2134 | "BSD-3-Clause" 2135 | ], 2136 | "authors": [ 2137 | { 2138 | "name": "Sebastian Bergmann", 2139 | "email": "sebastian@phpunit.de" 2140 | }, 2141 | { 2142 | "name": "Jeff Welch", 2143 | "email": "whatthejeff@gmail.com" 2144 | }, 2145 | { 2146 | "name": "Volker Dusch", 2147 | "email": "github@wallbash.com" 2148 | }, 2149 | { 2150 | "name": "Adam Harvey", 2151 | "email": "aharvey@php.net" 2152 | }, 2153 | { 2154 | "name": "Bernhard Schussek", 2155 | "email": "bschussek@gmail.com" 2156 | } 2157 | ], 2158 | "description": "Provides the functionality to export PHP variables for visualization", 2159 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 2160 | "keywords": [ 2161 | "export", 2162 | "exporter" 2163 | ], 2164 | "support": { 2165 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2166 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" 2167 | }, 2168 | "funding": [ 2169 | { 2170 | "url": "https://github.com/sebastianbergmann", 2171 | "type": "github" 2172 | } 2173 | ], 2174 | "time": "2021-11-11T14:18:36+00:00" 2175 | }, 2176 | { 2177 | "name": "sebastian/global-state", 2178 | "version": "5.0.5", 2179 | "source": { 2180 | "type": "git", 2181 | "url": "https://github.com/sebastianbergmann/global-state.git", 2182 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 2183 | }, 2184 | "dist": { 2185 | "type": "zip", 2186 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 2187 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 2188 | "shasum": "" 2189 | }, 2190 | "require": { 2191 | "php": ">=7.3", 2192 | "sebastian/object-reflector": "^2.0", 2193 | "sebastian/recursion-context": "^4.0" 2194 | }, 2195 | "require-dev": { 2196 | "ext-dom": "*", 2197 | "phpunit/phpunit": "^9.3" 2198 | }, 2199 | "suggest": { 2200 | "ext-uopz": "*" 2201 | }, 2202 | "type": "library", 2203 | "extra": { 2204 | "branch-alias": { 2205 | "dev-master": "5.0-dev" 2206 | } 2207 | }, 2208 | "autoload": { 2209 | "classmap": [ 2210 | "src/" 2211 | ] 2212 | }, 2213 | "notification-url": "https://packagist.org/downloads/", 2214 | "license": [ 2215 | "BSD-3-Clause" 2216 | ], 2217 | "authors": [ 2218 | { 2219 | "name": "Sebastian Bergmann", 2220 | "email": "sebastian@phpunit.de" 2221 | } 2222 | ], 2223 | "description": "Snapshotting of global state", 2224 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2225 | "keywords": [ 2226 | "global state" 2227 | ], 2228 | "support": { 2229 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2230 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 2231 | }, 2232 | "funding": [ 2233 | { 2234 | "url": "https://github.com/sebastianbergmann", 2235 | "type": "github" 2236 | } 2237 | ], 2238 | "time": "2022-02-14T08:28:10+00:00" 2239 | }, 2240 | { 2241 | "name": "sebastian/lines-of-code", 2242 | "version": "1.0.3", 2243 | "source": { 2244 | "type": "git", 2245 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2246 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 2247 | }, 2248 | "dist": { 2249 | "type": "zip", 2250 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2251 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2252 | "shasum": "" 2253 | }, 2254 | "require": { 2255 | "nikic/php-parser": "^4.6", 2256 | "php": ">=7.3" 2257 | }, 2258 | "require-dev": { 2259 | "phpunit/phpunit": "^9.3" 2260 | }, 2261 | "type": "library", 2262 | "extra": { 2263 | "branch-alias": { 2264 | "dev-master": "1.0-dev" 2265 | } 2266 | }, 2267 | "autoload": { 2268 | "classmap": [ 2269 | "src/" 2270 | ] 2271 | }, 2272 | "notification-url": "https://packagist.org/downloads/", 2273 | "license": [ 2274 | "BSD-3-Clause" 2275 | ], 2276 | "authors": [ 2277 | { 2278 | "name": "Sebastian Bergmann", 2279 | "email": "sebastian@phpunit.de", 2280 | "role": "lead" 2281 | } 2282 | ], 2283 | "description": "Library for counting the lines of code in PHP source code", 2284 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2285 | "support": { 2286 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2287 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 2288 | }, 2289 | "funding": [ 2290 | { 2291 | "url": "https://github.com/sebastianbergmann", 2292 | "type": "github" 2293 | } 2294 | ], 2295 | "time": "2020-11-28T06:42:11+00:00" 2296 | }, 2297 | { 2298 | "name": "sebastian/object-enumerator", 2299 | "version": "4.0.4", 2300 | "source": { 2301 | "type": "git", 2302 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2303 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 2304 | }, 2305 | "dist": { 2306 | "type": "zip", 2307 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 2308 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 2309 | "shasum": "" 2310 | }, 2311 | "require": { 2312 | "php": ">=7.3", 2313 | "sebastian/object-reflector": "^2.0", 2314 | "sebastian/recursion-context": "^4.0" 2315 | }, 2316 | "require-dev": { 2317 | "phpunit/phpunit": "^9.3" 2318 | }, 2319 | "type": "library", 2320 | "extra": { 2321 | "branch-alias": { 2322 | "dev-master": "4.0-dev" 2323 | } 2324 | }, 2325 | "autoload": { 2326 | "classmap": [ 2327 | "src/" 2328 | ] 2329 | }, 2330 | "notification-url": "https://packagist.org/downloads/", 2331 | "license": [ 2332 | "BSD-3-Clause" 2333 | ], 2334 | "authors": [ 2335 | { 2336 | "name": "Sebastian Bergmann", 2337 | "email": "sebastian@phpunit.de" 2338 | } 2339 | ], 2340 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2341 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2342 | "support": { 2343 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2344 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 2345 | }, 2346 | "funding": [ 2347 | { 2348 | "url": "https://github.com/sebastianbergmann", 2349 | "type": "github" 2350 | } 2351 | ], 2352 | "time": "2020-10-26T13:12:34+00:00" 2353 | }, 2354 | { 2355 | "name": "sebastian/object-reflector", 2356 | "version": "2.0.4", 2357 | "source": { 2358 | "type": "git", 2359 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2360 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 2361 | }, 2362 | "dist": { 2363 | "type": "zip", 2364 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2365 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2366 | "shasum": "" 2367 | }, 2368 | "require": { 2369 | "php": ">=7.3" 2370 | }, 2371 | "require-dev": { 2372 | "phpunit/phpunit": "^9.3" 2373 | }, 2374 | "type": "library", 2375 | "extra": { 2376 | "branch-alias": { 2377 | "dev-master": "2.0-dev" 2378 | } 2379 | }, 2380 | "autoload": { 2381 | "classmap": [ 2382 | "src/" 2383 | ] 2384 | }, 2385 | "notification-url": "https://packagist.org/downloads/", 2386 | "license": [ 2387 | "BSD-3-Clause" 2388 | ], 2389 | "authors": [ 2390 | { 2391 | "name": "Sebastian Bergmann", 2392 | "email": "sebastian@phpunit.de" 2393 | } 2394 | ], 2395 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2396 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2397 | "support": { 2398 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2399 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 2400 | }, 2401 | "funding": [ 2402 | { 2403 | "url": "https://github.com/sebastianbergmann", 2404 | "type": "github" 2405 | } 2406 | ], 2407 | "time": "2020-10-26T13:14:26+00:00" 2408 | }, 2409 | { 2410 | "name": "sebastian/recursion-context", 2411 | "version": "4.0.4", 2412 | "source": { 2413 | "type": "git", 2414 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2415 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" 2416 | }, 2417 | "dist": { 2418 | "type": "zip", 2419 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", 2420 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", 2421 | "shasum": "" 2422 | }, 2423 | "require": { 2424 | "php": ">=7.3" 2425 | }, 2426 | "require-dev": { 2427 | "phpunit/phpunit": "^9.3" 2428 | }, 2429 | "type": "library", 2430 | "extra": { 2431 | "branch-alias": { 2432 | "dev-master": "4.0-dev" 2433 | } 2434 | }, 2435 | "autoload": { 2436 | "classmap": [ 2437 | "src/" 2438 | ] 2439 | }, 2440 | "notification-url": "https://packagist.org/downloads/", 2441 | "license": [ 2442 | "BSD-3-Clause" 2443 | ], 2444 | "authors": [ 2445 | { 2446 | "name": "Sebastian Bergmann", 2447 | "email": "sebastian@phpunit.de" 2448 | }, 2449 | { 2450 | "name": "Jeff Welch", 2451 | "email": "whatthejeff@gmail.com" 2452 | }, 2453 | { 2454 | "name": "Adam Harvey", 2455 | "email": "aharvey@php.net" 2456 | } 2457 | ], 2458 | "description": "Provides functionality to recursively process PHP variables", 2459 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2460 | "support": { 2461 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2462 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" 2463 | }, 2464 | "funding": [ 2465 | { 2466 | "url": "https://github.com/sebastianbergmann", 2467 | "type": "github" 2468 | } 2469 | ], 2470 | "time": "2020-10-26T13:17:30+00:00" 2471 | }, 2472 | { 2473 | "name": "sebastian/resource-operations", 2474 | "version": "3.0.3", 2475 | "source": { 2476 | "type": "git", 2477 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2478 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2479 | }, 2480 | "dist": { 2481 | "type": "zip", 2482 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2483 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2484 | "shasum": "" 2485 | }, 2486 | "require": { 2487 | "php": ">=7.3" 2488 | }, 2489 | "require-dev": { 2490 | "phpunit/phpunit": "^9.0" 2491 | }, 2492 | "type": "library", 2493 | "extra": { 2494 | "branch-alias": { 2495 | "dev-master": "3.0-dev" 2496 | } 2497 | }, 2498 | "autoload": { 2499 | "classmap": [ 2500 | "src/" 2501 | ] 2502 | }, 2503 | "notification-url": "https://packagist.org/downloads/", 2504 | "license": [ 2505 | "BSD-3-Clause" 2506 | ], 2507 | "authors": [ 2508 | { 2509 | "name": "Sebastian Bergmann", 2510 | "email": "sebastian@phpunit.de" 2511 | } 2512 | ], 2513 | "description": "Provides a list of PHP built-in functions that operate on resources", 2514 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2515 | "support": { 2516 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2517 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2518 | }, 2519 | "funding": [ 2520 | { 2521 | "url": "https://github.com/sebastianbergmann", 2522 | "type": "github" 2523 | } 2524 | ], 2525 | "time": "2020-09-28T06:45:17+00:00" 2526 | }, 2527 | { 2528 | "name": "sebastian/type", 2529 | "version": "3.0.0", 2530 | "source": { 2531 | "type": "git", 2532 | "url": "https://github.com/sebastianbergmann/type.git", 2533 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" 2534 | }, 2535 | "dist": { 2536 | "type": "zip", 2537 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", 2538 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", 2539 | "shasum": "" 2540 | }, 2541 | "require": { 2542 | "php": ">=7.3" 2543 | }, 2544 | "require-dev": { 2545 | "phpunit/phpunit": "^9.5" 2546 | }, 2547 | "type": "library", 2548 | "extra": { 2549 | "branch-alias": { 2550 | "dev-master": "3.0-dev" 2551 | } 2552 | }, 2553 | "autoload": { 2554 | "classmap": [ 2555 | "src/" 2556 | ] 2557 | }, 2558 | "notification-url": "https://packagist.org/downloads/", 2559 | "license": [ 2560 | "BSD-3-Clause" 2561 | ], 2562 | "authors": [ 2563 | { 2564 | "name": "Sebastian Bergmann", 2565 | "email": "sebastian@phpunit.de", 2566 | "role": "lead" 2567 | } 2568 | ], 2569 | "description": "Collection of value objects that represent the types of the PHP type system", 2570 | "homepage": "https://github.com/sebastianbergmann/type", 2571 | "support": { 2572 | "issues": "https://github.com/sebastianbergmann/type/issues", 2573 | "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" 2574 | }, 2575 | "funding": [ 2576 | { 2577 | "url": "https://github.com/sebastianbergmann", 2578 | "type": "github" 2579 | } 2580 | ], 2581 | "time": "2022-03-15T09:54:48+00:00" 2582 | }, 2583 | { 2584 | "name": "sebastian/version", 2585 | "version": "3.0.2", 2586 | "source": { 2587 | "type": "git", 2588 | "url": "https://github.com/sebastianbergmann/version.git", 2589 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2590 | }, 2591 | "dist": { 2592 | "type": "zip", 2593 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2594 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2595 | "shasum": "" 2596 | }, 2597 | "require": { 2598 | "php": ">=7.3" 2599 | }, 2600 | "type": "library", 2601 | "extra": { 2602 | "branch-alias": { 2603 | "dev-master": "3.0-dev" 2604 | } 2605 | }, 2606 | "autoload": { 2607 | "classmap": [ 2608 | "src/" 2609 | ] 2610 | }, 2611 | "notification-url": "https://packagist.org/downloads/", 2612 | "license": [ 2613 | "BSD-3-Clause" 2614 | ], 2615 | "authors": [ 2616 | { 2617 | "name": "Sebastian Bergmann", 2618 | "email": "sebastian@phpunit.de", 2619 | "role": "lead" 2620 | } 2621 | ], 2622 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2623 | "homepage": "https://github.com/sebastianbergmann/version", 2624 | "support": { 2625 | "issues": "https://github.com/sebastianbergmann/version/issues", 2626 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2627 | }, 2628 | "funding": [ 2629 | { 2630 | "url": "https://github.com/sebastianbergmann", 2631 | "type": "github" 2632 | } 2633 | ], 2634 | "time": "2020-09-28T06:39:44+00:00" 2635 | }, 2636 | { 2637 | "name": "symfony/polyfill-ctype", 2638 | "version": "v1.25.0", 2639 | "source": { 2640 | "type": "git", 2641 | "url": "https://github.com/symfony/polyfill-ctype.git", 2642 | "reference": "30885182c981ab175d4d034db0f6f469898070ab" 2643 | }, 2644 | "dist": { 2645 | "type": "zip", 2646 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", 2647 | "reference": "30885182c981ab175d4d034db0f6f469898070ab", 2648 | "shasum": "" 2649 | }, 2650 | "require": { 2651 | "php": ">=7.1" 2652 | }, 2653 | "provide": { 2654 | "ext-ctype": "*" 2655 | }, 2656 | "suggest": { 2657 | "ext-ctype": "For best performance" 2658 | }, 2659 | "type": "library", 2660 | "extra": { 2661 | "branch-alias": { 2662 | "dev-main": "1.23-dev" 2663 | }, 2664 | "thanks": { 2665 | "name": "symfony/polyfill", 2666 | "url": "https://github.com/symfony/polyfill" 2667 | } 2668 | }, 2669 | "autoload": { 2670 | "files": [ 2671 | "bootstrap.php" 2672 | ], 2673 | "psr-4": { 2674 | "Symfony\\Polyfill\\Ctype\\": "" 2675 | } 2676 | }, 2677 | "notification-url": "https://packagist.org/downloads/", 2678 | "license": [ 2679 | "MIT" 2680 | ], 2681 | "authors": [ 2682 | { 2683 | "name": "Gert de Pagter", 2684 | "email": "BackEndTea@gmail.com" 2685 | }, 2686 | { 2687 | "name": "Symfony Community", 2688 | "homepage": "https://symfony.com/contributors" 2689 | } 2690 | ], 2691 | "description": "Symfony polyfill for ctype functions", 2692 | "homepage": "https://symfony.com", 2693 | "keywords": [ 2694 | "compatibility", 2695 | "ctype", 2696 | "polyfill", 2697 | "portable" 2698 | ], 2699 | "support": { 2700 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" 2701 | }, 2702 | "funding": [ 2703 | { 2704 | "url": "https://symfony.com/sponsor", 2705 | "type": "custom" 2706 | }, 2707 | { 2708 | "url": "https://github.com/fabpot", 2709 | "type": "github" 2710 | }, 2711 | { 2712 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2713 | "type": "tidelift" 2714 | } 2715 | ], 2716 | "time": "2021-10-20T20:35:02+00:00" 2717 | }, 2718 | { 2719 | "name": "theseer/tokenizer", 2720 | "version": "1.2.1", 2721 | "source": { 2722 | "type": "git", 2723 | "url": "https://github.com/theseer/tokenizer.git", 2724 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 2725 | }, 2726 | "dist": { 2727 | "type": "zip", 2728 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 2729 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 2730 | "shasum": "" 2731 | }, 2732 | "require": { 2733 | "ext-dom": "*", 2734 | "ext-tokenizer": "*", 2735 | "ext-xmlwriter": "*", 2736 | "php": "^7.2 || ^8.0" 2737 | }, 2738 | "type": "library", 2739 | "autoload": { 2740 | "classmap": [ 2741 | "src/" 2742 | ] 2743 | }, 2744 | "notification-url": "https://packagist.org/downloads/", 2745 | "license": [ 2746 | "BSD-3-Clause" 2747 | ], 2748 | "authors": [ 2749 | { 2750 | "name": "Arne Blankerts", 2751 | "email": "arne@blankerts.de", 2752 | "role": "Developer" 2753 | } 2754 | ], 2755 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2756 | "support": { 2757 | "issues": "https://github.com/theseer/tokenizer/issues", 2758 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 2759 | }, 2760 | "funding": [ 2761 | { 2762 | "url": "https://github.com/theseer", 2763 | "type": "github" 2764 | } 2765 | ], 2766 | "time": "2021-07-28T10:34:58+00:00" 2767 | }, 2768 | { 2769 | "name": "webmozart/assert", 2770 | "version": "1.10.0", 2771 | "source": { 2772 | "type": "git", 2773 | "url": "https://github.com/webmozarts/assert.git", 2774 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" 2775 | }, 2776 | "dist": { 2777 | "type": "zip", 2778 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", 2779 | "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", 2780 | "shasum": "" 2781 | }, 2782 | "require": { 2783 | "php": "^7.2 || ^8.0", 2784 | "symfony/polyfill-ctype": "^1.8" 2785 | }, 2786 | "conflict": { 2787 | "phpstan/phpstan": "<0.12.20", 2788 | "vimeo/psalm": "<4.6.1 || 4.6.2" 2789 | }, 2790 | "require-dev": { 2791 | "phpunit/phpunit": "^8.5.13" 2792 | }, 2793 | "type": "library", 2794 | "extra": { 2795 | "branch-alias": { 2796 | "dev-master": "1.10-dev" 2797 | } 2798 | }, 2799 | "autoload": { 2800 | "psr-4": { 2801 | "Webmozart\\Assert\\": "src/" 2802 | } 2803 | }, 2804 | "notification-url": "https://packagist.org/downloads/", 2805 | "license": [ 2806 | "MIT" 2807 | ], 2808 | "authors": [ 2809 | { 2810 | "name": "Bernhard Schussek", 2811 | "email": "bschussek@gmail.com" 2812 | } 2813 | ], 2814 | "description": "Assertions to validate method input/output with nice error messages.", 2815 | "keywords": [ 2816 | "assert", 2817 | "check", 2818 | "validate" 2819 | ], 2820 | "support": { 2821 | "issues": "https://github.com/webmozarts/assert/issues", 2822 | "source": "https://github.com/webmozarts/assert/tree/1.10.0" 2823 | }, 2824 | "time": "2021-03-09T10:59:23+00:00" 2825 | } 2826 | ], 2827 | "aliases": [], 2828 | "minimum-stability": "dev", 2829 | "stability-flags": [], 2830 | "prefer-stable": true, 2831 | "prefer-lowest": false, 2832 | "platform": { 2833 | "php": "^7.2|^8.0", 2834 | "ext-json": "*" 2835 | }, 2836 | "platform-dev": [], 2837 | "plugin-api-version": "2.2.0" 2838 | } 2839 | --------------------------------------------------------------------------------