├── .github ├── FUNDING.yml └── workflows │ ├── changelog.yml │ └── php-version-installation-pipeline.yml ├── file └── nagad-logo.png ├── .gitignore ├── .env.example ├── src ├── Test │ ├── Test │ │ └── phpunit.xml │ └── Functionality │ │ └── FeatureTest.php ├── Exception │ ├── NagadPaymentException.php │ └── ExceptionHandler.php ├── lib │ └── Key.php ├── Base.php ├── RequestHandler.php └── Helper.php ├── composer.json ├── readme.md ├── CHANGELOG.md └── composer.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://www.buymeacoffee.com/arif98741 2 | -------------------------------------------------------------------------------- /file/nagad-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arif98741/nagadApi/HEAD/file/nagad-logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .phpintel 2 | .idea 3 | .vscode 4 | *.log 5 | *.iml 6 | *.composerLog 7 | *.zip 8 | vendor/ 9 | logs/ 10 | index.php 11 | .env 12 | works 13 | 14 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | NAGAD_APP_ENV = development 2 | NAGAD_APP_LOG = 1 3 | NAGAD_APP_ACCOUNT = 4 | NAGAD_APP_MERCHANTID = 5 | NAGAD_APP_MERCHANT_PRIVATE_KEY = 6 | NAGAD_APP_MERCHANT_PG_PUBLIC_KEY = 7 | NAGAD_APP_TIMEZONE = Asia/Dhaka -------------------------------------------------------------------------------- /src/Test/Test/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | /UnitTestFiles/Test/ 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/Exception/NagadPaymentException.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /src/Exception/ExceptionHandler.php: -------------------------------------------------------------------------------- 1 | appEnv; 64 | $data['NAGAD_APP_ACCOUNT'] = $config->appAccount; 65 | $data['NAGAD_APP_MERCHANTID'] = $config->appMerchantID; 66 | $data['NAGAD_APP_MERCHANT_PRIVATE_KEY'] = $config->merchantPrivateKey; 67 | $data['NAGAD_APP_MERCHANT_PG_PUBLIC_KEY'] = $config->pgPublicKey; 68 | $data['NAGAD_APP_TIMEZONE'] = $config->timeZone; 69 | $envData = self::generateEnv($data); 70 | 71 | } else { 72 | 73 | $envData = self::generateEnv($config); 74 | } 75 | 76 | $this->appEnv = $envData['NAGAD_APP_ENV']; 77 | //$this->appAccount = $envData['NAGAD_APP_ACCOUNT']; 78 | $this->appMerchantID = $envData['NAGAD_APP_MERCHANTID']; 79 | $this->merchantPrivateKey = $envData['NAGAD_APP_MERCHANT_PRIVATE_KEY']; 80 | $this->pgPublicKey = $envData['NAGAD_APP_MERCHANT_PG_PUBLIC_KEY']; 81 | if (array_key_exists('NAGAD_APP_TIMEZONE', $envData)) { 82 | $this->timeZone = $envData['NAGAD_APP_TIMEZONE']; 83 | } 84 | 85 | } 86 | 87 | /** 88 | * Return all data inside .env file as array 89 | * @param $config 90 | * @return array 91 | * @since v1.3.1 92 | */ 93 | private function generateEnv($config) 94 | { 95 | return $config; 96 | } 97 | 98 | /** 99 | * @return $this 100 | * @since v1.3.1 101 | */ 102 | public function getVariables() 103 | { 104 | return $this; 105 | } 106 | 107 | /** 108 | * @return mixed 109 | * @since v1.3.1 110 | */ 111 | public function getAppEnv() 112 | { 113 | return $this->appEnv; 114 | } 115 | 116 | /** 117 | * @param mixed $appEnv 118 | * @since v1.3.1 119 | */ 120 | public function setAppEnv($appEnv) 121 | { 122 | $this->appEnv = $appEnv; 123 | } 124 | 125 | /** 126 | * @return mixed 127 | * @since v1.3.1 128 | */ 129 | public function getAppAccount() 130 | { 131 | return $this->appAccount; 132 | } 133 | 134 | /** 135 | * @param mixed $appAccount 136 | * @since v1.3.1 137 | */ 138 | public function setAppAccount($appAccount) 139 | { 140 | $this->appAccount = $appAccount; 141 | } 142 | 143 | /** 144 | * @return mixed 145 | * @since v1.3.1 146 | */ 147 | public function getAppMerchantID() 148 | { 149 | return $this->appMerchantID; 150 | } 151 | 152 | /** 153 | * @param mixed $appMerchantID 154 | * @since v1.3.1 155 | */ 156 | public function setAppMerchantID($appMerchantID) 157 | { 158 | $this->appMerchantID = $appMerchantID; 159 | } 160 | 161 | /** 162 | * @return mixed 163 | * @since v1.3.1 164 | */ 165 | public function getMerchantPrivateKey() 166 | { 167 | return $this->merchantPrivateKey; 168 | } 169 | 170 | /** 171 | * @param mixed $merchantPrivateKey 172 | * @since v1.3.1 173 | */ 174 | public function setMerchantPrivateKey($merchantPrivateKey) 175 | { 176 | $this->merchantPrivateKey = $merchantPrivateKey; 177 | } 178 | 179 | /** 180 | * @return mixed 181 | * @since v1.3.1 182 | */ 183 | public function getPgPublicKey() 184 | { 185 | return $this->pgPublicKey; 186 | } 187 | 188 | /** 189 | * @param mixed $pgPublicKey 190 | * @since v1.3.1 191 | */ 192 | public function setPgPublicKey($pgPublicKey) 193 | { 194 | $this->pgPublicKey = $pgPublicKey; 195 | } 196 | 197 | /** 198 | * @return string 199 | * @since v1.3.1 200 | */ 201 | public function getCurrencyCode() 202 | { 203 | return $this->currencyCode; 204 | } 205 | 206 | /** 207 | * @return mixed 208 | * @since v1.3.1 209 | */ 210 | public function getTimeZone() 211 | { 212 | return $this->timeZone; 213 | } 214 | 215 | /** 216 | * @param mixed $timeZone 217 | * @since v1.3.1 218 | */ 219 | public function setTimeZone($timeZone) 220 | { 221 | $this->timeZone = $timeZone; 222 | } 223 | 224 | } 225 | -------------------------------------------------------------------------------- /src/Base.php: -------------------------------------------------------------------------------- 1 | checkParams($config, $params); 75 | $this->keyObject = new Key($config); 76 | $this->amount = $params['amount']; 77 | $this->invoice = $params['invoice']; 78 | $this->merchantID = $this->keyObject->getAppMerchantID(); 79 | $this->merchantCallback = $params['merchantCallback']; 80 | $this->setTimeZone($this->keyObject->getTimeZone()); 81 | date_default_timezone_set($this->timezone); 82 | 83 | /** 84 | * Before activating production environment be confirm that your system is ok and out of bug 85 | * it is highly recommended to Test your environment using development environment 86 | * your ip,domain and callback_url should be whitelisted in Nagad end 87 | */ 88 | if ($this->keyObject->getAppEnv() == 'production') { 89 | $this->base_url = 'https://api.mynagad.com/api/dfs/'; 90 | $this->environment = $this->keyObject->getAppEnv(); 91 | } 92 | 93 | } 94 | 95 | /** 96 | * Final Send Request to Nagad 97 | * @param Base $base 98 | * @return array 99 | * @throws Exception 100 | * @since v1.6.0 101 | */ 102 | public function payNow(Base $base) 103 | { 104 | return (new RequestHandler($base))->sendRequest(); 105 | } 106 | 107 | /** 108 | * Final Send Request to Nagad and Get Redirection Url 109 | * @param Base $base 110 | * @return string 111 | * @throws Exception 112 | * @since v1.6.0 113 | */ 114 | public function payNowWithoutRedirection(Base $base) 115 | { 116 | return (new RequestHandler($base))->sendRequest(false); 117 | } 118 | 119 | /** 120 | * @return string 121 | * @since v1.3.1 122 | */ 123 | public function getTimezone(): string 124 | { 125 | return $this->timezone; 126 | } 127 | 128 | /** 129 | * @param $timeZone 130 | * @since v1.3.1 131 | */ 132 | public function setTimeZone($timeZone) 133 | { 134 | if (!empty($timeZone)) { 135 | $this->timezone = $timeZone; 136 | } else { 137 | $this->timezone = 'Asia/Dhaka'; 138 | } 139 | 140 | } 141 | 142 | /** 143 | * @return mixed 144 | * @since v1.3.1 145 | */ 146 | public function getAmount() 147 | { 148 | return $this->amount; 149 | } 150 | 151 | /** 152 | * @return mixed 153 | * @since v1.3.1 154 | */ 155 | public function getInvoice() 156 | { 157 | return $this->invoice; 158 | } 159 | 160 | /** 161 | * @return mixed 162 | * @since v1.3.1 163 | */ 164 | public function getMerchantID() 165 | { 166 | return $this->merchantID; 167 | } 168 | 169 | /** 170 | * @return string 171 | * @since v1.3.1 172 | */ 173 | public function getBaseUrl(): string 174 | { 175 | return $this->base_url; 176 | } 177 | 178 | /** 179 | * @throws NagadPaymentException 180 | */ 181 | private function checkParams($config, $params) 182 | { 183 | if (!is_array($config)) { 184 | throw new NagadPaymentException("Configuration should be array."); 185 | } 186 | 187 | if (!is_array($params)) { 188 | throw new NagadPaymentException("Params should be array."); 189 | } 190 | 191 | if (!array_key_exists('amount', $params)) { 192 | throw new NagadPaymentException("Array key amount missing. Check configuration array format from github repository's readme.md file"); 193 | } 194 | if (!array_key_exists('invoice', $params)) { 195 | throw new NagadPaymentException("Array key invoice missing. Check configuration array format from github repository's readme.md file"); 196 | } 197 | if (!array_key_exists('merchantCallback', $params)) { 198 | throw new NagadPaymentException("Array key merchantCallback missing. Check configuration array format from github repository's readme.md file"); 199 | } 200 | } 201 | 202 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

Nagad api php xenon nagad api

2 | 3 | # Xenon/NagadApi 4 | 5 | 6 | ## Features 7 | 8 | - Easy Installation 9 | - Easy Payment Processing 10 | - Composer based installation 11 | - Verify Payment 12 | - Demo Invoice Code Generate 13 | 14 | # Install Using Composer 15 | 16 | ```bash 17 | composer require xenon/nagad-api 18 | ``` 19 | 20 | 21 | 22 | # Example Code 23 | ```php 24 | 'development', // development|production 40 | 'NAGAD_APP_LOG' => '1', 41 | 'NAGAD_APP_MERCHANTID' => '6800000025', //demo 42 | 'NAGAD_APP_MERCHANT_PRIVATE_KEY' => 'MIIEvFAAxN1qfKiRiCL720FtQfIwPDp9ZqbG2OQbdyZUB8I08irKJ0x/psM4SjXasglHBK5G1DX7BmwcB/PRbC0cHYy3pXDmLI8pZl1NehLzbav0Y4fP4MdnpQnfzZJdpaGVE0oI15l', 43 | 'NAGAD_APP_MERCHANT_PG_PUBLIC_KEY' => 'MIIBIjANBc54jjMJoP2toR9fGmQV7y9fzj', 44 | 'NAGAD_APP_TIMEZONE' => 'Asia/Dhaka', 45 | ]; 46 | 47 | $nagad = new Base($config, [ 48 | 'amount' => 10, 49 | 'invoice' => Helper::generateFakeInvoice(15, true), 50 | 'merchantCallback' => 'https://example.com/payment/success/id=4', 51 | ]); 52 | ``` 53 | 54 | ## Method-1 **:** Use for website 55 | ``` 56 | $status = $nagad->payNow($nagad); //will redirect to payment page 57 | ``` 58 | 59 | ## Method-2 **:** Return Redirection url . You can use this according to need 60 | ``` 61 | $paymentUrl = $nagad->payNowWithoutRedirection($nagad); //will return payment url like below. You can use that url and do whatever u want to get payment from clients. 62 | ``` 63 | 64 | 65 | ``` 66 | http://sandbox.mynagad.com:10060/check-out/MDYyODAwNTcyNTYxNi42ODMwMDIwMDcxMDQyMjUuOU5PTEFVNkVaWkdUWVRBLmJiZGMyNTE3MTVmZTNiNjIzN2Zk 67 | ``` 68 | 69 | ### After that use below method for extracting payment response that will return an array 70 | 71 | ``` 72 | $successUrl = 'https://example.com/payment/success/id=4/?merchant=683XXXX225&order_id=CKH060JXXXXXFRA2&payment_ref_id=MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=&status=Success&status_code=00_0000_000&message=Successful%20Transaction&payment_dt=20211123235008&issuer_payment_ref=MTEyMzIzNDg1NzUwOS42ODMwMDIwMDcxMDQyMjUuQ0tIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk='; 73 | $response = Helper::successResponse("$successUrl"); 74 | 75 | Array 76 | ( 77 | [merchant] => 683XXXX225 78 | [order_id] => CKH060JXXXXXFRA2 79 | [payment_ref_id] => MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk= 80 | [status] => Success 81 | [status_code] => 00_0000_000 82 | [message] => Successful Transaction 83 | [payment_dt] => 20211123235008 84 | [issuer_payment_ref] => MTEyMzIzNDg1NzUwOXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk= 85 | ) 86 | ``` 87 | ### For payment verification use below method. You will then get below json as response. 88 | ``` 89 | $helper = new Helper($config); 90 | $response = $helper->verifyPayment($response['payment_ref_id']); 91 | ``` 92 | 93 | ## Payment Verification Response 94 | ``` 95 | { 96 | merchantId: "683XXXX225", 97 | orderId: "CKH060JXXXXXFRA2", 98 | paymentRefId: "MXXXXXXXXtIMDYwSjFRSlBRMUZSQTIuMTg0NTE2Yzc3ZmEzNmEwZTJlZjk=", 99 | amount: "16", 100 | clientMobileNo: "016****5428", 101 | merchantMobileNo: "01XXXXXXX10", 102 | orderDateTime: "2021-11-23 23:48:22.0", 103 | issuerPaymentDateTime: "2021-11-23 23:50:08.0", 104 | issuerPaymentRefNo: "000XXXW", 105 | additionalMerchantInfo: null, 106 | status: "Success", 107 | statusCode: "000", 108 | cancelIssuerDateTime: null, 109 | cancelIssuerRefNo: null 110 | } 111 | ``` 112 | ## Maintainer 113 | 116 | 117 | 118 | ### Contributors 119 | 122 | 123 | 124 | 125 | # Important Information: 126 | 127 | ### Sandbox Environment 128 | 1. Need sandbox details for sandbox testing. Check your email that you have got from nagad authority 129 | 2. Use sandbox details such as pgpublickey, privatekey, merchant-id for sandbox testing 130 | 3. You need to register a mobile number for sandbox testing. Contact with your account manager for doing this 131 | 4. You should test environment before going to live 132 | 133 | 134 | ### Live Environment 135 | 1. Need production details for production final. You will get through email 136 | 2. Your server ip/domain and callback url should be whitelisted before running in production. You can contact with nagad team using mail or other system 137 | 138 | Login to your **Nagad Merchant Panel** 139 | 140 | ` https://auth.mynagad.com:10900/authentication-service-provider-1.0/login 141 | ` 142 | 143 | **Step 1:** 144 | **_In the Merchant Portal, Go to Merchant Integration Details under Merchant Management Menu. 145 | You will get the Merchant ID which is your Merchant ID for Integration._** 146 | 147 | Then, Click on “Key Generate” and 148 | Download the Merchant Private Key and Merchant Public Key. 149 | 150 | **Step 2:** 151 | _**_Go to Merchant Integration under Merchant Management Menu. 152 | Put your Call Back URL and Upload the Merchant Public Key which you have downloaded in Step 1. Add and Submit!**__ 153 | 154 | **Step 3:** 155 | _**_Usage Production Details . 156 | You have to use public key and private key that you have downloaded!**__ 157 | 158 | 159 | 3. If you have any question/query then email me **arif98741@gmail.com** 160 | 4. Do Code, Be Crazy 161 |
162 | ### If you find any kind of issue or bug you are highly encouraged to report. For reporting use [issues option](https://github.com/arif98741/nagadApi/issues) 163 | For can also add pull request. For pull request you should use **dev** branch. Because our **master** branch is serving at this moment for usage around community. We dont want to messup 164 | 165 | 166 | ## License 167 | 168 | [MIT](https://choosealicense.com/licenses/mit/) 169 | 170 | -------------------------------------------------------------------------------- /src/RequestHandler.php: -------------------------------------------------------------------------------- 1 | base = $base; 56 | $this->helper = new Helper($this->base->keyObject); 57 | } 58 | 59 | /** 60 | * Fire request to nagad api 61 | * @return mixed 62 | * @throws Exception 63 | * @since v1.6.0 64 | */ 65 | public function sendRequest(bool $redirection = true) 66 | { 67 | $postUrl = $this->base->getBaseUrl() . $this->apiUrl 68 | . $this->base->getMerchantID() . 69 | "/" . $this->base->getInvoice(); 70 | 71 | $sensitiveData = array( 72 | 'merchantId' => $this->base->keyObject->getAppMerchantID(), 73 | 'datetime' => Date('YmdHis'), 74 | 'orderId' => $this->base->getInvoice(), 75 | 'challenge' => Helper::generateRandomString(40, 'you', 'me') 76 | ); 77 | 78 | 79 | try { 80 | $publicSignature = $this->helper->encryptDataWithPublicKey(json_encode($sensitiveData)); 81 | } catch (Exception $e) { 82 | 83 | throw new ExceptionHandler($e->getMessage()); 84 | 85 | } 86 | 87 | try { 88 | $signature = $this->helper->signatureGenerate(json_encode($sensitiveData)); 89 | } catch (Exception $e) { 90 | throw new ExceptionHandler($e->getMessage()); 91 | 92 | } 93 | 94 | $postData = array( 95 | 'accountNumber' => $this->base->keyObject->getAppAccount(), //optional 96 | 'dateTime' => Date('YmdHis'), 97 | 'sensitiveData' => $publicSignature, 98 | 'signature' => $signature 99 | ); 100 | 101 | $resultData = $this->helper->httpPostMethod($postUrl, $postData); 102 | 103 | if (!is_array($resultData)) { 104 | throw new ExceptionHandler("Failed to generate nagad payment url as it is returning null response from nagad api server. Please be confirm that you have whitelisted your server ip or fix other server ip related issue. Sometimes it happens if your hosting server is located outside Bangladesh. Contact with Nagad authority for assistance with your support ticket id"); 105 | } 106 | 107 | if (array_key_exists('error', $resultData)) { 108 | throw new ExceptionHandler($resultData['error']); 109 | } 110 | 111 | if (array_key_exists('reason', $resultData)) { 112 | 113 | throw new ExceptionHandler( $resultData['message']); 114 | } 115 | 116 | 117 | //check existence of sensitiveData and signature 118 | if (array_key_exists('sensitiveData', $resultData) && array_key_exists('signature', $resultData)) { 119 | 120 | if (!empty($resultData['sensitiveData']) && !empty($resultData['signature'])) { 121 | $plainResponse = json_decode($this->helper->decryptDataWithPrivateKey($resultData['sensitiveData']), true); 122 | if (isset($plainResponse['paymentReferenceId'], $plainResponse['challenge'])) { 123 | 124 | $paymentReferenceId = $plainResponse['paymentReferenceId']; 125 | $challenge = $plainResponse['challenge']; 126 | 127 | $sensitiveDataOrder = array( 128 | 'merchantId' => $this->base->getMerchantID(), 129 | 'orderId' => $this->base->getInvoice(), 130 | 'currencyCode' => $this->base->keyObject->getCurrencyCode(), 131 | 'amount' => $this->base->getAmount(), 132 | 'challenge' => $challenge 133 | ); 134 | 135 | $postDataOrder = array( 136 | 'sensitiveData' => $this->helper->encryptDataWithPublicKey(json_encode($sensitiveDataOrder)), 137 | 'signature' => $this->helper->signatureGenerate(json_encode($sensitiveDataOrder)), 138 | 'merchantCallbackURL' => $this->base->merchantCallback, 139 | 140 | ); 141 | $OrderSubmitUrl = $this->base->getBaseUrl() . "check-out/complete/" 142 | . $paymentReferenceId; 143 | 144 | $resultDataOrder = $this->helper->httpPostMethod($OrderSubmitUrl, $postDataOrder); 145 | 146 | if (array_key_exists('status', $resultDataOrder)) { 147 | 148 | if ($resultDataOrder['status'] == "Success" && $redirection) { 149 | $url = json_encode($resultDataOrder['callBackUrl']); 150 | echo ""; 151 | exit; 152 | } 153 | 154 | if ($resultDataOrder['status'] == "Success" && !$redirection) { 155 | 156 | return $resultDataOrder['callBackUrl']; 157 | } 158 | 159 | echo json_encode($resultDataOrder); 160 | 161 | } else { 162 | return $resultDataOrder; 163 | } 164 | 165 | } 166 | } 167 | } else { 168 | $this->showResponse($resultData['message'], [], []); 169 | } 170 | } 171 | 172 | /** 173 | * @param $resultData 174 | * @param $sensitiveData 175 | * @param $postData 176 | * @return void 177 | * @since v1.8.4.4 178 | */ 179 | private function showResponse($resultData, $sensitiveData, $postData) 180 | { 181 | $this->response = [ 182 | 'status' => 'error', 183 | 'response' => $resultData, 184 | 'request' => [ 185 | 'environment' => $this->base->environment, 186 | 'time' => [ 187 | 'request time' => Carbon::now(), 188 | 'timezone' => $this->base->getTimezone() 189 | ], 190 | 'url' => [ 191 | 'base_url' => $this->base->getBaseUrl(), 192 | 'api_url' => $this->apiUrl, 193 | 'request_url' => $this->base->getBaseUrl() . $this->apiUrl, 194 | ], 195 | 'data' => [ 196 | 'sensitiveData' => $sensitiveData, 197 | 'postData' => $postData 198 | ], 199 | 200 | ], 201 | 'server' => Helper::serverDetails() 202 | ]; 203 | } 204 | 205 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## [v1.9.4.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.4.0) - 2025-01-29 04:30:42+00:00 4 | 5 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.3.0...v1.9.4.0 6 | 7 | ## [v1.9.3.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.3.0) - 2025-01-29 04:27:41 8 | 9 | ## What's Changed 10 | * PHP Version Pipeline Check by @arif98741 in https://github.com/arif98741/nagadApi/pull/9 11 | * Merge Dev to Master by @arif98741 in https://github.com/arif98741/nagadApi/pull/10 12 | 13 | 14 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.4...v1.9.3.0 15 | 16 | ## [v1.9.2.4](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.4) - 2024-12-15 05:46:05 17 | 18 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.3...v1.9.2.4 19 | 20 | ## [v1.9.2.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.3) - 2023-06-07 17:35:22 21 | 22 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.2.2...v1.9.2.3 23 | 24 | ## [v1.9.2.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.2) - 2023-04-07 18:06:41 25 | 26 | *No description* 27 | 28 | ## [v1.9.2.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.1) - 2023-04-07 18:04:36 29 | 30 | ## [v1.9.2.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.2.0) - 2023-01-08 07:35:21 31 | 32 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.9...v1.9.2.0 33 | 34 | ## [v1.9.1.9](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.9) - 2023-01-08 07:04:36 35 | 36 | Keywords added, added more specified response message 37 | 38 | ## [v1.9.1.8](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.8) - 2022-12-20 07:16:47 39 | 40 | fix conflicts 41 | 42 | ### Bug Fixes 43 | 44 | - general: 45 | - fix conflicts ([e764eff](https://github.com/arif98741/nagadApi/commit/e764eff970af61d791d81c830b7abd073d06a10a)) ([#5](https://github.com/arif98741/nagadApi/pull/5)) 46 | 47 | ## [v1.9.1.7](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.7) - 2022-11-08 07:16:11 48 | 49 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.6...v1.9.1.7 50 | 51 | ## [v1.9.1.6](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.6) - 2022-08-24 12:17:00 52 | 53 | *No description* 54 | 55 | ## [v1.9.1.4](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.4) - 2022-08-16 18:30:02 56 | 57 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.1.2...v1.9.1.4 58 | 59 | ## [v1.9.1.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.3) - 2022-07-04 06:18:43 60 | 61 | *No description* 62 | 63 | ## [v1.9.1.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.2) - 2022-07-03 18:39:52 64 | 65 | *No description* 66 | 67 | ## [v1.9.1.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.1) - 2022-06-27 19:10:49 68 | 69 | *No description* 70 | 71 | ### Bug Fixes 72 | 73 | - general: 74 | - fix ([a61e64d](https://github.com/arif98741/nagadApi/commit/a61e64d4262fd26c0a5fb04cedba965a4e54e3a3)) 75 | 76 | ## [v1.9.1.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.1.0) - 2022-06-27 19:06:30 77 | 78 | 1. Added new method 79 | 2. Fix php unit dependency 80 | 3. Add php 8 support 81 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.9.0.3...v1.9.1.0 82 | 83 | ## [v1.9.0.3](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.3) - 2021-11-23 18:32:52 84 | 85 | *No description* 86 | 87 | ## [v1.9.0.2](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.2) - 2021-11-08 04:57:34 88 | 89 | *No description* 90 | 91 | ## [v1.9.0.1](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.1) - 2021-11-07 16:31:46 92 | 93 | *No description* 94 | 95 | ### Bug Fixes 96 | 97 | - general: 98 | - fix class not found issue ([30a3a79](https://github.com/arif98741/nagadApi/commit/30a3a792caf9099e95cd0b35c4bfef8928f278d9)) 99 | 100 | ## [v1.9.0.0](https://github.com/arif98741/nagadApi/releases/tag/v1.9.0.0) - 2021-10-24 04:45:13 101 | 102 | *No description* 103 | 104 | ## [v1.8.4.8](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.8) - 2021-10-23 12:04:16 105 | 106 | 1. Add Exception Handler 107 | 2. Added PHP 8.* support 108 | 3. Optimized Code 109 | 4. Changed some comments 110 | 111 | **Full Changelog**: https://github.com/arif98741/nagadApi/compare/v1.8.3...v1.8.4.8 112 | 113 | ## [v1.8.4.6](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.6) - 2021-10-23 10:23:41 114 | 115 | *No description* 116 | 117 | ## [v1.8.4.5](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.5) - 2021-05-02 21:17:35 118 | 119 | *No description* 120 | 121 | ## [v1.8.4.4](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.4) - 2021-05-02 20:58:32 122 | 123 | *No description* 124 | 125 | ## [v1.8.4.3](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.3) - 2021-03-08 20:24:03 126 | 127 | *No description* 128 | 129 | ### Bug Fixes 130 | 131 | - general: 132 | - fix conflicts ([8bd1b3e](https://github.com/arif98741/nagadApi/commit/8bd1b3ea515d8d56e8db7000a0769258a7b5245d)) 133 | - fix error code ([b523678](https://github.com/arif98741/nagadApi/commit/b523678aa34fc8101c8c63b2b0171acb578896b1)) 134 | 135 | ## [v1.8.4.2](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.2) - 2021-03-08 20:00:32 136 | 137 | fix error message and exception 138 | 139 | ## [v1.8.4.1](https://github.com/arif98741/nagadApi/releases/tag/v1.8.4.1) - 2021-03-08 19:07:38 140 | 141 | *No description* 142 | 143 | ## [v1.8.3](https://github.com/arif98741/nagadApi/releases/tag/v1.8.3) - 2021-03-07 08:30:20 144 | 145 | *No description* 146 | 147 | ## [v1.8.2](https://github.com/arif98741/nagadApi/releases/tag/v1.8.2) - 2021-03-07 07:35:15 148 | 149 | fix minor error 150 | remove debug error 151 | reduce code structure 152 | added exceptionhandler 153 | 154 | ## [v1.8.0](https://github.com/arif98741/nagadApi/releases/tag/v1.8.0) - 2021-03-07 07:29:26 155 | 156 | *No description* 157 | 158 | ## [v1.6.7](https://github.com/arif98741/nagadApi/releases/tag/v1.6.7) - 2020-11-28 19:01:00 159 | 160 | *No description* 161 | 162 | ## [v1.6.6](https://github.com/arif98741/nagadApi/releases/tag/v1.6.6) - 2020-11-12 04:41:42 163 | 164 | *No description* 165 | 166 | ## [v1.6.5](https://github.com/arif98741/nagadApi/releases/tag/v1.6.5) - 2020-11-11 19:23:50 167 | 168 | *No description* 169 | 170 | ## [v1.6.4](https://github.com/arif98741/nagadApi/releases/tag/v1.6.4) - 2020-11-11 17:50:45 171 | 172 | *No description* 173 | 174 | ## [v1.6.3](https://github.com/arif98741/nagadApi/releases/tag/v1.6.3) - 2020-11-11 09:18:53 175 | 176 | *No description* 177 | 178 | ## [v1.6.0](https://github.com/arif98741/nagadApi/releases/tag/v1.6.0) - 2020-11-11 07:47:27 179 | 180 | *No description* 181 | 182 | ## [v1.5.9](https://github.com/arif98741/nagadApi/releases/tag/v1.5.9) - 2020-11-11 01:52:56 183 | 184 | This is final version and latest release 185 | 186 | ### Bug Fixes 187 | 188 | - general: 189 | - fix conflicts ([7c5ded4](https://github.com/arif98741/nagadApi/commit/7c5ded44a46f7d40a1825c57971dd5c1b2a3a945)) 190 | 191 | ## [v1.5.2](https://github.com/arif98741/nagadApi/releases/tag/v1.5.2) - 2020-11-11 00:55:44 192 | 193 | *No description* 194 | 195 | ## [v1.5.1](https://github.com/arif98741/nagadApi/releases/tag/v1.5.1) - 2020-11-11 00:47:41 196 | 197 | v1.5.1 198 | 199 | ## [v1.5.0](https://github.com/arif98741/nagadApi/releases/tag/v1.5.0) - 2020-11-11 00:44:50 200 | 201 | *No description* 202 | 203 | ## [v0.1.5_alpha](https://github.com/arif98741/nagadApi/releases/tag/v0.1.5_alpha) - 2020-11-11 00:34:28 204 | 205 | *No description* 206 | 207 | ### Bug Fixes 208 | 209 | - general: 210 | - fix error and modified for publish ([ed9d5ff](https://github.com/arif98741/nagadApi/commit/ed9d5ffb5134a8d4fc66d936fc54f711086b01f9)) 211 | 212 | ## [v0.0.1_alpha](https://github.com/arif98741/nagadApi/releases/tag/v0.0.1_alpha) - 2020-10-02 21:30:29 213 | 214 | Pre release of alpha. More testing should be added and live url should also tested. 215 | 216 | \* *This CHANGELOG was automatically generated by [auto-generate-changelog](https://github.com/BobAnkh/auto-generate-changelog)* 217 | -------------------------------------------------------------------------------- /src/Helper.php: -------------------------------------------------------------------------------- 1 | getPgPublicKey() . "\n-----END PUBLIC KEY-----"; 72 | $keyResource = openssl_get_publickey($publicKey); 73 | $status = openssl_public_encrypt($data, $cryptoText, $keyResource); 74 | if ($status) { 75 | return base64_encode($cryptoText); 76 | } 77 | 78 | throw new ExceptionHandler('Invalid Public key. Check Public Key in Configuration'); 79 | } 80 | 81 | /** 82 | * Generate Signature 83 | * @param $data 84 | * @return string 85 | * @throws ExceptionHandler 86 | * @since v1.3.1 87 | */ 88 | public function signatureGenerate($data): string 89 | { 90 | $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->getMerchantPrivateKey() . "\n-----END RSA PRIVATE KEY-----"; 91 | $status = openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256); 92 | if ($status) { 93 | 94 | return base64_encode($signature); 95 | } 96 | 97 | throw new ExceptionHandler('Invalid private key. Check Private Key in Configuration'); 98 | } 99 | 100 | /** 101 | * @param string $postUrl 102 | * @param array $postData 103 | * @return array|mixed 104 | * @since v1.3.1 105 | */ 106 | public function httpPostMethod(string $postUrl, array $postData) 107 | { 108 | $url = curl_init($postUrl); 109 | $postToken = json_encode($postData); 110 | $header = array( 111 | 'Content-Type:application/json', 112 | 'X-KM-Api-Version:v-0.2.0', 113 | 'X-KM-IP-V4:' . $this->getClientIP(), 114 | 'X-KM-Client-Type:PC_WEB' 115 | ); 116 | 117 | curl_setopt($url, CURLOPT_HTTPHEADER, $header); 118 | curl_setopt($url, CURLOPT_CUSTOMREQUEST, "POST"); 119 | curl_setopt($url, CURLOPT_RETURNTRANSFER, true); 120 | curl_setopt($url, CURLOPT_POSTFIELDS, $postToken); 121 | curl_setopt($url, CURLOPT_FOLLOWLOCATION, 1); 122 | curl_setopt($url, CURLOPT_SSL_VERIFYHOST, 0); 123 | curl_setopt($url, CURLOPT_SSL_VERIFYPEER, 0); 124 | $resultData = curl_exec($url); 125 | $curl_error = curl_error($url); 126 | 127 | if (!empty($curl_error)) { 128 | return [ 129 | 'error' => $curl_error 130 | ]; 131 | } 132 | 133 | $response = json_decode($resultData, true); 134 | curl_close($url); 135 | return $response; 136 | } 137 | 138 | 139 | /** 140 | * Http Get Method 141 | * @param $url 142 | * @return bool|string 143 | * @throws Exception 144 | */ 145 | public static function httpGet($url) 146 | { 147 | $ch = curl_init(); 148 | $timeout = 10; 149 | curl_setopt($ch, CURLOPT_URL, $url); 150 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 151 | curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 152 | curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/0 (Windows; U; Windows NT 0; zh-CN; rv:3)"); 153 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 154 | curl_setopt($ch, CURLOPT_HEADER, 0); 155 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 156 | 157 | $response = curl_exec($ch); 158 | if (curl_errno($ch)) { 159 | $error_msg = curl_error($ch); 160 | throw new NagadPaymentException($error_msg); 161 | } 162 | 163 | curl_close($ch); 164 | return $response; 165 | } 166 | 167 | /** 168 | * Get Client IP | Example : Public IP: 121.23.48.96. 185.96.85.256 169 | * (above ips are for just example) 170 | * @return mixed|string 171 | * @since v1.3.1 172 | */ 173 | public function getClientIP() 174 | { 175 | if (isset($_SERVER['HTTP_CLIENT_IP'])) { 176 | $ipaddress = $_SERVER['HTTP_CLIENT_IP']; 177 | } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 178 | $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; 179 | } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) { 180 | $ipaddress = $_SERVER['HTTP_X_FORWARDED']; 181 | } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) { 182 | $ipaddress = $_SERVER['HTTP_FORWARDED_FOR']; 183 | } elseif (isset($_SERVER['HTTP_FORWARDED'])) { 184 | $ipaddress = $_SERVER['HTTP_FORWARDED']; 185 | } elseif (isset($_SERVER['REMOTE_ADDR'])) { 186 | $ipaddress = $_SERVER['REMOTE_ADDR']; 187 | } else { 188 | $ipaddress = 'UNKNOWN IP'; 189 | } 190 | return $ipaddress; 191 | } 192 | 193 | /** 194 | * @param $cryptoText 195 | * @return string 196 | * @since v1.3.1 197 | */ 198 | public function decryptDataWithPrivateKey($cryptoText) 199 | { 200 | $private_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->getMerchantPrivateKey() . "\n-----END RSA PRIVATE KEY-----"; 201 | openssl_private_decrypt(base64_decode($cryptoText), $plain_text, $private_key); 202 | return $plain_text; 203 | } 204 | 205 | 206 | /** 207 | * Generate Random Invoice For Testing Purpose 208 | * You Can also use it for making production 209 | * @param int $length 210 | * @param bool $capitalize 211 | * @param string $prefix 212 | * @param string $suffix 213 | * @return string 214 | * @since v1.3.1 215 | */ 216 | public static function generateFakeInvoice(int $length = 20, bool $capitalize = false, string $prefix = '', string $suffix = ''): string 217 | { 218 | $invoice = $prefix . self::generateRandomString($length) . $suffix; 219 | if ($capitalize === true) { 220 | $invoice = strtoupper($invoice); 221 | } 222 | return $invoice; 223 | } 224 | 225 | /** 226 | * @param $data 227 | * @since v1.3.1 228 | */ 229 | public static function errorLog($data) 230 | { 231 | if (!file_exists('logs/nagadApi') && !mkdir('logs', 0775) && !is_dir('logs')) { 232 | throw new RuntimeException(sprintf('Directory "%s" was not created', 'logs')); 233 | } 234 | 235 | $errorLogFile = 'logs/nagadApi/error.log'; 236 | if (!file_exists($errorLogFile)) { 237 | 238 | $logFile = "logs/error.log"; 239 | $fh = fopen($logFile, 'w+') or die("can't open file"); 240 | fclose($fh); 241 | chmod($logFile, 0755); 242 | } 243 | $date = '=====================' . date('Y-m-d H:i:s') . '=============================================\n'; 244 | file_put_contents($errorLogFile, print_r($date, true), FILE_APPEND); 245 | file_put_contents($errorLogFile, PHP_EOL . print_r($data, true), FILE_APPEND); 246 | $string = '=====================' . date('Y-m-d H:i:s') . '=============================================' . PHP_EOL; 247 | file_put_contents($errorLogFile, print_r($string, true), FILE_APPEND); 248 | } 249 | 250 | /** 251 | * Generate Server Details And Return Response 252 | * @return array 253 | * @since v1.3.1 254 | */ 255 | public static function serverDetails(): array 256 | { 257 | return [ 258 | 'base' => $_SERVER['SERVER_ADDR'], 259 | 'ip' => $_SERVER['REMOTE_ADDR'], 260 | 'port' => $_SERVER['REMOTE_PORT'], 261 | 'request_url' => $_SERVER['REQUEST_URI'], 262 | 'user agent' => $_SERVER['HTTP_USER_AGENT'], 263 | ]; 264 | } 265 | 266 | /** 267 | * This is for formatting and getting returning response data from url; 268 | * @param $response 269 | * @return array 270 | * @since v1.3.1 271 | */ 272 | public static function successResponse($response) 273 | { 274 | // $response = 'https://example.com/payment/success/id=4/?merchant=683002007104225&order_id=EBSXGJ5OYQCRO7D& 275 | //payment_ref_id=MTEyOTAwMjY1NDMxNi42ODMwMDIwMDcxMDQyMjUuRUJTWEdKNU9ZUUNSTzdELmExODVkYWE4MDAyMDEyM2ZlYzRl& 276 | //status=Success&status_code=00_0000_000&message=Successful%20Transaction&payment_dt=20201129002747& 277 | //issuer_payment_ref=MTEyOTAwMjY1NDMxNi42ODMwMDIwMDcxMDQyMjUuRUJTWEdKNU9ZUUNSTzdELmExODVkYWE4MDAyMDEyM2ZlYzRl'; 278 | $parts = parse_url($response); 279 | parse_str($parts['query'], $query); 280 | return $query; 281 | } 282 | 283 | /** 284 | * Verify Payment 285 | * @throws Exception 286 | */ 287 | public function verifyPayment($paymentRefId) 288 | { 289 | $this->base_url = 'http://sandbox.mynagad.com:10080/remote-payment-gateway-1.0/api/dfs/'; 290 | if ($this->getAppEnv() === 'production') { 291 | $this->base_url = 'https://api.mynagad.com/api/dfs/'; 292 | } 293 | 294 | $url = $this->base_url . 'verify/payment/' . $paymentRefId; 295 | 296 | return self::httpGet($url); 297 | } 298 | 299 | } -------------------------------------------------------------------------------- /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": "1f0aa48de123603f61fbce61a33b4e59", 8 | "packages": [ 9 | { 10 | "name": "nesbot/carbon", 11 | "version": "2.65.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/briannesbitt/Carbon.git", 15 | "reference": "09acf64155c16dc6f580f36569ae89344e9734a3" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3", 20 | "reference": "09acf64155c16dc6f580f36569ae89344e9734a3", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-json": "*", 25 | "php": "^7.1.8 || ^8.0", 26 | "symfony/polyfill-mbstring": "^1.0", 27 | "symfony/polyfill-php80": "^1.16", 28 | "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" 29 | }, 30 | "require-dev": { 31 | "doctrine/dbal": "^2.0 || ^3.1.4", 32 | "doctrine/orm": "^2.7", 33 | "friendsofphp/php-cs-fixer": "^3.0", 34 | "kylekatarnls/multi-tester": "^2.0", 35 | "ondrejmirtes/better-reflection": "*", 36 | "phpmd/phpmd": "^2.9", 37 | "phpstan/extension-installer": "^1.0", 38 | "phpstan/phpstan": "^0.12.99 || ^1.7.14", 39 | "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", 40 | "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", 41 | "squizlabs/php_codesniffer": "^3.4" 42 | }, 43 | "bin": [ 44 | "bin/carbon" 45 | ], 46 | "type": "library", 47 | "extra": { 48 | "branch-alias": { 49 | "dev-3.x": "3.x-dev", 50 | "dev-master": "2.x-dev" 51 | }, 52 | "laravel": { 53 | "providers": [ 54 | "Carbon\\Laravel\\ServiceProvider" 55 | ] 56 | }, 57 | "phpstan": { 58 | "includes": [ 59 | "extension.neon" 60 | ] 61 | } 62 | }, 63 | "autoload": { 64 | "psr-4": { 65 | "Carbon\\": "src/Carbon/" 66 | } 67 | }, 68 | "notification-url": "https://packagist.org/downloads/", 69 | "license": [ 70 | "MIT" 71 | ], 72 | "authors": [ 73 | { 74 | "name": "Brian Nesbitt", 75 | "email": "brian@nesbot.com", 76 | "homepage": "https://markido.com" 77 | }, 78 | { 79 | "name": "kylekatarnls", 80 | "homepage": "https://github.com/kylekatarnls" 81 | } 82 | ], 83 | "description": "An API extension for DateTime that supports 281 different languages.", 84 | "homepage": "https://carbon.nesbot.com", 85 | "keywords": [ 86 | "date", 87 | "datetime", 88 | "time" 89 | ], 90 | "support": { 91 | "docs": "https://carbon.nesbot.com/docs", 92 | "issues": "https://github.com/briannesbitt/Carbon/issues", 93 | "source": "https://github.com/briannesbitt/Carbon" 94 | }, 95 | "funding": [ 96 | { 97 | "url": "https://github.com/sponsors/kylekatarnls", 98 | "type": "github" 99 | }, 100 | { 101 | "url": "https://opencollective.com/Carbon#sponsor", 102 | "type": "opencollective" 103 | }, 104 | { 105 | "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", 106 | "type": "tidelift" 107 | } 108 | ], 109 | "time": "2023-01-06T15:55:01+00:00" 110 | }, 111 | { 112 | "name": "symfony/deprecation-contracts", 113 | "version": "v2.5.2", 114 | "source": { 115 | "type": "git", 116 | "url": "https://github.com/symfony/deprecation-contracts.git", 117 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" 118 | }, 119 | "dist": { 120 | "type": "zip", 121 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", 122 | "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", 123 | "shasum": "" 124 | }, 125 | "require": { 126 | "php": ">=7.1" 127 | }, 128 | "type": "library", 129 | "extra": { 130 | "branch-alias": { 131 | "dev-main": "2.5-dev" 132 | }, 133 | "thanks": { 134 | "name": "symfony/contracts", 135 | "url": "https://github.com/symfony/contracts" 136 | } 137 | }, 138 | "autoload": { 139 | "files": [ 140 | "function.php" 141 | ] 142 | }, 143 | "notification-url": "https://packagist.org/downloads/", 144 | "license": [ 145 | "MIT" 146 | ], 147 | "authors": [ 148 | { 149 | "name": "Nicolas Grekas", 150 | "email": "p@tchwork.com" 151 | }, 152 | { 153 | "name": "Symfony Community", 154 | "homepage": "https://symfony.com/contributors" 155 | } 156 | ], 157 | "description": "A generic function and convention to trigger deprecation notices", 158 | "homepage": "https://symfony.com", 159 | "support": { 160 | "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" 161 | }, 162 | "funding": [ 163 | { 164 | "url": "https://symfony.com/sponsor", 165 | "type": "custom" 166 | }, 167 | { 168 | "url": "https://github.com/fabpot", 169 | "type": "github" 170 | }, 171 | { 172 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 173 | "type": "tidelift" 174 | } 175 | ], 176 | "time": "2022-01-02T09:53:40+00:00" 177 | }, 178 | { 179 | "name": "symfony/polyfill-mbstring", 180 | "version": "v1.27.0", 181 | "source": { 182 | "type": "git", 183 | "url": "https://github.com/symfony/polyfill-mbstring.git", 184 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" 185 | }, 186 | "dist": { 187 | "type": "zip", 188 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 189 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 190 | "shasum": "" 191 | }, 192 | "require": { 193 | "php": ">=7.1" 194 | }, 195 | "provide": { 196 | "ext-mbstring": "*" 197 | }, 198 | "suggest": { 199 | "ext-mbstring": "For best performance" 200 | }, 201 | "type": "library", 202 | "extra": { 203 | "branch-alias": { 204 | "dev-main": "1.27-dev" 205 | }, 206 | "thanks": { 207 | "name": "symfony/polyfill", 208 | "url": "https://github.com/symfony/polyfill" 209 | } 210 | }, 211 | "autoload": { 212 | "files": [ 213 | "bootstrap.php" 214 | ], 215 | "psr-4": { 216 | "Symfony\\Polyfill\\Mbstring\\": "" 217 | } 218 | }, 219 | "notification-url": "https://packagist.org/downloads/", 220 | "license": [ 221 | "MIT" 222 | ], 223 | "authors": [ 224 | { 225 | "name": "Nicolas Grekas", 226 | "email": "p@tchwork.com" 227 | }, 228 | { 229 | "name": "Symfony Community", 230 | "homepage": "https://symfony.com/contributors" 231 | } 232 | ], 233 | "description": "Symfony polyfill for the Mbstring extension", 234 | "homepage": "https://symfony.com", 235 | "keywords": [ 236 | "compatibility", 237 | "mbstring", 238 | "polyfill", 239 | "portable", 240 | "shim" 241 | ], 242 | "support": { 243 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" 244 | }, 245 | "funding": [ 246 | { 247 | "url": "https://symfony.com/sponsor", 248 | "type": "custom" 249 | }, 250 | { 251 | "url": "https://github.com/fabpot", 252 | "type": "github" 253 | }, 254 | { 255 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 256 | "type": "tidelift" 257 | } 258 | ], 259 | "time": "2022-11-03T14:55:06+00:00" 260 | }, 261 | { 262 | "name": "symfony/polyfill-php80", 263 | "version": "v1.27.0", 264 | "source": { 265 | "type": "git", 266 | "url": "https://github.com/symfony/polyfill-php80.git", 267 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" 268 | }, 269 | "dist": { 270 | "type": "zip", 271 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", 272 | "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", 273 | "shasum": "" 274 | }, 275 | "require": { 276 | "php": ">=7.1" 277 | }, 278 | "type": "library", 279 | "extra": { 280 | "branch-alias": { 281 | "dev-main": "1.27-dev" 282 | }, 283 | "thanks": { 284 | "name": "symfony/polyfill", 285 | "url": "https://github.com/symfony/polyfill" 286 | } 287 | }, 288 | "autoload": { 289 | "files": [ 290 | "bootstrap.php" 291 | ], 292 | "psr-4": { 293 | "Symfony\\Polyfill\\Php80\\": "" 294 | }, 295 | "classmap": [ 296 | "Resources/stubs" 297 | ] 298 | }, 299 | "notification-url": "https://packagist.org/downloads/", 300 | "license": [ 301 | "MIT" 302 | ], 303 | "authors": [ 304 | { 305 | "name": "Ion Bazan", 306 | "email": "ion.bazan@gmail.com" 307 | }, 308 | { 309 | "name": "Nicolas Grekas", 310 | "email": "p@tchwork.com" 311 | }, 312 | { 313 | "name": "Symfony Community", 314 | "homepage": "https://symfony.com/contributors" 315 | } 316 | ], 317 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 318 | "homepage": "https://symfony.com", 319 | "keywords": [ 320 | "compatibility", 321 | "polyfill", 322 | "portable", 323 | "shim" 324 | ], 325 | "support": { 326 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" 327 | }, 328 | "funding": [ 329 | { 330 | "url": "https://symfony.com/sponsor", 331 | "type": "custom" 332 | }, 333 | { 334 | "url": "https://github.com/fabpot", 335 | "type": "github" 336 | }, 337 | { 338 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 339 | "type": "tidelift" 340 | } 341 | ], 342 | "time": "2022-11-03T14:55:06+00:00" 343 | }, 344 | { 345 | "name": "symfony/translation", 346 | "version": "v5.4.14", 347 | "source": { 348 | "type": "git", 349 | "url": "https://github.com/symfony/translation.git", 350 | "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab" 351 | }, 352 | "dist": { 353 | "type": "zip", 354 | "url": "https://api.github.com/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab", 355 | "reference": "f0ed07675863aa6e3939df8b1bc879450b585cab", 356 | "shasum": "" 357 | }, 358 | "require": { 359 | "php": ">=7.2.5", 360 | "symfony/deprecation-contracts": "^2.1|^3", 361 | "symfony/polyfill-mbstring": "~1.0", 362 | "symfony/polyfill-php80": "^1.16", 363 | "symfony/translation-contracts": "^2.3" 364 | }, 365 | "conflict": { 366 | "symfony/config": "<4.4", 367 | "symfony/console": "<5.3", 368 | "symfony/dependency-injection": "<5.0", 369 | "symfony/http-kernel": "<5.0", 370 | "symfony/twig-bundle": "<5.0", 371 | "symfony/yaml": "<4.4" 372 | }, 373 | "provide": { 374 | "symfony/translation-implementation": "2.3" 375 | }, 376 | "require-dev": { 377 | "psr/log": "^1|^2|^3", 378 | "symfony/config": "^4.4|^5.0|^6.0", 379 | "symfony/console": "^5.4|^6.0", 380 | "symfony/dependency-injection": "^5.0|^6.0", 381 | "symfony/finder": "^4.4|^5.0|^6.0", 382 | "symfony/http-client-contracts": "^1.1|^2.0|^3.0", 383 | "symfony/http-kernel": "^5.0|^6.0", 384 | "symfony/intl": "^4.4|^5.0|^6.0", 385 | "symfony/polyfill-intl-icu": "^1.21", 386 | "symfony/service-contracts": "^1.1.2|^2|^3", 387 | "symfony/yaml": "^4.4|^5.0|^6.0" 388 | }, 389 | "suggest": { 390 | "psr/log-implementation": "To use logging capability in translator", 391 | "symfony/config": "", 392 | "symfony/yaml": "" 393 | }, 394 | "type": "library", 395 | "autoload": { 396 | "files": [ 397 | "Resources/functions.php" 398 | ], 399 | "psr-4": { 400 | "Symfony\\Component\\Translation\\": "" 401 | }, 402 | "exclude-from-classmap": [ 403 | "/Tests/" 404 | ] 405 | }, 406 | "notification-url": "https://packagist.org/downloads/", 407 | "license": [ 408 | "MIT" 409 | ], 410 | "authors": [ 411 | { 412 | "name": "Fabien Potencier", 413 | "email": "fabien@symfony.com" 414 | }, 415 | { 416 | "name": "Symfony Community", 417 | "homepage": "https://symfony.com/contributors" 418 | } 419 | ], 420 | "description": "Provides tools to internationalize your application", 421 | "homepage": "https://symfony.com", 422 | "support": { 423 | "source": "https://github.com/symfony/translation/tree/v5.4.14" 424 | }, 425 | "funding": [ 426 | { 427 | "url": "https://symfony.com/sponsor", 428 | "type": "custom" 429 | }, 430 | { 431 | "url": "https://github.com/fabpot", 432 | "type": "github" 433 | }, 434 | { 435 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 436 | "type": "tidelift" 437 | } 438 | ], 439 | "time": "2022-10-07T08:01:20+00:00" 440 | }, 441 | { 442 | "name": "symfony/translation-contracts", 443 | "version": "v2.5.2", 444 | "source": { 445 | "type": "git", 446 | "url": "https://github.com/symfony/translation-contracts.git", 447 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" 448 | }, 449 | "dist": { 450 | "type": "zip", 451 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", 452 | "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", 453 | "shasum": "" 454 | }, 455 | "require": { 456 | "php": ">=7.2.5" 457 | }, 458 | "suggest": { 459 | "symfony/translation-implementation": "" 460 | }, 461 | "type": "library", 462 | "extra": { 463 | "branch-alias": { 464 | "dev-main": "2.5-dev" 465 | }, 466 | "thanks": { 467 | "name": "symfony/contracts", 468 | "url": "https://github.com/symfony/contracts" 469 | } 470 | }, 471 | "autoload": { 472 | "psr-4": { 473 | "Symfony\\Contracts\\Translation\\": "" 474 | } 475 | }, 476 | "notification-url": "https://packagist.org/downloads/", 477 | "license": [ 478 | "MIT" 479 | ], 480 | "authors": [ 481 | { 482 | "name": "Nicolas Grekas", 483 | "email": "p@tchwork.com" 484 | }, 485 | { 486 | "name": "Symfony Community", 487 | "homepage": "https://symfony.com/contributors" 488 | } 489 | ], 490 | "description": "Generic abstractions related to translation", 491 | "homepage": "https://symfony.com", 492 | "keywords": [ 493 | "abstractions", 494 | "contracts", 495 | "decoupling", 496 | "interfaces", 497 | "interoperability", 498 | "standards" 499 | ], 500 | "support": { 501 | "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" 502 | }, 503 | "funding": [ 504 | { 505 | "url": "https://symfony.com/sponsor", 506 | "type": "custom" 507 | }, 508 | { 509 | "url": "https://github.com/fabpot", 510 | "type": "github" 511 | }, 512 | { 513 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 514 | "type": "tidelift" 515 | } 516 | ], 517 | "time": "2022-06-27T16:58:25+00:00" 518 | } 519 | ], 520 | "packages-dev": [ 521 | { 522 | "name": "doctrine/instantiator", 523 | "version": "1.5.0", 524 | "source": { 525 | "type": "git", 526 | "url": "https://github.com/doctrine/instantiator.git", 527 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 528 | }, 529 | "dist": { 530 | "type": "zip", 531 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 532 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 533 | "shasum": "" 534 | }, 535 | "require": { 536 | "php": "^7.1 || ^8.0" 537 | }, 538 | "require-dev": { 539 | "doctrine/coding-standard": "^9 || ^11", 540 | "ext-pdo": "*", 541 | "ext-phar": "*", 542 | "phpbench/phpbench": "^0.16 || ^1", 543 | "phpstan/phpstan": "^1.4", 544 | "phpstan/phpstan-phpunit": "^1", 545 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 546 | "vimeo/psalm": "^4.30 || ^5.4" 547 | }, 548 | "type": "library", 549 | "autoload": { 550 | "psr-4": { 551 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 552 | } 553 | }, 554 | "notification-url": "https://packagist.org/downloads/", 555 | "license": [ 556 | "MIT" 557 | ], 558 | "authors": [ 559 | { 560 | "name": "Marco Pivetta", 561 | "email": "ocramius@gmail.com", 562 | "homepage": "https://ocramius.github.io/" 563 | } 564 | ], 565 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 566 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 567 | "keywords": [ 568 | "constructor", 569 | "instantiate" 570 | ], 571 | "support": { 572 | "issues": "https://github.com/doctrine/instantiator/issues", 573 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 574 | }, 575 | "funding": [ 576 | { 577 | "url": "https://www.doctrine-project.org/sponsorship.html", 578 | "type": "custom" 579 | }, 580 | { 581 | "url": "https://www.patreon.com/phpdoctrine", 582 | "type": "patreon" 583 | }, 584 | { 585 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 586 | "type": "tidelift" 587 | } 588 | ], 589 | "time": "2022-12-30T00:15:36+00:00" 590 | }, 591 | { 592 | "name": "myclabs/deep-copy", 593 | "version": "1.11.0", 594 | "source": { 595 | "type": "git", 596 | "url": "https://github.com/myclabs/DeepCopy.git", 597 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" 598 | }, 599 | "dist": { 600 | "type": "zip", 601 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", 602 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", 603 | "shasum": "" 604 | }, 605 | "require": { 606 | "php": "^7.1 || ^8.0" 607 | }, 608 | "conflict": { 609 | "doctrine/collections": "<1.6.8", 610 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 611 | }, 612 | "require-dev": { 613 | "doctrine/collections": "^1.6.8", 614 | "doctrine/common": "^2.13.3 || ^3.2.2", 615 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 616 | }, 617 | "type": "library", 618 | "autoload": { 619 | "files": [ 620 | "src/DeepCopy/deep_copy.php" 621 | ], 622 | "psr-4": { 623 | "DeepCopy\\": "src/DeepCopy/" 624 | } 625 | }, 626 | "notification-url": "https://packagist.org/downloads/", 627 | "license": [ 628 | "MIT" 629 | ], 630 | "description": "Create deep copies (clones) of your objects", 631 | "keywords": [ 632 | "clone", 633 | "copy", 634 | "duplicate", 635 | "object", 636 | "object graph" 637 | ], 638 | "support": { 639 | "issues": "https://github.com/myclabs/DeepCopy/issues", 640 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" 641 | }, 642 | "funding": [ 643 | { 644 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 645 | "type": "tidelift" 646 | } 647 | ], 648 | "time": "2022-03-03T13:19:32+00:00" 649 | }, 650 | { 651 | "name": "nikic/php-parser", 652 | "version": "v4.15.2", 653 | "source": { 654 | "type": "git", 655 | "url": "https://github.com/nikic/PHP-Parser.git", 656 | "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" 657 | }, 658 | "dist": { 659 | "type": "zip", 660 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", 661 | "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", 662 | "shasum": "" 663 | }, 664 | "require": { 665 | "ext-tokenizer": "*", 666 | "php": ">=7.0" 667 | }, 668 | "require-dev": { 669 | "ircmaxell/php-yacc": "^0.0.7", 670 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 671 | }, 672 | "bin": [ 673 | "bin/php-parse" 674 | ], 675 | "type": "library", 676 | "extra": { 677 | "branch-alias": { 678 | "dev-master": "4.9-dev" 679 | } 680 | }, 681 | "autoload": { 682 | "psr-4": { 683 | "PhpParser\\": "lib/PhpParser" 684 | } 685 | }, 686 | "notification-url": "https://packagist.org/downloads/", 687 | "license": [ 688 | "BSD-3-Clause" 689 | ], 690 | "authors": [ 691 | { 692 | "name": "Nikita Popov" 693 | } 694 | ], 695 | "description": "A PHP parser written in PHP", 696 | "keywords": [ 697 | "parser", 698 | "php" 699 | ], 700 | "support": { 701 | "issues": "https://github.com/nikic/PHP-Parser/issues", 702 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" 703 | }, 704 | "time": "2022-11-12T15:38:23+00:00" 705 | }, 706 | { 707 | "name": "phar-io/manifest", 708 | "version": "2.0.3", 709 | "source": { 710 | "type": "git", 711 | "url": "https://github.com/phar-io/manifest.git", 712 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 713 | }, 714 | "dist": { 715 | "type": "zip", 716 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 717 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 718 | "shasum": "" 719 | }, 720 | "require": { 721 | "ext-dom": "*", 722 | "ext-phar": "*", 723 | "ext-xmlwriter": "*", 724 | "phar-io/version": "^3.0.1", 725 | "php": "^7.2 || ^8.0" 726 | }, 727 | "type": "library", 728 | "extra": { 729 | "branch-alias": { 730 | "dev-master": "2.0.x-dev" 731 | } 732 | }, 733 | "autoload": { 734 | "classmap": [ 735 | "src/" 736 | ] 737 | }, 738 | "notification-url": "https://packagist.org/downloads/", 739 | "license": [ 740 | "BSD-3-Clause" 741 | ], 742 | "authors": [ 743 | { 744 | "name": "Arne Blankerts", 745 | "email": "arne@blankerts.de", 746 | "role": "Developer" 747 | }, 748 | { 749 | "name": "Sebastian Heuer", 750 | "email": "sebastian@phpeople.de", 751 | "role": "Developer" 752 | }, 753 | { 754 | "name": "Sebastian Bergmann", 755 | "email": "sebastian@phpunit.de", 756 | "role": "Developer" 757 | } 758 | ], 759 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 760 | "support": { 761 | "issues": "https://github.com/phar-io/manifest/issues", 762 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 763 | }, 764 | "time": "2021-07-20T11:28:43+00:00" 765 | }, 766 | { 767 | "name": "phar-io/version", 768 | "version": "3.2.1", 769 | "source": { 770 | "type": "git", 771 | "url": "https://github.com/phar-io/version.git", 772 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 773 | }, 774 | "dist": { 775 | "type": "zip", 776 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 777 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 778 | "shasum": "" 779 | }, 780 | "require": { 781 | "php": "^7.2 || ^8.0" 782 | }, 783 | "type": "library", 784 | "autoload": { 785 | "classmap": [ 786 | "src/" 787 | ] 788 | }, 789 | "notification-url": "https://packagist.org/downloads/", 790 | "license": [ 791 | "BSD-3-Clause" 792 | ], 793 | "authors": [ 794 | { 795 | "name": "Arne Blankerts", 796 | "email": "arne@blankerts.de", 797 | "role": "Developer" 798 | }, 799 | { 800 | "name": "Sebastian Heuer", 801 | "email": "sebastian@phpeople.de", 802 | "role": "Developer" 803 | }, 804 | { 805 | "name": "Sebastian Bergmann", 806 | "email": "sebastian@phpunit.de", 807 | "role": "Developer" 808 | } 809 | ], 810 | "description": "Library for handling version information and constraints", 811 | "support": { 812 | "issues": "https://github.com/phar-io/version/issues", 813 | "source": "https://github.com/phar-io/version/tree/3.2.1" 814 | }, 815 | "time": "2022-02-21T01:04:05+00:00" 816 | }, 817 | { 818 | "name": "phpunit/php-code-coverage", 819 | "version": "9.2.23", 820 | "source": { 821 | "type": "git", 822 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 823 | "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c" 824 | }, 825 | "dist": { 826 | "type": "zip", 827 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", 828 | "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c", 829 | "shasum": "" 830 | }, 831 | "require": { 832 | "ext-dom": "*", 833 | "ext-libxml": "*", 834 | "ext-xmlwriter": "*", 835 | "nikic/php-parser": "^4.14", 836 | "php": ">=7.3", 837 | "phpunit/php-file-iterator": "^3.0.3", 838 | "phpunit/php-text-template": "^2.0.2", 839 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 840 | "sebastian/complexity": "^2.0", 841 | "sebastian/environment": "^5.1.2", 842 | "sebastian/lines-of-code": "^1.0.3", 843 | "sebastian/version": "^3.0.1", 844 | "theseer/tokenizer": "^1.2.0" 845 | }, 846 | "require-dev": { 847 | "phpunit/phpunit": "^9.3" 848 | }, 849 | "suggest": { 850 | "ext-pcov": "*", 851 | "ext-xdebug": "*" 852 | }, 853 | "type": "library", 854 | "extra": { 855 | "branch-alias": { 856 | "dev-master": "9.2-dev" 857 | } 858 | }, 859 | "autoload": { 860 | "classmap": [ 861 | "src/" 862 | ] 863 | }, 864 | "notification-url": "https://packagist.org/downloads/", 865 | "license": [ 866 | "BSD-3-Clause" 867 | ], 868 | "authors": [ 869 | { 870 | "name": "Sebastian Bergmann", 871 | "email": "sebastian@phpunit.de", 872 | "role": "lead" 873 | } 874 | ], 875 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 876 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 877 | "keywords": [ 878 | "coverage", 879 | "testing", 880 | "xunit" 881 | ], 882 | "support": { 883 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 884 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23" 885 | }, 886 | "funding": [ 887 | { 888 | "url": "https://github.com/sebastianbergmann", 889 | "type": "github" 890 | } 891 | ], 892 | "time": "2022-12-28T12:41:10+00:00" 893 | }, 894 | { 895 | "name": "phpunit/php-file-iterator", 896 | "version": "3.0.6", 897 | "source": { 898 | "type": "git", 899 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 900 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 901 | }, 902 | "dist": { 903 | "type": "zip", 904 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 905 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 906 | "shasum": "" 907 | }, 908 | "require": { 909 | "php": ">=7.3" 910 | }, 911 | "require-dev": { 912 | "phpunit/phpunit": "^9.3" 913 | }, 914 | "type": "library", 915 | "extra": { 916 | "branch-alias": { 917 | "dev-master": "3.0-dev" 918 | } 919 | }, 920 | "autoload": { 921 | "classmap": [ 922 | "src/" 923 | ] 924 | }, 925 | "notification-url": "https://packagist.org/downloads/", 926 | "license": [ 927 | "BSD-3-Clause" 928 | ], 929 | "authors": [ 930 | { 931 | "name": "Sebastian Bergmann", 932 | "email": "sebastian@phpunit.de", 933 | "role": "lead" 934 | } 935 | ], 936 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 937 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 938 | "keywords": [ 939 | "filesystem", 940 | "iterator" 941 | ], 942 | "support": { 943 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 944 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 945 | }, 946 | "funding": [ 947 | { 948 | "url": "https://github.com/sebastianbergmann", 949 | "type": "github" 950 | } 951 | ], 952 | "time": "2021-12-02T12:48:52+00:00" 953 | }, 954 | { 955 | "name": "phpunit/php-invoker", 956 | "version": "3.1.1", 957 | "source": { 958 | "type": "git", 959 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 960 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 961 | }, 962 | "dist": { 963 | "type": "zip", 964 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 965 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 966 | "shasum": "" 967 | }, 968 | "require": { 969 | "php": ">=7.3" 970 | }, 971 | "require-dev": { 972 | "ext-pcntl": "*", 973 | "phpunit/phpunit": "^9.3" 974 | }, 975 | "suggest": { 976 | "ext-pcntl": "*" 977 | }, 978 | "type": "library", 979 | "extra": { 980 | "branch-alias": { 981 | "dev-master": "3.1-dev" 982 | } 983 | }, 984 | "autoload": { 985 | "classmap": [ 986 | "src/" 987 | ] 988 | }, 989 | "notification-url": "https://packagist.org/downloads/", 990 | "license": [ 991 | "BSD-3-Clause" 992 | ], 993 | "authors": [ 994 | { 995 | "name": "Sebastian Bergmann", 996 | "email": "sebastian@phpunit.de", 997 | "role": "lead" 998 | } 999 | ], 1000 | "description": "Invoke callables with a timeout", 1001 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1002 | "keywords": [ 1003 | "process" 1004 | ], 1005 | "support": { 1006 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1007 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 1008 | }, 1009 | "funding": [ 1010 | { 1011 | "url": "https://github.com/sebastianbergmann", 1012 | "type": "github" 1013 | } 1014 | ], 1015 | "time": "2020-09-28T05:58:55+00:00" 1016 | }, 1017 | { 1018 | "name": "phpunit/php-text-template", 1019 | "version": "2.0.4", 1020 | "source": { 1021 | "type": "git", 1022 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1023 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 1024 | }, 1025 | "dist": { 1026 | "type": "zip", 1027 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1028 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1029 | "shasum": "" 1030 | }, 1031 | "require": { 1032 | "php": ">=7.3" 1033 | }, 1034 | "require-dev": { 1035 | "phpunit/phpunit": "^9.3" 1036 | }, 1037 | "type": "library", 1038 | "extra": { 1039 | "branch-alias": { 1040 | "dev-master": "2.0-dev" 1041 | } 1042 | }, 1043 | "autoload": { 1044 | "classmap": [ 1045 | "src/" 1046 | ] 1047 | }, 1048 | "notification-url": "https://packagist.org/downloads/", 1049 | "license": [ 1050 | "BSD-3-Clause" 1051 | ], 1052 | "authors": [ 1053 | { 1054 | "name": "Sebastian Bergmann", 1055 | "email": "sebastian@phpunit.de", 1056 | "role": "lead" 1057 | } 1058 | ], 1059 | "description": "Simple template engine.", 1060 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1061 | "keywords": [ 1062 | "template" 1063 | ], 1064 | "support": { 1065 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1066 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1067 | }, 1068 | "funding": [ 1069 | { 1070 | "url": "https://github.com/sebastianbergmann", 1071 | "type": "github" 1072 | } 1073 | ], 1074 | "time": "2020-10-26T05:33:50+00:00" 1075 | }, 1076 | { 1077 | "name": "phpunit/php-timer", 1078 | "version": "5.0.3", 1079 | "source": { 1080 | "type": "git", 1081 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1082 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 1083 | }, 1084 | "dist": { 1085 | "type": "zip", 1086 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1087 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1088 | "shasum": "" 1089 | }, 1090 | "require": { 1091 | "php": ">=7.3" 1092 | }, 1093 | "require-dev": { 1094 | "phpunit/phpunit": "^9.3" 1095 | }, 1096 | "type": "library", 1097 | "extra": { 1098 | "branch-alias": { 1099 | "dev-master": "5.0-dev" 1100 | } 1101 | }, 1102 | "autoload": { 1103 | "classmap": [ 1104 | "src/" 1105 | ] 1106 | }, 1107 | "notification-url": "https://packagist.org/downloads/", 1108 | "license": [ 1109 | "BSD-3-Clause" 1110 | ], 1111 | "authors": [ 1112 | { 1113 | "name": "Sebastian Bergmann", 1114 | "email": "sebastian@phpunit.de", 1115 | "role": "lead" 1116 | } 1117 | ], 1118 | "description": "Utility class for timing", 1119 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1120 | "keywords": [ 1121 | "timer" 1122 | ], 1123 | "support": { 1124 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1125 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1126 | }, 1127 | "funding": [ 1128 | { 1129 | "url": "https://github.com/sebastianbergmann", 1130 | "type": "github" 1131 | } 1132 | ], 1133 | "time": "2020-10-26T13:16:10+00:00" 1134 | }, 1135 | { 1136 | "name": "phpunit/phpunit", 1137 | "version": "9.5.27", 1138 | "source": { 1139 | "type": "git", 1140 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1141 | "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38" 1142 | }, 1143 | "dist": { 1144 | "type": "zip", 1145 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38", 1146 | "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38", 1147 | "shasum": "" 1148 | }, 1149 | "require": { 1150 | "doctrine/instantiator": "^1.3.1", 1151 | "ext-dom": "*", 1152 | "ext-json": "*", 1153 | "ext-libxml": "*", 1154 | "ext-mbstring": "*", 1155 | "ext-xml": "*", 1156 | "ext-xmlwriter": "*", 1157 | "myclabs/deep-copy": "^1.10.1", 1158 | "phar-io/manifest": "^2.0.3", 1159 | "phar-io/version": "^3.0.2", 1160 | "php": ">=7.3", 1161 | "phpunit/php-code-coverage": "^9.2.13", 1162 | "phpunit/php-file-iterator": "^3.0.5", 1163 | "phpunit/php-invoker": "^3.1.1", 1164 | "phpunit/php-text-template": "^2.0.3", 1165 | "phpunit/php-timer": "^5.0.2", 1166 | "sebastian/cli-parser": "^1.0.1", 1167 | "sebastian/code-unit": "^1.0.6", 1168 | "sebastian/comparator": "^4.0.8", 1169 | "sebastian/diff": "^4.0.3", 1170 | "sebastian/environment": "^5.1.3", 1171 | "sebastian/exporter": "^4.0.5", 1172 | "sebastian/global-state": "^5.0.1", 1173 | "sebastian/object-enumerator": "^4.0.3", 1174 | "sebastian/resource-operations": "^3.0.3", 1175 | "sebastian/type": "^3.2", 1176 | "sebastian/version": "^3.0.2" 1177 | }, 1178 | "suggest": { 1179 | "ext-soap": "*", 1180 | "ext-xdebug": "*" 1181 | }, 1182 | "bin": [ 1183 | "phpunit" 1184 | ], 1185 | "type": "library", 1186 | "extra": { 1187 | "branch-alias": { 1188 | "dev-master": "9.5-dev" 1189 | } 1190 | }, 1191 | "autoload": { 1192 | "files": [ 1193 | "src/Framework/Assert/Functions.php" 1194 | ], 1195 | "classmap": [ 1196 | "src/" 1197 | ] 1198 | }, 1199 | "notification-url": "https://packagist.org/downloads/", 1200 | "license": [ 1201 | "BSD-3-Clause" 1202 | ], 1203 | "authors": [ 1204 | { 1205 | "name": "Sebastian Bergmann", 1206 | "email": "sebastian@phpunit.de", 1207 | "role": "lead" 1208 | } 1209 | ], 1210 | "description": "The PHP Unit Testing framework.", 1211 | "homepage": "https://phpunit.de/", 1212 | "keywords": [ 1213 | "phpunit", 1214 | "testing", 1215 | "xunit" 1216 | ], 1217 | "support": { 1218 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1219 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27" 1220 | }, 1221 | "funding": [ 1222 | { 1223 | "url": "https://phpunit.de/sponsors.html", 1224 | "type": "custom" 1225 | }, 1226 | { 1227 | "url": "https://github.com/sebastianbergmann", 1228 | "type": "github" 1229 | }, 1230 | { 1231 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1232 | "type": "tidelift" 1233 | } 1234 | ], 1235 | "time": "2022-12-09T07:31:23+00:00" 1236 | }, 1237 | { 1238 | "name": "sebastian/cli-parser", 1239 | "version": "1.0.1", 1240 | "source": { 1241 | "type": "git", 1242 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1243 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1244 | }, 1245 | "dist": { 1246 | "type": "zip", 1247 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1248 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1249 | "shasum": "" 1250 | }, 1251 | "require": { 1252 | "php": ">=7.3" 1253 | }, 1254 | "require-dev": { 1255 | "phpunit/phpunit": "^9.3" 1256 | }, 1257 | "type": "library", 1258 | "extra": { 1259 | "branch-alias": { 1260 | "dev-master": "1.0-dev" 1261 | } 1262 | }, 1263 | "autoload": { 1264 | "classmap": [ 1265 | "src/" 1266 | ] 1267 | }, 1268 | "notification-url": "https://packagist.org/downloads/", 1269 | "license": [ 1270 | "BSD-3-Clause" 1271 | ], 1272 | "authors": [ 1273 | { 1274 | "name": "Sebastian Bergmann", 1275 | "email": "sebastian@phpunit.de", 1276 | "role": "lead" 1277 | } 1278 | ], 1279 | "description": "Library for parsing CLI options", 1280 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1281 | "support": { 1282 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1283 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1284 | }, 1285 | "funding": [ 1286 | { 1287 | "url": "https://github.com/sebastianbergmann", 1288 | "type": "github" 1289 | } 1290 | ], 1291 | "time": "2020-09-28T06:08:49+00:00" 1292 | }, 1293 | { 1294 | "name": "sebastian/code-unit", 1295 | "version": "1.0.8", 1296 | "source": { 1297 | "type": "git", 1298 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1299 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1300 | }, 1301 | "dist": { 1302 | "type": "zip", 1303 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1304 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1305 | "shasum": "" 1306 | }, 1307 | "require": { 1308 | "php": ">=7.3" 1309 | }, 1310 | "require-dev": { 1311 | "phpunit/phpunit": "^9.3" 1312 | }, 1313 | "type": "library", 1314 | "extra": { 1315 | "branch-alias": { 1316 | "dev-master": "1.0-dev" 1317 | } 1318 | }, 1319 | "autoload": { 1320 | "classmap": [ 1321 | "src/" 1322 | ] 1323 | }, 1324 | "notification-url": "https://packagist.org/downloads/", 1325 | "license": [ 1326 | "BSD-3-Clause" 1327 | ], 1328 | "authors": [ 1329 | { 1330 | "name": "Sebastian Bergmann", 1331 | "email": "sebastian@phpunit.de", 1332 | "role": "lead" 1333 | } 1334 | ], 1335 | "description": "Collection of value objects that represent the PHP code units", 1336 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1337 | "support": { 1338 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1339 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1340 | }, 1341 | "funding": [ 1342 | { 1343 | "url": "https://github.com/sebastianbergmann", 1344 | "type": "github" 1345 | } 1346 | ], 1347 | "time": "2020-10-26T13:08:54+00:00" 1348 | }, 1349 | { 1350 | "name": "sebastian/code-unit-reverse-lookup", 1351 | "version": "2.0.3", 1352 | "source": { 1353 | "type": "git", 1354 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1355 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1356 | }, 1357 | "dist": { 1358 | "type": "zip", 1359 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1360 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1361 | "shasum": "" 1362 | }, 1363 | "require": { 1364 | "php": ">=7.3" 1365 | }, 1366 | "require-dev": { 1367 | "phpunit/phpunit": "^9.3" 1368 | }, 1369 | "type": "library", 1370 | "extra": { 1371 | "branch-alias": { 1372 | "dev-master": "2.0-dev" 1373 | } 1374 | }, 1375 | "autoload": { 1376 | "classmap": [ 1377 | "src/" 1378 | ] 1379 | }, 1380 | "notification-url": "https://packagist.org/downloads/", 1381 | "license": [ 1382 | "BSD-3-Clause" 1383 | ], 1384 | "authors": [ 1385 | { 1386 | "name": "Sebastian Bergmann", 1387 | "email": "sebastian@phpunit.de" 1388 | } 1389 | ], 1390 | "description": "Looks up which function or method a line of code belongs to", 1391 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1392 | "support": { 1393 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1394 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1395 | }, 1396 | "funding": [ 1397 | { 1398 | "url": "https://github.com/sebastianbergmann", 1399 | "type": "github" 1400 | } 1401 | ], 1402 | "time": "2020-09-28T05:30:19+00:00" 1403 | }, 1404 | { 1405 | "name": "sebastian/comparator", 1406 | "version": "4.0.8", 1407 | "source": { 1408 | "type": "git", 1409 | "url": "https://github.com/sebastianbergmann/comparator.git", 1410 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1411 | }, 1412 | "dist": { 1413 | "type": "zip", 1414 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1415 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1416 | "shasum": "" 1417 | }, 1418 | "require": { 1419 | "php": ">=7.3", 1420 | "sebastian/diff": "^4.0", 1421 | "sebastian/exporter": "^4.0" 1422 | }, 1423 | "require-dev": { 1424 | "phpunit/phpunit": "^9.3" 1425 | }, 1426 | "type": "library", 1427 | "extra": { 1428 | "branch-alias": { 1429 | "dev-master": "4.0-dev" 1430 | } 1431 | }, 1432 | "autoload": { 1433 | "classmap": [ 1434 | "src/" 1435 | ] 1436 | }, 1437 | "notification-url": "https://packagist.org/downloads/", 1438 | "license": [ 1439 | "BSD-3-Clause" 1440 | ], 1441 | "authors": [ 1442 | { 1443 | "name": "Sebastian Bergmann", 1444 | "email": "sebastian@phpunit.de" 1445 | }, 1446 | { 1447 | "name": "Jeff Welch", 1448 | "email": "whatthejeff@gmail.com" 1449 | }, 1450 | { 1451 | "name": "Volker Dusch", 1452 | "email": "github@wallbash.com" 1453 | }, 1454 | { 1455 | "name": "Bernhard Schussek", 1456 | "email": "bschussek@2bepublished.at" 1457 | } 1458 | ], 1459 | "description": "Provides the functionality to compare PHP values for equality", 1460 | "homepage": "https://github.com/sebastianbergmann/comparator", 1461 | "keywords": [ 1462 | "comparator", 1463 | "compare", 1464 | "equality" 1465 | ], 1466 | "support": { 1467 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1468 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1469 | }, 1470 | "funding": [ 1471 | { 1472 | "url": "https://github.com/sebastianbergmann", 1473 | "type": "github" 1474 | } 1475 | ], 1476 | "time": "2022-09-14T12:41:17+00:00" 1477 | }, 1478 | { 1479 | "name": "sebastian/complexity", 1480 | "version": "2.0.2", 1481 | "source": { 1482 | "type": "git", 1483 | "url": "https://github.com/sebastianbergmann/complexity.git", 1484 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1485 | }, 1486 | "dist": { 1487 | "type": "zip", 1488 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1489 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1490 | "shasum": "" 1491 | }, 1492 | "require": { 1493 | "nikic/php-parser": "^4.7", 1494 | "php": ">=7.3" 1495 | }, 1496 | "require-dev": { 1497 | "phpunit/phpunit": "^9.3" 1498 | }, 1499 | "type": "library", 1500 | "extra": { 1501 | "branch-alias": { 1502 | "dev-master": "2.0-dev" 1503 | } 1504 | }, 1505 | "autoload": { 1506 | "classmap": [ 1507 | "src/" 1508 | ] 1509 | }, 1510 | "notification-url": "https://packagist.org/downloads/", 1511 | "license": [ 1512 | "BSD-3-Clause" 1513 | ], 1514 | "authors": [ 1515 | { 1516 | "name": "Sebastian Bergmann", 1517 | "email": "sebastian@phpunit.de", 1518 | "role": "lead" 1519 | } 1520 | ], 1521 | "description": "Library for calculating the complexity of PHP code units", 1522 | "homepage": "https://github.com/sebastianbergmann/complexity", 1523 | "support": { 1524 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1525 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1526 | }, 1527 | "funding": [ 1528 | { 1529 | "url": "https://github.com/sebastianbergmann", 1530 | "type": "github" 1531 | } 1532 | ], 1533 | "time": "2020-10-26T15:52:27+00:00" 1534 | }, 1535 | { 1536 | "name": "sebastian/diff", 1537 | "version": "4.0.4", 1538 | "source": { 1539 | "type": "git", 1540 | "url": "https://github.com/sebastianbergmann/diff.git", 1541 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 1542 | }, 1543 | "dist": { 1544 | "type": "zip", 1545 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1546 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 1547 | "shasum": "" 1548 | }, 1549 | "require": { 1550 | "php": ">=7.3" 1551 | }, 1552 | "require-dev": { 1553 | "phpunit/phpunit": "^9.3", 1554 | "symfony/process": "^4.2 || ^5" 1555 | }, 1556 | "type": "library", 1557 | "extra": { 1558 | "branch-alias": { 1559 | "dev-master": "4.0-dev" 1560 | } 1561 | }, 1562 | "autoload": { 1563 | "classmap": [ 1564 | "src/" 1565 | ] 1566 | }, 1567 | "notification-url": "https://packagist.org/downloads/", 1568 | "license": [ 1569 | "BSD-3-Clause" 1570 | ], 1571 | "authors": [ 1572 | { 1573 | "name": "Sebastian Bergmann", 1574 | "email": "sebastian@phpunit.de" 1575 | }, 1576 | { 1577 | "name": "Kore Nordmann", 1578 | "email": "mail@kore-nordmann.de" 1579 | } 1580 | ], 1581 | "description": "Diff implementation", 1582 | "homepage": "https://github.com/sebastianbergmann/diff", 1583 | "keywords": [ 1584 | "diff", 1585 | "udiff", 1586 | "unidiff", 1587 | "unified diff" 1588 | ], 1589 | "support": { 1590 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1591 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 1592 | }, 1593 | "funding": [ 1594 | { 1595 | "url": "https://github.com/sebastianbergmann", 1596 | "type": "github" 1597 | } 1598 | ], 1599 | "time": "2020-10-26T13:10:38+00:00" 1600 | }, 1601 | { 1602 | "name": "sebastian/environment", 1603 | "version": "5.1.4", 1604 | "source": { 1605 | "type": "git", 1606 | "url": "https://github.com/sebastianbergmann/environment.git", 1607 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" 1608 | }, 1609 | "dist": { 1610 | "type": "zip", 1611 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", 1612 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", 1613 | "shasum": "" 1614 | }, 1615 | "require": { 1616 | "php": ">=7.3" 1617 | }, 1618 | "require-dev": { 1619 | "phpunit/phpunit": "^9.3" 1620 | }, 1621 | "suggest": { 1622 | "ext-posix": "*" 1623 | }, 1624 | "type": "library", 1625 | "extra": { 1626 | "branch-alias": { 1627 | "dev-master": "5.1-dev" 1628 | } 1629 | }, 1630 | "autoload": { 1631 | "classmap": [ 1632 | "src/" 1633 | ] 1634 | }, 1635 | "notification-url": "https://packagist.org/downloads/", 1636 | "license": [ 1637 | "BSD-3-Clause" 1638 | ], 1639 | "authors": [ 1640 | { 1641 | "name": "Sebastian Bergmann", 1642 | "email": "sebastian@phpunit.de" 1643 | } 1644 | ], 1645 | "description": "Provides functionality to handle HHVM/PHP environments", 1646 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1647 | "keywords": [ 1648 | "Xdebug", 1649 | "environment", 1650 | "hhvm" 1651 | ], 1652 | "support": { 1653 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1654 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" 1655 | }, 1656 | "funding": [ 1657 | { 1658 | "url": "https://github.com/sebastianbergmann", 1659 | "type": "github" 1660 | } 1661 | ], 1662 | "time": "2022-04-03T09:37:03+00:00" 1663 | }, 1664 | { 1665 | "name": "sebastian/exporter", 1666 | "version": "4.0.5", 1667 | "source": { 1668 | "type": "git", 1669 | "url": "https://github.com/sebastianbergmann/exporter.git", 1670 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" 1671 | }, 1672 | "dist": { 1673 | "type": "zip", 1674 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1675 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1676 | "shasum": "" 1677 | }, 1678 | "require": { 1679 | "php": ">=7.3", 1680 | "sebastian/recursion-context": "^4.0" 1681 | }, 1682 | "require-dev": { 1683 | "ext-mbstring": "*", 1684 | "phpunit/phpunit": "^9.3" 1685 | }, 1686 | "type": "library", 1687 | "extra": { 1688 | "branch-alias": { 1689 | "dev-master": "4.0-dev" 1690 | } 1691 | }, 1692 | "autoload": { 1693 | "classmap": [ 1694 | "src/" 1695 | ] 1696 | }, 1697 | "notification-url": "https://packagist.org/downloads/", 1698 | "license": [ 1699 | "BSD-3-Clause" 1700 | ], 1701 | "authors": [ 1702 | { 1703 | "name": "Sebastian Bergmann", 1704 | "email": "sebastian@phpunit.de" 1705 | }, 1706 | { 1707 | "name": "Jeff Welch", 1708 | "email": "whatthejeff@gmail.com" 1709 | }, 1710 | { 1711 | "name": "Volker Dusch", 1712 | "email": "github@wallbash.com" 1713 | }, 1714 | { 1715 | "name": "Adam Harvey", 1716 | "email": "aharvey@php.net" 1717 | }, 1718 | { 1719 | "name": "Bernhard Schussek", 1720 | "email": "bschussek@gmail.com" 1721 | } 1722 | ], 1723 | "description": "Provides the functionality to export PHP variables for visualization", 1724 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1725 | "keywords": [ 1726 | "export", 1727 | "exporter" 1728 | ], 1729 | "support": { 1730 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1731 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" 1732 | }, 1733 | "funding": [ 1734 | { 1735 | "url": "https://github.com/sebastianbergmann", 1736 | "type": "github" 1737 | } 1738 | ], 1739 | "time": "2022-09-14T06:03:37+00:00" 1740 | }, 1741 | { 1742 | "name": "sebastian/global-state", 1743 | "version": "5.0.5", 1744 | "source": { 1745 | "type": "git", 1746 | "url": "https://github.com/sebastianbergmann/global-state.git", 1747 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 1748 | }, 1749 | "dist": { 1750 | "type": "zip", 1751 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1752 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1753 | "shasum": "" 1754 | }, 1755 | "require": { 1756 | "php": ">=7.3", 1757 | "sebastian/object-reflector": "^2.0", 1758 | "sebastian/recursion-context": "^4.0" 1759 | }, 1760 | "require-dev": { 1761 | "ext-dom": "*", 1762 | "phpunit/phpunit": "^9.3" 1763 | }, 1764 | "suggest": { 1765 | "ext-uopz": "*" 1766 | }, 1767 | "type": "library", 1768 | "extra": { 1769 | "branch-alias": { 1770 | "dev-master": "5.0-dev" 1771 | } 1772 | }, 1773 | "autoload": { 1774 | "classmap": [ 1775 | "src/" 1776 | ] 1777 | }, 1778 | "notification-url": "https://packagist.org/downloads/", 1779 | "license": [ 1780 | "BSD-3-Clause" 1781 | ], 1782 | "authors": [ 1783 | { 1784 | "name": "Sebastian Bergmann", 1785 | "email": "sebastian@phpunit.de" 1786 | } 1787 | ], 1788 | "description": "Snapshotting of global state", 1789 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1790 | "keywords": [ 1791 | "global state" 1792 | ], 1793 | "support": { 1794 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1795 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 1796 | }, 1797 | "funding": [ 1798 | { 1799 | "url": "https://github.com/sebastianbergmann", 1800 | "type": "github" 1801 | } 1802 | ], 1803 | "time": "2022-02-14T08:28:10+00:00" 1804 | }, 1805 | { 1806 | "name": "sebastian/lines-of-code", 1807 | "version": "1.0.3", 1808 | "source": { 1809 | "type": "git", 1810 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1811 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 1812 | }, 1813 | "dist": { 1814 | "type": "zip", 1815 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1816 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1817 | "shasum": "" 1818 | }, 1819 | "require": { 1820 | "nikic/php-parser": "^4.6", 1821 | "php": ">=7.3" 1822 | }, 1823 | "require-dev": { 1824 | "phpunit/phpunit": "^9.3" 1825 | }, 1826 | "type": "library", 1827 | "extra": { 1828 | "branch-alias": { 1829 | "dev-master": "1.0-dev" 1830 | } 1831 | }, 1832 | "autoload": { 1833 | "classmap": [ 1834 | "src/" 1835 | ] 1836 | }, 1837 | "notification-url": "https://packagist.org/downloads/", 1838 | "license": [ 1839 | "BSD-3-Clause" 1840 | ], 1841 | "authors": [ 1842 | { 1843 | "name": "Sebastian Bergmann", 1844 | "email": "sebastian@phpunit.de", 1845 | "role": "lead" 1846 | } 1847 | ], 1848 | "description": "Library for counting the lines of code in PHP source code", 1849 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1850 | "support": { 1851 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1852 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 1853 | }, 1854 | "funding": [ 1855 | { 1856 | "url": "https://github.com/sebastianbergmann", 1857 | "type": "github" 1858 | } 1859 | ], 1860 | "time": "2020-11-28T06:42:11+00:00" 1861 | }, 1862 | { 1863 | "name": "sebastian/object-enumerator", 1864 | "version": "4.0.4", 1865 | "source": { 1866 | "type": "git", 1867 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1868 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1869 | }, 1870 | "dist": { 1871 | "type": "zip", 1872 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1873 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1874 | "shasum": "" 1875 | }, 1876 | "require": { 1877 | "php": ">=7.3", 1878 | "sebastian/object-reflector": "^2.0", 1879 | "sebastian/recursion-context": "^4.0" 1880 | }, 1881 | "require-dev": { 1882 | "phpunit/phpunit": "^9.3" 1883 | }, 1884 | "type": "library", 1885 | "extra": { 1886 | "branch-alias": { 1887 | "dev-master": "4.0-dev" 1888 | } 1889 | }, 1890 | "autoload": { 1891 | "classmap": [ 1892 | "src/" 1893 | ] 1894 | }, 1895 | "notification-url": "https://packagist.org/downloads/", 1896 | "license": [ 1897 | "BSD-3-Clause" 1898 | ], 1899 | "authors": [ 1900 | { 1901 | "name": "Sebastian Bergmann", 1902 | "email": "sebastian@phpunit.de" 1903 | } 1904 | ], 1905 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1906 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1907 | "support": { 1908 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1909 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1910 | }, 1911 | "funding": [ 1912 | { 1913 | "url": "https://github.com/sebastianbergmann", 1914 | "type": "github" 1915 | } 1916 | ], 1917 | "time": "2020-10-26T13:12:34+00:00" 1918 | }, 1919 | { 1920 | "name": "sebastian/object-reflector", 1921 | "version": "2.0.4", 1922 | "source": { 1923 | "type": "git", 1924 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1925 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1926 | }, 1927 | "dist": { 1928 | "type": "zip", 1929 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1930 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1931 | "shasum": "" 1932 | }, 1933 | "require": { 1934 | "php": ">=7.3" 1935 | }, 1936 | "require-dev": { 1937 | "phpunit/phpunit": "^9.3" 1938 | }, 1939 | "type": "library", 1940 | "extra": { 1941 | "branch-alias": { 1942 | "dev-master": "2.0-dev" 1943 | } 1944 | }, 1945 | "autoload": { 1946 | "classmap": [ 1947 | "src/" 1948 | ] 1949 | }, 1950 | "notification-url": "https://packagist.org/downloads/", 1951 | "license": [ 1952 | "BSD-3-Clause" 1953 | ], 1954 | "authors": [ 1955 | { 1956 | "name": "Sebastian Bergmann", 1957 | "email": "sebastian@phpunit.de" 1958 | } 1959 | ], 1960 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1961 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1962 | "support": { 1963 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1964 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1965 | }, 1966 | "funding": [ 1967 | { 1968 | "url": "https://github.com/sebastianbergmann", 1969 | "type": "github" 1970 | } 1971 | ], 1972 | "time": "2020-10-26T13:14:26+00:00" 1973 | }, 1974 | { 1975 | "name": "sebastian/recursion-context", 1976 | "version": "4.0.4", 1977 | "source": { 1978 | "type": "git", 1979 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1980 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" 1981 | }, 1982 | "dist": { 1983 | "type": "zip", 1984 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", 1985 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", 1986 | "shasum": "" 1987 | }, 1988 | "require": { 1989 | "php": ">=7.3" 1990 | }, 1991 | "require-dev": { 1992 | "phpunit/phpunit": "^9.3" 1993 | }, 1994 | "type": "library", 1995 | "extra": { 1996 | "branch-alias": { 1997 | "dev-master": "4.0-dev" 1998 | } 1999 | }, 2000 | "autoload": { 2001 | "classmap": [ 2002 | "src/" 2003 | ] 2004 | }, 2005 | "notification-url": "https://packagist.org/downloads/", 2006 | "license": [ 2007 | "BSD-3-Clause" 2008 | ], 2009 | "authors": [ 2010 | { 2011 | "name": "Sebastian Bergmann", 2012 | "email": "sebastian@phpunit.de" 2013 | }, 2014 | { 2015 | "name": "Jeff Welch", 2016 | "email": "whatthejeff@gmail.com" 2017 | }, 2018 | { 2019 | "name": "Adam Harvey", 2020 | "email": "aharvey@php.net" 2021 | } 2022 | ], 2023 | "description": "Provides functionality to recursively process PHP variables", 2024 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2025 | "support": { 2026 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2027 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" 2028 | }, 2029 | "funding": [ 2030 | { 2031 | "url": "https://github.com/sebastianbergmann", 2032 | "type": "github" 2033 | } 2034 | ], 2035 | "time": "2020-10-26T13:17:30+00:00" 2036 | }, 2037 | { 2038 | "name": "sebastian/resource-operations", 2039 | "version": "3.0.3", 2040 | "source": { 2041 | "type": "git", 2042 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2043 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2044 | }, 2045 | "dist": { 2046 | "type": "zip", 2047 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2048 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2049 | "shasum": "" 2050 | }, 2051 | "require": { 2052 | "php": ">=7.3" 2053 | }, 2054 | "require-dev": { 2055 | "phpunit/phpunit": "^9.0" 2056 | }, 2057 | "type": "library", 2058 | "extra": { 2059 | "branch-alias": { 2060 | "dev-master": "3.0-dev" 2061 | } 2062 | }, 2063 | "autoload": { 2064 | "classmap": [ 2065 | "src/" 2066 | ] 2067 | }, 2068 | "notification-url": "https://packagist.org/downloads/", 2069 | "license": [ 2070 | "BSD-3-Clause" 2071 | ], 2072 | "authors": [ 2073 | { 2074 | "name": "Sebastian Bergmann", 2075 | "email": "sebastian@phpunit.de" 2076 | } 2077 | ], 2078 | "description": "Provides a list of PHP built-in functions that operate on resources", 2079 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2080 | "support": { 2081 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2082 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2083 | }, 2084 | "funding": [ 2085 | { 2086 | "url": "https://github.com/sebastianbergmann", 2087 | "type": "github" 2088 | } 2089 | ], 2090 | "time": "2020-09-28T06:45:17+00:00" 2091 | }, 2092 | { 2093 | "name": "sebastian/type", 2094 | "version": "3.2.0", 2095 | "source": { 2096 | "type": "git", 2097 | "url": "https://github.com/sebastianbergmann/type.git", 2098 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" 2099 | }, 2100 | "dist": { 2101 | "type": "zip", 2102 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", 2103 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", 2104 | "shasum": "" 2105 | }, 2106 | "require": { 2107 | "php": ">=7.3" 2108 | }, 2109 | "require-dev": { 2110 | "phpunit/phpunit": "^9.5" 2111 | }, 2112 | "type": "library", 2113 | "extra": { 2114 | "branch-alias": { 2115 | "dev-master": "3.2-dev" 2116 | } 2117 | }, 2118 | "autoload": { 2119 | "classmap": [ 2120 | "src/" 2121 | ] 2122 | }, 2123 | "notification-url": "https://packagist.org/downloads/", 2124 | "license": [ 2125 | "BSD-3-Clause" 2126 | ], 2127 | "authors": [ 2128 | { 2129 | "name": "Sebastian Bergmann", 2130 | "email": "sebastian@phpunit.de", 2131 | "role": "lead" 2132 | } 2133 | ], 2134 | "description": "Collection of value objects that represent the types of the PHP type system", 2135 | "homepage": "https://github.com/sebastianbergmann/type", 2136 | "support": { 2137 | "issues": "https://github.com/sebastianbergmann/type/issues", 2138 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" 2139 | }, 2140 | "funding": [ 2141 | { 2142 | "url": "https://github.com/sebastianbergmann", 2143 | "type": "github" 2144 | } 2145 | ], 2146 | "time": "2022-09-12T14:47:03+00:00" 2147 | }, 2148 | { 2149 | "name": "sebastian/version", 2150 | "version": "3.0.2", 2151 | "source": { 2152 | "type": "git", 2153 | "url": "https://github.com/sebastianbergmann/version.git", 2154 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2155 | }, 2156 | "dist": { 2157 | "type": "zip", 2158 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2159 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2160 | "shasum": "" 2161 | }, 2162 | "require": { 2163 | "php": ">=7.3" 2164 | }, 2165 | "type": "library", 2166 | "extra": { 2167 | "branch-alias": { 2168 | "dev-master": "3.0-dev" 2169 | } 2170 | }, 2171 | "autoload": { 2172 | "classmap": [ 2173 | "src/" 2174 | ] 2175 | }, 2176 | "notification-url": "https://packagist.org/downloads/", 2177 | "license": [ 2178 | "BSD-3-Clause" 2179 | ], 2180 | "authors": [ 2181 | { 2182 | "name": "Sebastian Bergmann", 2183 | "email": "sebastian@phpunit.de", 2184 | "role": "lead" 2185 | } 2186 | ], 2187 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2188 | "homepage": "https://github.com/sebastianbergmann/version", 2189 | "support": { 2190 | "issues": "https://github.com/sebastianbergmann/version/issues", 2191 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2192 | }, 2193 | "funding": [ 2194 | { 2195 | "url": "https://github.com/sebastianbergmann", 2196 | "type": "github" 2197 | } 2198 | ], 2199 | "time": "2020-09-28T06:39:44+00:00" 2200 | }, 2201 | { 2202 | "name": "theseer/tokenizer", 2203 | "version": "1.2.1", 2204 | "source": { 2205 | "type": "git", 2206 | "url": "https://github.com/theseer/tokenizer.git", 2207 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 2208 | }, 2209 | "dist": { 2210 | "type": "zip", 2211 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 2212 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 2213 | "shasum": "" 2214 | }, 2215 | "require": { 2216 | "ext-dom": "*", 2217 | "ext-tokenizer": "*", 2218 | "ext-xmlwriter": "*", 2219 | "php": "^7.2 || ^8.0" 2220 | }, 2221 | "type": "library", 2222 | "autoload": { 2223 | "classmap": [ 2224 | "src/" 2225 | ] 2226 | }, 2227 | "notification-url": "https://packagist.org/downloads/", 2228 | "license": [ 2229 | "BSD-3-Clause" 2230 | ], 2231 | "authors": [ 2232 | { 2233 | "name": "Arne Blankerts", 2234 | "email": "arne@blankerts.de", 2235 | "role": "Developer" 2236 | } 2237 | ], 2238 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2239 | "support": { 2240 | "issues": "https://github.com/theseer/tokenizer/issues", 2241 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 2242 | }, 2243 | "funding": [ 2244 | { 2245 | "url": "https://github.com/theseer", 2246 | "type": "github" 2247 | } 2248 | ], 2249 | "time": "2021-07-28T10:34:58+00:00" 2250 | } 2251 | ], 2252 | "aliases": [], 2253 | "minimum-stability": "stable", 2254 | "stability-flags": [], 2255 | "prefer-stable": false, 2256 | "prefer-lowest": false, 2257 | "platform": { 2258 | "php": "^7.2|^8.0|^8.1|^8.2", 2259 | "ext-curl": "*", 2260 | "ext-json": "*", 2261 | "ext-openssl": "*" 2262 | }, 2263 | "platform-dev": [], 2264 | "plugin-api-version": "2.3.0" 2265 | } 2266 | --------------------------------------------------------------------------------