├── .gitignore
├── .github
└── workflows
│ └── test.yml
├── phpunit.xml.dist
├── composer.json
├── LICENSE.textile
├── tests
├── Common
│ └── ObjectMaskTest.php
└── SoapClientTest.php
├── .php_cs
├── src
├── Common
│ └── ObjectMask.php
├── SoapClient
│ └── AsynchronousAction.php
├── XmlRpcClient.php
└── SoapClient.php
├── example.php
├── README.md
└── composer.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /vendor/
2 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on: [push]
4 |
5 | jobs:
6 | build-test:
7 | runs-on: ubuntu-latest
8 |
9 | steps:
10 | - uses: actions/checkout@v2
11 | - uses: php-actions/composer@v6 # or alternative dependency management
12 | with:
13 | php_version: '8.1'
14 | php_extensions: 'soap'
15 | - uses: php-actions/phpunit@v3
16 | with:
17 | php_version: '8.1'
18 | php_extensions: 'soap'
19 | - uses: actions/upload-artifact@v2
20 | with:
21 | name: debug-output
22 | path: output.log
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ./
6 |
7 |
8 | ./tests
9 |
10 |
11 |
12 |
13 | ./tests
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "softlayer/softlayer-api-php-client",
3 | "description": "SoftLayer API PHP client",
4 | "keywords": ["softlayer"],
5 | "homepage": "https://sldn.softlayer.com/php/",
6 | "license": "MIT",
7 | "authors": [
8 | {
9 | "name": "SoftLayer Development Team",
10 | "email": "sldn@softlayer.com"
11 | }
12 | ],
13 | "require": {
14 | "php": ">=8.0",
15 | "ext-soap": "*"
16 | },
17 | "autoload": {
18 | "psr-4": {
19 | "SoftLayer\\": "src/"
20 | }
21 | },
22 | "autoload-dev": {
23 | "psr-4": {
24 | "SoftLayer\\Tests\\": "tests/"
25 | }
26 | },
27 | "extra": {
28 | "config": {
29 | "sort-packages": true
30 | }
31 | },
32 | "require-dev": {
33 | "friendsofphp/php-cs-fixer": ">=3.13.0",
34 | "phpunit/phpunit": ">=9.0"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE.textile:
--------------------------------------------------------------------------------
1 | Copyright (c) 2009 - 2010, "SoftLayer Technologies, Inc.":http://www.softlayer.com/ All rights reserved.
2 |
3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4 |
5 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
6 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
7 | * Neither SoftLayer Technologies, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
8 |
9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10 |
--------------------------------------------------------------------------------
/tests/Common/ObjectMaskTest.php:
--------------------------------------------------------------------------------
1 |
38 | */
39 | class ObjectMaskTest extends TestCase
40 | {
41 | public function testObjectMask()
42 | {
43 | $objectMask = new ObjectMask();
44 | $objectMask->someProp;
45 | $objectMask->someProp->nested;
46 |
47 | $this->assertInstanceOf('SoftLayer\Common\ObjectMask', $objectMask->someProp);
48 | $this->assertInstanceOf('SoftLayer\Common\ObjectMask', $objectMask->someProp->nested);
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/.php_cs:
--------------------------------------------------------------------------------
1 | setUsingCache(true)
35 | ->setRiskyAllowed(true)
36 | ->setRules(array(
37 | '@Symfony' => true,
38 | 'array_syntax' => array('syntax' => 'long'),
39 | 'binary_operator_spaces' => array(
40 | 'align_double_arrow' => false,
41 | 'align_equals' => false,
42 | ),
43 | 'blank_line_after_opening_tag' => true,
44 | 'header_comment' => array('header' => $header),
45 | 'ordered_imports' => true,
46 | 'php_unit_construct' => true,
47 | ))
48 | ->setFinder(
49 | PhpCsFixer\Finder::create()->in(__DIR__)
50 | )
51 | ;
52 | }
53 |
54 | Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader($header);
55 |
56 | return Symfony\CS\Config\Config::create()
57 | ->setUsingCache(true)
58 | ->fixers(array(
59 | 'newline_after_open_tag',
60 | 'ordered_use',
61 | 'php_unit_construct',
62 | 'long_array_syntax',
63 | 'unalign_double_arrow',
64 | 'unalign_equals',
65 | ))
66 | ->finder(
67 | Symfony\CS\Finder\DefaultFinder::create()
68 | ->in(__DIR__)
69 | )
70 | ;
71 |
--------------------------------------------------------------------------------
/src/Common/ObjectMask.php:
--------------------------------------------------------------------------------
1 | datacenter = new \stdClass();
42 | * $objectMask->serverRoom = new \stdClass();
43 | * $objectMask->provisionDate = new \stdClass();
44 | * $objectMask->softwareComponents = new \stdClass();
45 | * $objectMask->softwareComponents->passwords = new \stdClass();
46 | *
47 | * Building an object mask using ObjectMask is a bit easier to
48 | * type:
49 | *
50 | * $objectMask = new ObjectMask();
51 | * $objectMask->datacenter;
52 | * $objectMask->serverRoom;
53 | * $objectMask->provisionDate;
54 | * $objectMask->sofwareComponents->passwords;
55 | *
56 | * Use SoapClient::setObjectMask() to set these object masks before
57 | * making your SoftLayer API calls.
58 | *
59 | * For more on object mask usage in the SoftLayer API please see
60 | * https://sldn.softlayer.com/article/object-masks/ .
61 | *
62 | * The most up to date version of this library can be found on the SoftLayer
63 | * github public repositories: http://github.com/softlayer/ .
64 | *
65 | * @author SoftLayer Technologies, Inc.
66 | * @copyright Copyright (c) 2009 - 2022, Softlayer Technologies, Inc
67 | * @license http://sldn.softlayer.com/article/License
68 | *
69 | * @see SoapClient::setObjectMask()
70 | * @see XmlRpcClient::setObjectMask()
71 | */
72 | class ObjectMask
73 | {
74 | /**
75 | * Define an object mask value.
76 | *
77 | * @param string $var
78 | */
79 | public function __get($var)
80 | {
81 | $this->{$var} = new self();
82 |
83 | return $this->{$var};
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/example.php:
--------------------------------------------------------------------------------
1 | , [username], [API key]);
77 | *
78 | * API Service: The name of the API service you wish to connect to.
79 | * id: An optional id to initialize your API service with, if you're
80 | * interacting with a specific object. If you don't need to specify
81 | * an id then pass null to the client.
82 | * username: Your SoftLayer API username.
83 | * API key: Your SoftLayer API key,
84 | */
85 | $client = SoapClient::getClient('SoftLayer_Account', null, $apiUsername, $apiKey);
86 | $objectMask = "mask[id,companyName]";
87 | $client->setObjectMask($objectMask);
88 |
89 | /**
90 | * Once your client object is created you can call API methods for that service
91 | * directly against your client object. A call may throw an exception on error,
92 | * so it's best to try your call and catch exceptions.
93 | *
94 | * This example calls the getObject() method in the SoftLayer_Account API
95 | * service.
96 | * It retrieves basic account information, and is a great way to test your API
97 | * account and connectivity.
98 | */
99 |
100 | try {
101 | $result = $client->getObject();
102 | //$client->__getLastRequest();
103 | print_r($result);
104 | } catch (\Exception $e) {
105 | die($e->getMessage());
106 | }
107 |
108 | /**
109 | * In this example we will get all of the VirtualGuests on our account. And for each guest we will print out
110 | * some basic information about them, along with make another API call to get its primaryIpAddress.
111 | */
112 |
113 | // Declare an API client to connect to the SoftLayer_Ticket API service.
114 | $client = SoapClient::getClient('SoftLayer_Account', null, $apiUsername, $apiKey);
115 |
116 |
117 | // Assign an object mask to our API client:
118 | $objectMask = "mask[id, hostname, datacenter[longName]]";
119 | $client->setObjectMask($objectMask);
120 |
121 | try {
122 | $virtualGuests = $client->getVirtualGuests();
123 | print("Id, Hostname, Datacenter, Ip Address\n");
124 | foreach ($virtualGuests as $guest) {
125 | $guestClient = SoapClient::getClient('SoftLayer_Virtual_Guest', $guest->id, $apiUsername, $apiKey);
126 | $ipAddress = $guestClient->getPrimaryIpAddress();
127 | print($guest->id . ", " . $guest->hostname . ", " . $guest->datacenter->longName . ", " . $ipAddress . "\n");
128 | break;
129 | }
130 | } catch (\Exception $e) {
131 | die('Unable to retrieve virtual guests: ' . $e->getMessage());
132 | }
133 |
--------------------------------------------------------------------------------
/tests/SoapClientTest.php:
--------------------------------------------------------------------------------
1 | getHeaders();
15 | $this->assertEquals('apiUsername', $headers['authenticate']->data->username);
16 | $this->assertEquals('apiKey', $headers['authenticate']->data->apiKey);
17 | $this->assertEquals(123456, $headers['SoftLayer_TicketInitParameters']->data->id);
18 | }
19 |
20 | public function testGetClientDefaults()
21 | {
22 | $client = SoapClient::getClient('SoftLayer_Ticket');
23 | $headers = $client->getHeaders();
24 | $this->assertEquals('set me', $headers['authenticate']->data->username);
25 | $this->assertEquals('set me', $headers['authenticate']->data->apiKey);
26 | $this->assertFalse(array_key_exists('SoftLayer_TicketInitParameters', $headers));
27 | }
28 |
29 | public function testGetClientNoService()
30 | {
31 | $this->expectException(\Exception::class);
32 | $this->expectExceptionMessage('Please provide a SoftLayer API service name.');
33 | $client = SoapClient::getClient('', 123456, 'apiUsername', 'apiKey');
34 | }
35 |
36 | public function testGetClientNoEndpoint()
37 | {
38 | $this->expectException(\Exception::class);
39 | $this->expectExceptionMessage('Please provide a valid API endpoint.');
40 | $client = SoapClient::getClient('SoftLayer_Account', 123456, 'apiUsername', 'apiKey', $endpointUrl=' ');
41 | }
42 |
43 | public function testSetObjectMask()
44 | {
45 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey');
46 | $mask = "mask[id,test]";
47 | $client->setObjectMask($mask);
48 | $headers = $client->getHeaders();
49 | $this->assertEquals($mask, $headers['SoftLayer_ObjectMask']->data->mask);
50 | }
51 |
52 | public function testSetObjectMaskClass()
53 | {
54 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey');
55 | $mask = new \SoftLayer\Common\ObjectMask();
56 | $mask->id;
57 | $mask->username;
58 | $client->setObjectMask($mask);
59 | $headers = $client->getHeaders();
60 |
61 | $this->assertEquals($mask, $headers['SoftLayer_TicketObjectMask']->data->mask);
62 | }
63 |
64 | public function testSetObjecFilter()
65 | {
66 | $client = SoapClient::getClient('SoftLayer_Ticket', 123456, 'apiUsername', 'apiKey');
67 | $filter = new \stdClass();
68 | $filter->test1 = new \stdClass();
69 | $filter->test1->operation = "testFilter";
70 | $client->setObjectFilter($filter);
71 | $headers = $client->getHeaders();
72 | $this->assertEquals("testFilter", $headers['SoftLayer_TicketObjectFilter']->data->test1->operation);
73 | }
74 |
75 | public function testSetAuthentication()
76 | {
77 | $client = SoapClient::getClient('SoftLayer_Ticket');
78 | $headers = $client->getHeaders();
79 | $this->assertEquals('set me', $headers['authenticate']->data->username);
80 | $this->assertEquals('set me', $headers['authenticate']->data->apiKey);
81 |
82 | $this->expectException(\Exception::class);
83 | $this->expectExceptionMessage('Please provide a SoftLayer API key.');
84 | $client->setAuthentication('username1', '');
85 |
86 | $this->expectException(\Exception::class);
87 | $this->expectExceptionMessage('Please provide a SoftLayer API username.');
88 | $client->setAuthentication(null, 'apikey2');
89 |
90 | $client->setAuthentication('username1', 'apikey2');
91 | $this->assertEquals('username1', $headers['authenticate']->data->username);
92 | $this->assertEquals('apikey2', $headers['authenticate']->data->apiKey);
93 | }
94 |
95 | public function testRemoveHeader()
96 | {
97 | $client = SoapClient::getClient('SoftLayer_Ticket');
98 | $headers = $client->getHeaders();
99 | $this->assertTrue(array_key_exists('authenticate', $headers));
100 | $client->removeHeader('authenticate');
101 | $headers = $client->getHeaders();
102 | $this->assertFalse(array_key_exists('authenticate', $headers));
103 | }
104 |
105 | public function testSetInitParameters()
106 | {
107 | $client = SoapClient::getClient('SoftLayer_Ticket');
108 | $headers = $client->getHeaders();
109 | $this->assertFalse(array_key_exists('SoftLayer_TicketInitParameters', $headers));;
110 | $client->setInitParameter(999);
111 | $headers = $client->getHeaders();
112 | $this->assertTrue(array_key_exists('authenticate', $headers));
113 | $this->assertEquals(999, $headers['SoftLayer_TicketInitParameters']->data->id);
114 | }
115 |
116 | public function testSetResultLimit()
117 | {
118 | $client = SoapClient::getClient('SoftLayer_Ticket');
119 | $headers = $client->getHeaders();
120 | $this->assertFalse(array_key_exists('resultLimit', $headers));;
121 | $client->setResultLimit(111, 999);
122 | $headers = $client->getHeaders();
123 | $this->assertTrue(array_key_exists('resultLimit', $headers));
124 | $this->assertEquals(111, $headers['resultLimit']->data->limit);
125 | $this->assertEquals(999, $headers['resultLimit']->data->offset);
126 | }
127 |
128 | }
129 |
130 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # A SoftLayer API PHP client.
2 |
3 | 
4 |
5 | ## Warning
6 |
7 | Use [v1.2.0](https://github.com/softlayer/softlayer-api-php-client/releases/tag/v1.2) for older PHP versions (php < 8.0) . [v2.0.0](https://github.com/softlayer/softlayer-api-php-client/releases/tag/v2.0.0) for php 8.0 or higher.
8 |
9 | [PHP 8.0 removed XMLRPC](https://php.watch/versions/8.0/xmlrpc) as a built in extension. As such, it is no longer required as part of the composer file in this project. The XmlRpcClient still exists here if you need it, but we assume most users are using the SoapClient. If there are any issues with this [Let us know on github](https://github.com/softlayer/softlayer-api-php-client/issues)
10 |
11 | ## Overview
12 |
13 | The SoftLayer API PHP client classes provide a simple method for connecting to and making calls from the SoftLayer API and provides support for many of the SoftLayer API's features. Method calls and client management are handled by the PHP SOAP and XML-RPC extensions.
14 |
15 | Making API calls using the `\SoftLayer\SoapClient` is done in the following steps:
16 |
17 | 1. Instantiate a new `\SoftLayer\SoapClient` object using the `\SoftLayer\SoapClient::getClient()` method. Provide the name of the service that you wish to query, an optional id number of the object that you wish to instantiate, your SoftLayer API username, your SoftLayer API key, and an optional API endpoint base URL. The client classes default to connect over the public Internet.
18 | 2. Use `\SoftLayer\SoapClient::API_PRIVATE_ENDPOINT` to connect to the API over SoftLayer's private network. The system making API calls must be connected to SoftLayer's private network (eg. purchased from SoftLayer or connected via VPN) in order to use the private network API endpoints.
19 | 3. Define and add optional headers to the client, such as object masks and result limits.
20 | 4. Call the API method you wish to call as if it were local to your client object. This class throws exceptions if it's unable to execute a query, so it's best to place API method calls in try / catch statements for proper error handling.
21 |
22 | Once your method is executed you may continue using the same client if you need to connect to the same service or define another client object if you wish to work with multiple services at once.
23 |
24 |
25 | The most up to date version of this library can be found on the SoftLayer github public repositories: [https://github.com/softlayer/softlayer-api-php-client](https://github.com/softlayer/softlayer-api-php-client) . Any issues using this library, please open a [Github Issue](https://github.com/softlayer/softlayer-api-php-client/issues)
26 |
27 |
28 | ## System Requirements
29 |
30 | The `\SoftLayer\SoapClient` class requires at least PHP 8.0.0 and the PHP SOAP enxtension installed and enabled (`extension=soap` in the php.ini file).
31 | Since [php 8.0 has removed xmlrpc extension](https://php.watch/versions/8.0/xmlrpc) you will need to manually install this library to use the `\SoftLayer\XmlRpcClient`. If you are using an earlier version of php that still includes ext-xml, please use v1.2.0 of this library.
32 |
33 | A valid API username and key are required to call the SoftLayer API. A connection to the SoftLayer private network is required to connect to SoftLayer's private network API endpopints. See [Authenticating to the SoftLayer API](https://sldn.softlayer.com/article/authenticating-softlayer-api/) for how to get these API keys.
34 |
35 | ## Installation
36 |
37 | Install the SoftLayer API client using [Composer](https://getcomposer.org/).
38 | ```bash
39 | composer require softlayer/softlayer-api-php-client:~2.0.0
40 | ```
41 |
42 | ## Usage
43 |
44 | These examples use the `\SoftLayer\SoapClient` class. If you wish to use the XML-RPC API then replace mentions of `SoapClient.class.php` with `XmlrpcClient.class.php` and `\SoftLayer\SoapClient` with `\SoftLayer\XmlRpcClient`.
45 |
46 | Here's a simple usage example that retrieves account information by calling the [getObject()](http://sldn.softlayer.com/reference/services/SoftLayer_Account/getObject) method in the [SoftLayer_Account](http://sldn.softlayer.com/reference/services/SoftLayer_Account) service:
47 |
48 | ```php
49 | getObject();
62 | print_r($account);
63 | } catch (\Exception $e) {
64 | die('Unable to retrieve account information: ' . $e->getMessage());
65 | }
66 | ```
67 |
68 | For a more complex example we'll retrieve a support ticket with id 123456 along with the ticket's updates, the user it's assigned to, the servers attached to it, and the datacenter those servers are in. We'll retrieve our extra information using a nested object mask. After we have the ticket we'll update it with the text 'Hello!'.
69 |
70 | ```php
71 | updates;
84 | $objectMask->assignedUser;
85 | $objectMask->attachedHardware->datacenter;
86 | $client->setObjectMask($objectMask);
87 |
88 | // Retrieve the ticket record
89 | try {
90 | $ticket = $client->getObject();
91 | } catch (\Exception $e) {
92 | die('Unable to retrieve ticket record: ' . $e->getMessage());
93 | }
94 |
95 | // Update the ticket
96 | $update = new \stdClass();
97 | $update->entry = 'Hello!';
98 |
99 | try {
100 | $update = $client->addUpdate($update);
101 | echo "Updated ticket 123456. The new update's id is " . $update[0]->id . '.');
102 | } catch (\Exception $e) {
103 | die('Unable to update ticket: ' . $e->getMessage());
104 | }
105 | ```
106 |
107 | ## Author
108 |
109 | This software is written by the SoftLayer Development Team <[sldn@softlayer.com](mailto:sldn@softlayer.com)>.
110 |
111 | ## Copyright
112 |
113 | This software is Copyright © 2009 – 2022 [SoftLayer Technologies, Inc](http://www.softlayer.com/). See the bundled LICENSE.textile file for more information.
114 |
--------------------------------------------------------------------------------
/src/SoapClient/AsynchronousAction.php:
--------------------------------------------------------------------------------
1 | receive style of transmission. Response
39 | * time for a call is dependent on the latency between the SOAP client and SOAP
40 | * server and the time required by the server to process the SOAP call. Sending
41 | * multiple SOAP calls in serial over the public Internet can be a time
42 | * consuming process.
43 | *
44 | * Asynchronous calls allow you to send multiple SOAP calls in parallel to the
45 | * SoftLayer API. Parallel calls reduce the latency involved handling multiple
46 | * calls to the time it takes for the longest SOAP call to execute, dramatically
47 | * reducing the time it takes to send multiple SOAP calls in most cases.
48 | *
49 | * Asynchronous calls are handled identically to standard API calls with two
50 | * differences:
51 | *
52 | * 1) The SoapClient class knows to make an asynchronous call when the
53 | * method called ends with "Async". For example, to make a standard call to the
54 | * method getObject() you would execute $client->geObject(). It's asynchronous
55 | * counterpart is executed with the code $client->getObjectAsync(). Once the
56 | * asynchronous call is made the results of your API command are sent to this
57 | * classes' socket property.
58 | *
59 | * 2) The results of an asynchronous method call are stored in a
60 | * AsynchronousAction object. Use the wait() method to
61 | * retrieve data off the internal socket and return the result back to the
62 | * SoapClient for processing. For example if you wish to retrieve the
63 | * results of the method getObject() execute the following statements:
64 | *
65 | * $result = $client->getObjectAsync(); // Make the call and start getting data back.
66 | * $result = $result->wait(); // Return the results of the API call
67 | *
68 | * To chain multiple asynchronous requests together call multiple Async requests
69 | * in succession then call their associated wait() methods in succession.
70 | *
71 | * Here's a simple usage example that retrieves account information, a PDF of an
72 | * account's next invoice and enables VLAN spanning on that same account by
73 | * calling three methods in the SoftLayer_Account service in parallel:
74 | *
75 | * ----------
76 | *
77 | * // Initialize an API client for the SoftLayer_Account service.
78 | * $client = SoapClient::getClient('SoftLayer_Account');
79 | *
80 | * try {
81 | * // Request our account information.
82 | * $account = $client->getObjectAsync();
83 | *
84 | * // Request a PDF of our next invoice. This can take much longer than
85 | * // getting simple account information.
86 | * $nextInvoicePdf = $client->getNextInvoicePdfAsync();
87 | *
88 | * // While we're at it we'll enable VLAN spanning on our account.
89 | * $vlanSpanResult = $client->setVlanSpanAsync(true);
90 | *
91 | * // The three requests are now processing in parallel. Use the wait()
92 | * // method to retrieve the results of our requests. The wait time involved
93 | * // is roughly the same time as the longest API call.
94 | * $account = $account->wait();
95 | * $nextInvoicePdf = $nextInvoicePdf->wait();
96 | * $vlanSpanResult = $vlanSpanResult->wait();
97 | *
98 | * // Finally, display our results.
99 | * var_dump($account);
100 | * var_dump($nextInvoicePdf);
101 | * var_dump($vlanSpanResult);
102 | * } catch (\Exception $e) {
103 | * die('Unable to retrieve account information: ' . $e->getMessage());
104 | * }
105 | *
106 | * ----------
107 | *
108 | * The most up to date version of this library can be found on the SoftLayer
109 | * github public repositories: http://github.com/softlayer/ . Please post to
110 | * the SoftLayer forums or open a support ticket
111 | * in the SoftLayer customer portal if you have any questions regarding use of
112 | * this library.
113 | *
114 | * @author SoftLayer Technologies, Inc.
115 | * @copyright Copyright (c) 2009 - 2010, Softlayer Technologies, Inc
116 | * @license http://sldn.softlayer.com/article/License
117 | *
118 | * @see SoapClient
119 | */
120 | class AsynchronousAction
121 | {
122 | /**
123 | * The SoftLayer SOAP client making an asynchronous call.
124 | *
125 | * @var SoapClient
126 | */
127 | protected $_soapClient;
128 |
129 | /**
130 | * The name of the function we're calling.
131 | *
132 | * @var string
133 | */
134 | protected $_functionName;
135 |
136 | /**
137 | * A socket connection to the SoftLayer SOAP API.
138 | *
139 | * @var resource
140 | */
141 | protected $_socket;
142 |
143 | /**
144 | * Perform an asynchronous SoftLayer SOAP call
145 | *
146 | * Create a raw socket connection to the URL specified by the
147 | * SoapClient class and send SOAP HTTP headers and request XML to
148 | * that socket. Throw exceptions if we're unable to make the socket
149 | * connection or send data to that socket.
150 | *
151 | * @param SoapClient $soapClient the SoftLayer SOAP client making the asynchronous call
152 | * @param string $functionName the name of the function we're calling
153 | * @param string $request the full XML SOAP request we wish to make
154 | * @param string $location the URL of the web service we wish to call
155 | * @param string $action the value of the HTTP SOAPAction header in our SOAP call
156 | */
157 | public function __construct($soapClient, $functionName, $request, $location, $action)
158 | {
159 | preg_match('%^(http(?:s)?)://(.*?)(/.*?)$%', $location, $matches);
160 |
161 | $this->_soapClient = $soapClient;
162 | $this->_functionName = $functionName;
163 |
164 | $protocol = $matches[1];
165 | $host = $matches[2];
166 | $endpoint = $matches[3];
167 |
168 | $headers = array(
169 | 'POST '.$endpoint.' HTTP/1.1',
170 | 'Host: '.$host,
171 | 'User-Agent: PHP-SOAP/'.phpversion(),
172 | 'Content-Type: text/xml; charset=utf-8',
173 | 'SOAPAction: "'.$action.'"',
174 | 'Content-Length: '.strlen($request),
175 | 'Connection: close',
176 | );
177 |
178 | if ($protocol === 'https') {
179 | $host = 'ssl://'.$host;
180 | $port = 443;
181 | } else {
182 | $port = 80;
183 | }
184 |
185 | $data = implode("\r\n", $headers)."\r\n\r\n".$request."\r\n";
186 | $this->_socket = fsockopen($host, $port, $errorNumber, $errorMessage);
187 |
188 | if ($this->_socket === false) {
189 | $this->_socket = null;
190 | throw new \Exception('Unable to make an asynchronous SoftLayer API call: '.$errorNumber.': '.$errorMessage);
191 | }
192 |
193 | if (fwrite($this->_socket, $data) === false) {
194 | throw new \Exception('Unable to write data to an asynchronous SoftLayer API call.');
195 | }
196 | }
197 |
198 | /**
199 | * Process and return the results of an asynchronous SoftLayer API call.
200 | *
201 | * Read data from our socket and process the raw SOAP result from the
202 | * SoapClient instance that made the asynchronous call. wait()
203 | * *must* be called in order to receive the results from your API call.
204 | *
205 | * @return object
206 | */
207 | public function wait()
208 | {
209 | $soapResult = '';
210 |
211 | while (!feof($this->_socket)) {
212 | $soapResult .= fread($this->_socket, 8192);
213 | }
214 |
215 | // separate the SOAP result into headers and data.
216 | list($headers, $data) = explode("\r\n\r\n", $soapResult);
217 |
218 | return $this->_soapClient->handleAsyncResult($this->_functionName, $data);
219 | }
220 |
221 | /**
222 | * Close the socket created when the SOAP request was created.
223 | */
224 | public function __destruct()
225 | {
226 | if ($this->_socket) {
227 | fclose($this->_socket);
228 | }
229 | }
230 | }
231 |
--------------------------------------------------------------------------------
/src/XmlRpcClient.php:
--------------------------------------------------------------------------------
1 | or open a support ticket
44 | * in the SoftLayer customer portal if you have any questions regarding use of
45 | * this library.
46 | *
47 | * @author SoftLayer Technologies, Inc.
48 | * @copyright Copyright (c) 2009 - 2010, Softlayer Technologies, Inc
49 | * @license http://sldn.softlayer.com/article/License
50 | *
51 | * @see http://sldn.softlayer.com/article/The_SoftLayer_API The SoftLayer API
52 | */
53 | class XmlRpcClient
54 | {
55 | /**
56 | * Your SoftLayer API username. You may overide this value when calling
57 | * getClient().
58 | *
59 | * @var string
60 | */
61 | const API_USER = 'set me';
62 |
63 | /**
64 | * Your SoftLayer API user's authentication key. You may overide this value
65 | * when calling getClient().
66 | *
67 | * @see https://manage.softlayer.com/Administrative/apiKeychain API key management in the SoftLayer customer portal
68 | *
69 | * @var string
70 | */
71 | const API_KEY = 'set me';
72 |
73 | /**
74 | * The base URL of SoftLayer XML-RPC API's public network endpoints.
75 | *
76 | * @var string
77 | */
78 | const API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/xmlrpc/v3/';
79 |
80 | /**
81 | * The base URL of SoftLayer XML-RPC API's private network endpoints.
82 | *
83 | * @var string
84 | */
85 | const API_PRIVATE_ENDPOINT = 'http://api.service.softlayer.com/xmlrpc/v3/';
86 |
87 | /**
88 | * The API endpoint base URL used by the client.
89 | *
90 | * @var string
91 | */
92 | const API_BASE_URL = self::API_PUBLIC_ENDPOINT;
93 |
94 | /**
95 | * The headers to send along with a SoftLayer API call.
96 | *
97 | * @var array
98 | */
99 | protected $_headers = array();
100 |
101 | /**
102 | * The name of the SoftLayer API service you wish to query.
103 | *
104 | * @see http://sldn.softlayer.com/reference/services A list of SoftLayer API services
105 | *
106 | * @var string
107 | */
108 | protected $_serviceName;
109 |
110 | /**
111 | * The base URL of SoftLayer XML-RPC API's endpoints used by this client.
112 | *
113 | * @var string
114 | */
115 | protected $_endpointUrl;
116 |
117 | /**
118 | * Execute a SoftLayer API method.
119 | *
120 | * @return object
121 | */
122 | public function __call($functionName, $arguments = null)
123 | {
124 | $request = array();
125 | $request[0] = array('headers' => $this->_headers);
126 | $request = array_merge($request, $arguments);
127 |
128 | try {
129 | $encodedRequest = xmlrpc_encode_request($functionName, $request);
130 |
131 | // Making the XML-RPC call and interpreting the response is adapted
132 | // from the PHP manual:
133 | // http://www.php.net/manual/en/function.xmlrpc-encode-request.php
134 | $context = stream_context_create(array(
135 | 'http' => array(
136 | 'method' => 'POST',
137 | 'header' => 'Content-Type: text/xml',
138 | 'content' => $encodedRequest,
139 | ), ));
140 |
141 | $file = file_get_contents($this->_endpointUrl.$this->_serviceName, false, $context);
142 |
143 | if (false === $file) {
144 | throw new \Exception('Unable to contact the SoftLayer API at '.$this->_endpointUrl.$serviceName.'.');
145 | }
146 |
147 | $result = xmlrpc_decode($file);
148 | } catch (\Exception $e) {
149 | throw new \Exception('There was an error querying the SoftLayer API: '.$e->getMessage());
150 | }
151 |
152 | if (is_array($result) && xmlrpc_is_fault($result)) {
153 | throw new \Exception('There was an error querying the SoftLayer API: '.$result['faultString']);
154 | }
155 |
156 | // remove the resultLimit header if they set it
157 | $this->removeHeader('resultLimit');
158 |
159 | return self::_convertToObject(self::_convertXmlrpcTypes($result));
160 | }
161 |
162 | /**
163 | * Create a SoftLayer API XML-RPC Client.
164 | *
165 | * Retrieve a new XmlRpcClient object for a specific SoftLayer API
166 | * service using either the class' constants API_USER and API_KEY or a
167 | * custom username and API key for authentication. Provide an optional id
168 | * value if you wish to instantiate a particular SoftLayer API object.
169 | *
170 | * @param string $serviceName The name of the SoftLayer API service you wish to query
171 | * @param int $id An optional object id if you're instantiating a particular SoftLayer API object. Setting an id defines this client's initialization parameter header.
172 | * @param string $username an optional API username if you wish to bypass XmlRpcClient's built-in username
173 | * @param string $apiKey an optional API key if you wish to bypass XmlRpcClient's built-in API key
174 | * @param string $endpointUrl The API endpoint base URL you wish to connect to. Set this to XmlRpcClient::API_PRIVATE_ENDPOINT to connect via SoftLayer's private network.
175 | *
176 | * @return XmlRpcClient
177 | */
178 | public static function getClient($serviceName, $id = null, $username = null, $apiKey = null, $endpointUrl = null)
179 | {
180 | $serviceName = trim($serviceName);
181 |
182 | if ('' === $serviceName) {
183 | throw new \Exception('Please provide a SoftLayer API service name.');
184 | }
185 |
186 | $client = new self();
187 |
188 | /*
189 | * Default to use the public network API endpoint, otherwise use the
190 | * endpoint defined in API_PUBLIC_ENDPOINT, otherwise use the one
191 | * provided by the user.
192 | */
193 | if (null !== $endpointUrl) {
194 | $endpointUrl = trim($endpointUrl);
195 |
196 | if ('' === $endpointUrl) {
197 | throw new \Exception('Please provide a valid API endpoint.');
198 | }
199 |
200 | $client->_endpointUrl = $endpointUrl;
201 | } elseif (self::API_BASE_URL != null) {
202 | $client->_endpointUrl = self::API_BASE_URL;
203 | } else {
204 | $client->_endpointUrl = self::API_PUBLIC_ENDPOINT;
205 | }
206 |
207 | $username = trim($username);
208 | $apiKey = trim($apiKey);
209 |
210 | if ('' !== $username && '' !== $apiKey) {
211 | $client->setAuthentication($username, $apiKey);
212 | } else {
213 | $client->setAuthentication(self::API_USER, self::API_KEY);
214 | }
215 |
216 | $client->_serviceName = $serviceName;
217 |
218 | $id = trim($id);
219 |
220 | if ('' !== $id) {
221 | $client->setInitParameter($id);
222 | }
223 |
224 | return $client;
225 | }
226 |
227 | /**
228 | * Set a SoftLayer API call header.
229 | *
230 | * Every header defines a customization specific to an SoftLayer API call.
231 | * Most API calls require authentication and initialization parameter
232 | * headers, but can also include optional headers such as object masks and
233 | * result limits if they're supported by the API method you're calling.
234 | *
235 | * @see removeHeader()
236 | *
237 | * @param string $name The name of the header you wish to set
238 | * @param object $value The object you wish to set in this header
239 | *
240 | * @return XmlRpcClient
241 | */
242 | public function addHeader($name, $value)
243 | {
244 | if (is_object($value)) {
245 | $value = (array) $value;
246 | }
247 |
248 | $this->_headers[$name] = $value;
249 |
250 | return $this;
251 | }
252 |
253 | /**
254 | * Remove a SoftLayer API call header.
255 | *
256 | * Removing headers may cause API queries to fail.
257 | *
258 | * @see addHeader()
259 | *
260 | * @param string $name The name of the header you wish to remove
261 | *
262 | * @return XmlRpcClient
263 | */
264 | public function removeHeader($name)
265 | {
266 | unset($this->_headers[$name]);
267 |
268 | return $this;
269 | }
270 |
271 | /**
272 | * Set a user and key to authenticate a SoftLayer API call.
273 | *
274 | * Use this method if you wish to bypass the API_USER and API_KEY class
275 | * constants and set custom authentication per API call.
276 | *
277 | * @see https://manage.softlayer.com/Administrative/apiKeychain API key management in the SoftLayer customer portal
278 | *
279 | * @param string $username
280 | * @param string $apiKey
281 | *
282 | * @return XmlRpcClient
283 | */
284 | public function setAuthentication($username, $apiKey)
285 | {
286 | $username = trim($username);
287 |
288 | if ('' === $username) {
289 | throw new \Exception('Please provide a SoftLayer API username.');
290 | }
291 |
292 | $apiKey = trim($apiKey);
293 |
294 | if ('' === $apiKey) {
295 | throw new \Exception('Please provide a SoftLayer API key.');
296 | }
297 |
298 | $header = new \stdClass();
299 | $header->username = $username;
300 | $header->apiKey = $apiKey;
301 |
302 | $this->addHeader('authenticate', $header);
303 |
304 | return $this;
305 | }
306 |
307 | /**
308 | * Set an initialization parameter header on a SoftLayer API call.
309 | *
310 | * Initialization parameters instantiate a SoftLayer API service object to
311 | * act upon during your API method call. For instance, if your account has a
312 | * server with id number 1234, then setting an initialization parameter of
313 | * 1234 in the SoftLayer_Hardware_Server Service instructs the API to act on
314 | * server record 1234 in your method calls.
315 | *
316 | * @see http://sldn.softlayer.com/article/Using_Initialization_Parameters_in_the_SoftLayer_API Using Initialization Parameters in the SoftLayer API
317 | *
318 | * @param int $id the ID number of the SoftLayer API object you wish to instantiate
319 | *
320 | * @return XmlRpcClient
321 | */
322 | public function setInitParameter($id)
323 | {
324 | $id = trim($id);
325 |
326 | if ('' !== $id) {
327 | $initParameters = new \stdClass();
328 | $initParameters->id = $id;
329 | $this->addHeader($this->_serviceName.'InitParameters', $initParameters);
330 | }
331 |
332 | return $this;
333 | }
334 |
335 | /**
336 | * Set an object mask to a SoftLayer API call.
337 | *
338 | * Use an object mask to retrieve data related your API call's result.
339 | * Object masks are skeleton objects or strings that define nested relational
340 | * properties to retrieve along with an object's local properties.
341 | *
342 | * @see ObjectMask
343 | * @see http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayer-API Using object masks in the SoftLayer API
344 | *
345 | * @param object $mask The object mask you wish to define
346 | *
347 | * @return SoapClient
348 | */
349 | public function setObjectMask($mask)
350 | {
351 | if (null !== $mask) {
352 | $header = 'ObjectMask';
353 |
354 | if ($mask instanceof ObjectMask) {
355 | $header = sprintf('%sObjectMask', $this->_serviceName);
356 | }
357 |
358 | $objectMask = new \stdClass();
359 | $objectMask->mask = $mask;
360 | $this->addHeader($header, $objectMask);
361 | }
362 |
363 | return $this;
364 | }
365 |
366 | /**
367 | * Set a result limit on a SoftLayer API call.
368 | *
369 | * Many SoftLayer API methods return a group of results. These methods
370 | * support a way to limit the number of results retrieved from the SoftLayer
371 | * API in a way akin to an SQL LIMIT statement.
372 | *
373 | * @see http://sldn.softlayer.com/article/Using_Result_Limits_in_the_SoftLayer_API Using Result Limits in the SoftLayer API
374 | *
375 | * @param int $limit the number of results to limit your SoftLayer API call to
376 | * @param int $offset an optional offset to begin your SoftLayer API call's returned result set at
377 | *
378 | * @return XmlRpcClient
379 | */
380 | public function setResultLimit($limit, $offset = 0)
381 | {
382 | $resultLimit = new \stdClass();
383 | $resultLimit->limit = (int) $limit;
384 | $resultLimit->offset = (int) $offset;
385 |
386 | $this->addHeader('resultLimit', $resultLimit);
387 |
388 | return $this;
389 | }
390 |
391 | /**
392 | * Remove PHP xmlrpc type definition structures from a decoded request array.
393 | *
394 | * Certain xmlrpc types like base64 are decoded in PHP to a \stdClass with a
395 | * scalar property containing the decoded value of the xmlrpc member and an
396 | * xmlrpc_type property describing which xmlrpc type is being described. This
397 | * function removes xmlrpc_type data and moves the scalar value into the root of
398 | * the xmlrpc value for known xmlrpc types.
399 | *
400 | * @param mixed $result The decoded xmlrpc request to process
401 | *
402 | * @return mixed
403 | */
404 | private static function _convertXmlrpcTypes($result)
405 | {
406 | if (is_array($result)) {
407 | // Return case 1: The result is an empty array. Return the empty
408 | // array.
409 | if (empty($result)) {
410 | return $result;
411 | }
412 |
413 | // Return case 2: The result is a non-empty array. Loop through
414 | // array elements and recursively translate every element.
415 | // Return the fully translated array.
416 | foreach ($result as $key => $value) {
417 | $result[$key] = self::_convertXmlrpcTypes($value);
418 | }
419 |
420 | return $result;
421 | }
422 |
423 | // Return case 3: The result is an xmlrpc scalar. Convert it to a normal
424 | // variable and return it.
425 | if (is_object($result) && null !== $result->scalar && null !== $result->xmlrpc_type) {
426 | // Convert known xmlrpc types, otherwise unset the value.
427 | switch ($result->xmlrpc_type) {
428 | case 'base64':
429 | return $result->scalar;
430 | default:
431 | return null;
432 | }
433 | }
434 |
435 | // Return case 4: Otherwise the result is a non-array and non xml-rpc
436 | // scalar variable. Return it unmolested.
437 |
438 | return $result;
439 | }
440 |
441 | /**
442 | * Recursively convert an array to an object.
443 | *
444 | * Since xmlrpc_decode_result returns an array, but we want an object
445 | * result, so cast all array parts in our result set as objects.
446 | *
447 | * @param mixed $result A result or portion of a result to convert
448 | *
449 | * @return mixed
450 | */
451 | private static function _convertToObject($result)
452 | {
453 | return is_array($result) ? (object) array_map('\\SoftLayer\\XmlRpcClient::_convertToObject', $result) : $result;
454 | }
455 | }
456 |
--------------------------------------------------------------------------------
/src/SoapClient.php:
--------------------------------------------------------------------------------
1 |
49 | * @copyright Copyright (c) 2009 - 2022, Softlayer Technologies, Inc
50 | * @license http://sldn.softlayer.com/article/License
51 | * @link https://sldn.softlayer.com/article/php/ The SoftLayer API
52 | * @see AsynchronousAction
53 |
54 | */
55 | class SoapClient extends \SoapClient
56 | {
57 | /**
58 | * Your SoftLayer API username. You may overide this value when calling getClient().
59 | *
60 | * @var string
61 | */
62 | const API_USER = 'set me';
63 |
64 | /**
65 | * Your SoftLayer API user's authentication key. You may overide this value when calling getClient().
66 | *
67 | * @link https://sldn.softlayer.com/article/authenticating-softlayer-api/ API key management in the SoftLayer customer portal
68 | * @var string
69 | */
70 | const API_KEY = 'set me';
71 |
72 | /**
73 | * The base URL of the SoftLayer SOAP API's WSDL files over the public Internet.
74 | *
75 | * @var string
76 | */
77 | const API_PUBLIC_ENDPOINT = 'https://api.softlayer.com/soap/v3.1/';
78 |
79 | /**
80 | * The base URL of the SoftLayer SOAP API's WSDL files over SoftLayer's private network.
81 | *
82 | * @var string
83 | */
84 | const API_PRIVATE_ENDPOINT = 'http://api.service.softlayer.com/soap/v3.1/';
85 |
86 | /**
87 | * The namespace to use for calls to the API.
88 | *
89 | * $var string
90 | */
91 | const DEFAULT_NAMESPACE = 'http://api.service.softlayer.com/soap/v3.1/';
92 |
93 | /**
94 | * The API endpoint base URL used by the client.
95 | *
96 | * @var string
97 | */
98 | const API_BASE_URL = SoapClient::API_PUBLIC_ENDPOINT;
99 |
100 | /**
101 | * An optional SOAP timeout if you want to set a timeout independent of PHP's socket timeout.
102 | *
103 | * @var int
104 | */
105 | const SOAP_TIMEOUT = null;
106 |
107 | /**
108 | * The SOAP headers to send along with a SoftLayer API call.
109 | *
110 | * @var array
111 | */
112 | protected $_headers = array();
113 |
114 | /**
115 | * The name of the SoftLayer API service you wish to query.
116 | *
117 | * @see http://sldn.softlayer.com/reference/services A list of SoftLayer API services
118 | *
119 | * @var string
120 | */
121 | protected $_serviceName;
122 |
123 | /**
124 | * The base URL to the SoftLayer API's WSDL files being used by this
125 | * client.
126 | *
127 | * @var string
128 | */
129 | protected $_endpointUrl;
130 |
131 | /**
132 | * Whether or not the current call is an asynchronous call.
133 | *
134 | * @var bool
135 | */
136 | protected $_asynchronous = false;
137 |
138 | /**
139 | * The object that handles asynchronous calls if the current call is an
140 | * asynchronous call.
141 | *
142 | * @var AsynchronousAction
143 | */
144 | private $_asyncAction = null;
145 |
146 | /**
147 | * If making an asynchronous call, then this is the name of the function
148 | * we're calling.
149 | *
150 | * @var string
151 | */
152 | public $asyncFunctionName = null;
153 |
154 | /**
155 | * If making an asynchronous call, then this is the result of an
156 | * asynchronous call as retuned from the
157 | * AsynchronousAction class.
158 | *
159 | * @var object
160 | */
161 | private $_asyncResult = null;
162 |
163 | /**
164 | * Used when making asynchronous calls.
165 | *
166 | * @var bool
167 | */
168 | public $oneWay;
169 |
170 |
171 | /**
172 | * Execute a SoftLayer API method.
173 | *
174 | * @return object
175 | */
176 | public function __call($functionName, $arguments = null)
177 | {
178 | // Determine if we shoud be making an asynchronous call. If so strip
179 | // "Async" from the end of the method name.
180 | if ($this->_asyncResult === null) {
181 | $this->_asynchronous = false;
182 | $this->_asyncAction = null;
183 |
184 | if (preg_match('/Async$/', $functionName)) {
185 | $this->_asynchronous = true;
186 | $functionName = str_replace('Async', '', $functionName);
187 |
188 | $this->asyncFunctionName = $functionName;
189 | }
190 | }
191 |
192 | try {
193 | $result = parent::__soapCall($functionName, $arguments, null, $this->_headers);
194 | } catch (\SoapFault $e) {
195 | throw new \Exception('There was an error querying the SoftLayer API: ' . $e->getMessage(), 0, $e);
196 | }
197 |
198 | if ($this->_asynchronous) {
199 | return $this->_asyncAction;
200 | }
201 |
202 | // remove the resultLimit header if they set it
203 | $this->removeHeader('resultLimit');
204 |
205 | return $result;
206 | }
207 |
208 | /**
209 | * Create a SoftLayer API SOAP Client.
210 | *
211 | * Retrieve a new SoapClient object for a specific SoftLayer API service using either the class'
212 | * constants API_USER and API_KEY or a custom username and API key for authentication.
213 | * Provide an optional id value if you wish to instantiate a particular SoftLayer API object.
214 | *
215 | * @param string $serviceName The name of the SoftLayer API service you wish to query
216 | * @param int $id An optional object id if you're instantiating a particular SoftLayer API object. Setting an id defines this client's initialization parameter header.
217 | * @param string $username an optional API username if you wish to bypass SoapClient's built-in username
218 | * @param string $apiKey an optional API key if you wish to bypass SoapClient's built-in API key
219 | * @param string $endpointUrl The API endpoint base URL you wish to connect to. Set this to SoapClient::API_PRIVATE_ENDPOINT to connect via SoftLayer's private network.
220 | * @param bool $trace Enabled SOAP trace in the client object.
221 | * @return SoapClient
222 | */
223 | public static function getClient($serviceName, $id = null, $username = null, $apiKey = null, $endpointUrl = null, $trace = false)
224 | {
225 | $serviceName = trim($serviceName);
226 |
227 | if (empty($serviceName)) {
228 | throw new \Exception('Please provide a SoftLayer API service name.');
229 | }
230 |
231 | /*
232 | * Default to use the public network API endpoint, otherwise use the
233 | * endpoint defined in API_PUBLIC_ENDPOINT, otherwise use the one
234 | * provided by the user.
235 | */
236 | if (!empty($endpointUrl)) {
237 | $endpointUrl = trim($endpointUrl);
238 |
239 | if (empty($endpointUrl)) {
240 | throw new \Exception('Please provide a valid API endpoint.');
241 | }
242 | } elseif (self::API_BASE_URL !== null) {
243 | $endpointUrl = self::API_BASE_URL;
244 | } else {
245 | $endpointUrl = self::API_PUBLIC_ENDPOINT;
246 | }
247 |
248 | $soapOptions = ['trace' => $trace];
249 | if (is_null(self::SOAP_TIMEOUT) == false) {
250 | $soapOptions['connection_timeout'] = self::SOAP_TIMEOUT;
251 | }
252 |
253 | $soapClient = new self($endpointUrl . $serviceName . '?wsdl', $soapOptions);
254 |
255 |
256 | $soapClient->_serviceName = $serviceName;
257 | $soapClient->_endpointUrl = $endpointUrl;
258 |
259 | if (!empty($username) && !empty($apiKey)) {
260 | $soapClient->setAuthentication($username, $apiKey);
261 | } else {
262 | $soapClient->setAuthentication(self::API_USER, self::API_KEY);
263 | }
264 |
265 | if (!empty($id)) {
266 | $soapClient->setInitParameter($id);
267 | }
268 |
269 | return $soapClient;
270 | }
271 |
272 | /**
273 | * Set a SoftLayer API call header.
274 | *
275 | * Every header defines a customization specific to an SoftLayer API call.
276 | * Most API calls require authentication and initialization parameter
277 | * headers, but can also include optional headers such as object masks and
278 | * result limits if they're supported by the API method you're calling.
279 | *
280 | * @see removeHeader()
281 | *
282 | * @param string $name The name of the header you wish to set
283 | * @param object $value The object you wish to set in this header
284 | *
285 | * @return SoapClient
286 | */
287 | public function addHeader($name, $value)
288 | {
289 | $this->_headers[$name] = new \SoapHeader(self::DEFAULT_NAMESPACE, $name, $value);
290 |
291 | return $this;
292 | }
293 |
294 | /**
295 | * Remove a SoftLayer API call header.
296 | *
297 | * Removing headers may cause API queries to fail.
298 | *
299 | * @see addHeader()
300 | *
301 | * @param string $name The name of the header you wish to remove
302 | *
303 | * @return SoapClient
304 | */
305 | public function removeHeader($name)
306 | {
307 | unset($this->_headers[$name]);
308 |
309 | return $this;
310 | }
311 |
312 | /**
313 | * Set a user and key to authenticate a SoftLayer API call.
314 | *
315 | * Use this method if you wish to bypass the API_USER and API_KEY class
316 | * constants and set custom authentication per API call.
317 | *
318 | * @see https://sldn.softlayer.com/article/authenticating-softlayer-api/ API key management in the SoftLayer customer portal
319 | *
320 | * @param string $username
321 | * @param string $apiKey
322 | *
323 | * @return SoapClient
324 | */
325 | public function setAuthentication($username, $apiKey)
326 | {
327 | $username = trim($username);
328 |
329 | if (empty($username)) {
330 | throw new \Exception('Please provide a SoftLayer API username.');
331 | }
332 |
333 | $apiKey = trim($apiKey);
334 |
335 | if (empty($apiKey)) {
336 | throw new \Exception('Please provide a SoftLayer API key.');
337 | }
338 |
339 | $header = new \stdClass();
340 | $header->username = $username;
341 | $header->apiKey = $apiKey;
342 |
343 | $this->addHeader('authenticate', $header);
344 |
345 | return $this;
346 | }
347 |
348 | /**
349 | * Set an initialization parameter header on a SoftLayer API call.
350 | *
351 | * Initialization parameters instantiate a SoftLayer API service object to
352 | * act upon during your API method call. For instance, if your account has a
353 | * server with id number 1234, then setting an initialization parameter of
354 | * 1234 in the SoftLayer_Hardware_Server Service instructs the API to act on
355 | * server record 1234 in your method calls.
356 | *
357 | * @link https://sldn.softlayer.com/article/using-initialization-parameters-softlayer-api/ Using Initialization Parameters in the SoftLayer API
358 | * @param int $id The ID number of the SoftLayer API object you wish to instantiate.
359 |
360 | * @return SoapClient
361 | */
362 | public function setInitParameter($id)
363 | {
364 | $id = trim($id);
365 |
366 | if ($id !== '') {
367 | $initParameters = new \stdClass();
368 | $initParameters->id = $id;
369 | $this->addHeader($this->_serviceName.'InitParameters', $initParameters);
370 | }
371 |
372 | return $this;
373 | }
374 |
375 | /**
376 | * Set an object mask to a SoftLayer API call.
377 | *
378 | * Use an object mask to retrieve data related your API call's result.
379 | * Object masks are skeleton objects or strings that define nested relational
380 | * properties to retrieve along with an object's local properties.
381 | *
382 | * @see ObjectMask
383 | * @see http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayer-API Using object masks in the SoftLayer API
384 | *
385 | * @param object $mask The object mask you wish to define
386 | *
387 | * @return SoapClient
388 | */
389 | public function setObjectMask($mask)
390 | {
391 | if (!empty($mask)) {
392 | $header = 'SoftLayer_ObjectMask';
393 |
394 | if ($mask instanceof ObjectMask) {
395 | $header = sprintf('%sObjectMask', $this->_serviceName);
396 | }
397 |
398 | $objectMask = new \stdClass();
399 | $objectMask->mask = $mask;
400 | $this->addHeader($header, $objectMask);
401 | }
402 |
403 | return $this;
404 | }
405 |
406 | /**
407 | * Set an object filter to a SoftLayer API call.
408 | *
409 | * Use an object filter to limit what data you get back
410 | * from the API. Very similar to objectMasks
411 | *
412 | * @see ObjectMask
413 | *
414 | * @param object $objectFilter The object filter you wish to define
415 | *
416 | * @return SoapClient
417 | */
418 | public function setObjectFilter($objectFilter)
419 | {
420 | if (!empty($objectFilter)) {
421 | $header = sprintf('%sObjectFilter', $this->_serviceName);
422 | $this->addHeader($header, $objectFilter);
423 | }
424 |
425 | return $this;
426 | }
427 |
428 | /**
429 | * Set a result limit on a SoftLayer API call.
430 | *
431 | * Many SoftLayer API methods return a group of results. These methods
432 | * support a way to limit the number of results retrieved from the SoftLayer
433 | * API in a way akin to an SQL LIMIT statement.
434 | *
435 | * @link https://sldn.softlayer.com/article/using-result-limits-softlayer-api/ Using Result Limits in the SoftLayer API
436 | * @param int $limit The number of results to limit your SoftLayer API call to.
437 | * @param int $offset An optional offset to begin your SoftLayer API call's returned result set at.
438 |
439 | * @return SoapClient
440 | */
441 | public function setResultLimit($limit, $offset = 0)
442 | {
443 | $resultLimit = new \stdClass();
444 | $resultLimit->limit = (int) $limit;
445 | $resultLimit->offset = (int) $offset;
446 |
447 | $this->addHeader('resultLimit', $resultLimit);
448 |
449 | return $this;
450 | }
451 |
452 | /**
453 | * Process a SOAP request.
454 | *
455 | * We've overwritten the PHP \SoapClient's __doRequest() to allow processing
456 | * asynchronous SOAP calls. If an asynchronous call was detected in the
457 | * __call() method then send processing to the
458 | * AsynchronousAction class. Otherwise use the
459 | * \SoapClient's built-in __doRequest() method. The results of this method
460 | * are sent back to __call() for post-processing. Asynchronous calls use
461 | * handleAsyncResult() to send he results of the call back to __call().
462 | *
463 | * @return object
464 | */
465 | public function __doRequest($request, $location, $action, $version, $one_way = false)
466 | {
467 | // Don't make a call if we already have an asynchronous result.
468 | if ($this->_asyncResult !== null) {
469 | $result = $this->_asyncResult;
470 | $this->_asyncResult = null;
471 |
472 | return $result;
473 | }
474 |
475 | if ($this->oneWay) {
476 | $one_way = true;
477 | $this->oneWay = false;
478 | }
479 |
480 | // Use either the \SoapClient or AsynchronousAction
481 | // class to handle the call.
482 | if (!$this->_asynchronous) {
483 | $result = parent::__doRequest($request, $location, $action, $version, $one_way);
484 |
485 | return $result;
486 | }
487 |
488 | $this->_asyncAction = new AsynchronousAction($this, $this->asyncFunctionName, $request, $location, $action);
489 |
490 | return '';
491 | }
492 |
493 | /**
494 | * Process the results of an asynchronous call.
495 | *
496 | * The AsynchronousAction class uses
497 | * handleAsyncResult() to return it's call results back to this classes'
498 | * __call() method for post-processing.
499 | *
500 | * @param string $functionName the name of the SOAP method called
501 | * @param string $result The raw SOAP XML output from a SOAP call
502 | *
503 | * @return object
504 | */
505 | public function handleAsyncResult($functionName, $result)
506 | {
507 | $this->_asynchronous = false;
508 | $this->_asyncResult = $result;
509 |
510 | return $this->__call($functionName, array());
511 | }
512 |
513 | /**
514 | * Returns the headers set for this client object.
515 | *
516 | * @return array
517 | */
518 | public function getHeaders()
519 | {
520 | return $this->_headers;
521 | }
522 |
523 | /**
524 | * Returns the service name
525 | *
526 | * @return string
527 | */
528 | public function getServiceName()
529 | {
530 | return $this->_serviceName;
531 | }
532 |
533 | /**
534 | * Returns the endpoint URL
535 | *
536 | * @return string
537 | */
538 | public function getEndpointUrl()
539 | {
540 | return $this->_endpointUrl;
541 | }
542 | }
543 |
--------------------------------------------------------------------------------
/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": "f2d98d90d30ad338773dca755d7cdb02",
8 | "packages": [],
9 | "packages-dev": [
10 | {
11 | "name": "composer/pcre",
12 | "version": "3.0.0",
13 | "source": {
14 | "type": "git",
15 | "url": "https://github.com/composer/pcre.git",
16 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd"
17 | },
18 | "dist": {
19 | "type": "zip",
20 | "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd",
21 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd",
22 | "shasum": ""
23 | },
24 | "require": {
25 | "php": "^7.4 || ^8.0"
26 | },
27 | "require-dev": {
28 | "phpstan/phpstan": "^1.3",
29 | "phpstan/phpstan-strict-rules": "^1.1",
30 | "symfony/phpunit-bridge": "^5"
31 | },
32 | "type": "library",
33 | "extra": {
34 | "branch-alias": {
35 | "dev-main": "3.x-dev"
36 | }
37 | },
38 | "autoload": {
39 | "psr-4": {
40 | "Composer\\Pcre\\": "src"
41 | }
42 | },
43 | "notification-url": "https://packagist.org/downloads/",
44 | "license": [
45 | "MIT"
46 | ],
47 | "authors": [
48 | {
49 | "name": "Jordi Boggiano",
50 | "email": "j.boggiano@seld.be",
51 | "homepage": "http://seld.be"
52 | }
53 | ],
54 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
55 | "keywords": [
56 | "PCRE",
57 | "preg",
58 | "regex",
59 | "regular expression"
60 | ],
61 | "support": {
62 | "issues": "https://github.com/composer/pcre/issues",
63 | "source": "https://github.com/composer/pcre/tree/3.0.0"
64 | },
65 | "funding": [
66 | {
67 | "url": "https://packagist.com",
68 | "type": "custom"
69 | },
70 | {
71 | "url": "https://github.com/composer",
72 | "type": "github"
73 | },
74 | {
75 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
76 | "type": "tidelift"
77 | }
78 | ],
79 | "time": "2022-02-25T20:21:48+00:00"
80 | },
81 | {
82 | "name": "composer/semver",
83 | "version": "3.3.2",
84 | "source": {
85 | "type": "git",
86 | "url": "https://github.com/composer/semver.git",
87 | "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
88 | },
89 | "dist": {
90 | "type": "zip",
91 | "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
92 | "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
93 | "shasum": ""
94 | },
95 | "require": {
96 | "php": "^5.3.2 || ^7.0 || ^8.0"
97 | },
98 | "require-dev": {
99 | "phpstan/phpstan": "^1.4",
100 | "symfony/phpunit-bridge": "^4.2 || ^5"
101 | },
102 | "type": "library",
103 | "extra": {
104 | "branch-alias": {
105 | "dev-main": "3.x-dev"
106 | }
107 | },
108 | "autoload": {
109 | "psr-4": {
110 | "Composer\\Semver\\": "src"
111 | }
112 | },
113 | "notification-url": "https://packagist.org/downloads/",
114 | "license": [
115 | "MIT"
116 | ],
117 | "authors": [
118 | {
119 | "name": "Nils Adermann",
120 | "email": "naderman@naderman.de",
121 | "homepage": "http://www.naderman.de"
122 | },
123 | {
124 | "name": "Jordi Boggiano",
125 | "email": "j.boggiano@seld.be",
126 | "homepage": "http://seld.be"
127 | },
128 | {
129 | "name": "Rob Bast",
130 | "email": "rob.bast@gmail.com",
131 | "homepage": "http://robbast.nl"
132 | }
133 | ],
134 | "description": "Semver library that offers utilities, version constraint parsing and validation.",
135 | "keywords": [
136 | "semantic",
137 | "semver",
138 | "validation",
139 | "versioning"
140 | ],
141 | "support": {
142 | "irc": "irc://irc.freenode.org/composer",
143 | "issues": "https://github.com/composer/semver/issues",
144 | "source": "https://github.com/composer/semver/tree/3.3.2"
145 | },
146 | "funding": [
147 | {
148 | "url": "https://packagist.com",
149 | "type": "custom"
150 | },
151 | {
152 | "url": "https://github.com/composer",
153 | "type": "github"
154 | },
155 | {
156 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
157 | "type": "tidelift"
158 | }
159 | ],
160 | "time": "2022-04-01T19:23:25+00:00"
161 | },
162 | {
163 | "name": "composer/xdebug-handler",
164 | "version": "3.0.3",
165 | "source": {
166 | "type": "git",
167 | "url": "https://github.com/composer/xdebug-handler.git",
168 | "reference": "ced299686f41dce890debac69273b47ffe98a40c"
169 | },
170 | "dist": {
171 | "type": "zip",
172 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
173 | "reference": "ced299686f41dce890debac69273b47ffe98a40c",
174 | "shasum": ""
175 | },
176 | "require": {
177 | "composer/pcre": "^1 || ^2 || ^3",
178 | "php": "^7.2.5 || ^8.0",
179 | "psr/log": "^1 || ^2 || ^3"
180 | },
181 | "require-dev": {
182 | "phpstan/phpstan": "^1.0",
183 | "phpstan/phpstan-strict-rules": "^1.1",
184 | "symfony/phpunit-bridge": "^6.0"
185 | },
186 | "type": "library",
187 | "autoload": {
188 | "psr-4": {
189 | "Composer\\XdebugHandler\\": "src"
190 | }
191 | },
192 | "notification-url": "https://packagist.org/downloads/",
193 | "license": [
194 | "MIT"
195 | ],
196 | "authors": [
197 | {
198 | "name": "John Stevenson",
199 | "email": "john-stevenson@blueyonder.co.uk"
200 | }
201 | ],
202 | "description": "Restarts a process without Xdebug.",
203 | "keywords": [
204 | "Xdebug",
205 | "performance"
206 | ],
207 | "support": {
208 | "irc": "irc://irc.freenode.org/composer",
209 | "issues": "https://github.com/composer/xdebug-handler/issues",
210 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
211 | },
212 | "funding": [
213 | {
214 | "url": "https://packagist.com",
215 | "type": "custom"
216 | },
217 | {
218 | "url": "https://github.com/composer",
219 | "type": "github"
220 | },
221 | {
222 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
223 | "type": "tidelift"
224 | }
225 | ],
226 | "time": "2022-02-25T21:32:43+00:00"
227 | },
228 | {
229 | "name": "doctrine/annotations",
230 | "version": "1.13.3",
231 | "source": {
232 | "type": "git",
233 | "url": "https://github.com/doctrine/annotations.git",
234 | "reference": "648b0343343565c4a056bfc8392201385e8d89f0"
235 | },
236 | "dist": {
237 | "type": "zip",
238 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0",
239 | "reference": "648b0343343565c4a056bfc8392201385e8d89f0",
240 | "shasum": ""
241 | },
242 | "require": {
243 | "doctrine/lexer": "1.*",
244 | "ext-tokenizer": "*",
245 | "php": "^7.1 || ^8.0",
246 | "psr/cache": "^1 || ^2 || ^3"
247 | },
248 | "require-dev": {
249 | "doctrine/cache": "^1.11 || ^2.0",
250 | "doctrine/coding-standard": "^6.0 || ^8.1",
251 | "phpstan/phpstan": "^1.4.10 || ^1.8.0",
252 | "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
253 | "symfony/cache": "^4.4 || ^5.2",
254 | "vimeo/psalm": "^4.10"
255 | },
256 | "type": "library",
257 | "autoload": {
258 | "psr-4": {
259 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
260 | }
261 | },
262 | "notification-url": "https://packagist.org/downloads/",
263 | "license": [
264 | "MIT"
265 | ],
266 | "authors": [
267 | {
268 | "name": "Guilherme Blanco",
269 | "email": "guilhermeblanco@gmail.com"
270 | },
271 | {
272 | "name": "Roman Borschel",
273 | "email": "roman@code-factory.org"
274 | },
275 | {
276 | "name": "Benjamin Eberlei",
277 | "email": "kontakt@beberlei.de"
278 | },
279 | {
280 | "name": "Jonathan Wage",
281 | "email": "jonwage@gmail.com"
282 | },
283 | {
284 | "name": "Johannes Schmitt",
285 | "email": "schmittjoh@gmail.com"
286 | }
287 | ],
288 | "description": "Docblock Annotations Parser",
289 | "homepage": "https://www.doctrine-project.org/projects/annotations.html",
290 | "keywords": [
291 | "annotations",
292 | "docblock",
293 | "parser"
294 | ],
295 | "support": {
296 | "issues": "https://github.com/doctrine/annotations/issues",
297 | "source": "https://github.com/doctrine/annotations/tree/1.13.3"
298 | },
299 | "time": "2022-07-02T10:48:51+00:00"
300 | },
301 | {
302 | "name": "doctrine/instantiator",
303 | "version": "1.4.1",
304 | "source": {
305 | "type": "git",
306 | "url": "https://github.com/doctrine/instantiator.git",
307 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
308 | },
309 | "dist": {
310 | "type": "zip",
311 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
312 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
313 | "shasum": ""
314 | },
315 | "require": {
316 | "php": "^7.1 || ^8.0"
317 | },
318 | "require-dev": {
319 | "doctrine/coding-standard": "^9",
320 | "ext-pdo": "*",
321 | "ext-phar": "*",
322 | "phpbench/phpbench": "^0.16 || ^1",
323 | "phpstan/phpstan": "^1.4",
324 | "phpstan/phpstan-phpunit": "^1",
325 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
326 | "vimeo/psalm": "^4.22"
327 | },
328 | "type": "library",
329 | "autoload": {
330 | "psr-4": {
331 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
332 | }
333 | },
334 | "notification-url": "https://packagist.org/downloads/",
335 | "license": [
336 | "MIT"
337 | ],
338 | "authors": [
339 | {
340 | "name": "Marco Pivetta",
341 | "email": "ocramius@gmail.com",
342 | "homepage": "https://ocramius.github.io/"
343 | }
344 | ],
345 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
346 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
347 | "keywords": [
348 | "constructor",
349 | "instantiate"
350 | ],
351 | "support": {
352 | "issues": "https://github.com/doctrine/instantiator/issues",
353 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
354 | },
355 | "funding": [
356 | {
357 | "url": "https://www.doctrine-project.org/sponsorship.html",
358 | "type": "custom"
359 | },
360 | {
361 | "url": "https://www.patreon.com/phpdoctrine",
362 | "type": "patreon"
363 | },
364 | {
365 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
366 | "type": "tidelift"
367 | }
368 | ],
369 | "time": "2022-03-03T08:28:38+00:00"
370 | },
371 | {
372 | "name": "doctrine/lexer",
373 | "version": "1.2.3",
374 | "source": {
375 | "type": "git",
376 | "url": "https://github.com/doctrine/lexer.git",
377 | "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
378 | },
379 | "dist": {
380 | "type": "zip",
381 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
382 | "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
383 | "shasum": ""
384 | },
385 | "require": {
386 | "php": "^7.1 || ^8.0"
387 | },
388 | "require-dev": {
389 | "doctrine/coding-standard": "^9.0",
390 | "phpstan/phpstan": "^1.3",
391 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
392 | "vimeo/psalm": "^4.11"
393 | },
394 | "type": "library",
395 | "autoload": {
396 | "psr-4": {
397 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
398 | }
399 | },
400 | "notification-url": "https://packagist.org/downloads/",
401 | "license": [
402 | "MIT"
403 | ],
404 | "authors": [
405 | {
406 | "name": "Guilherme Blanco",
407 | "email": "guilhermeblanco@gmail.com"
408 | },
409 | {
410 | "name": "Roman Borschel",
411 | "email": "roman@code-factory.org"
412 | },
413 | {
414 | "name": "Johannes Schmitt",
415 | "email": "schmittjoh@gmail.com"
416 | }
417 | ],
418 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
419 | "homepage": "https://www.doctrine-project.org/projects/lexer.html",
420 | "keywords": [
421 | "annotations",
422 | "docblock",
423 | "lexer",
424 | "parser",
425 | "php"
426 | ],
427 | "support": {
428 | "issues": "https://github.com/doctrine/lexer/issues",
429 | "source": "https://github.com/doctrine/lexer/tree/1.2.3"
430 | },
431 | "funding": [
432 | {
433 | "url": "https://www.doctrine-project.org/sponsorship.html",
434 | "type": "custom"
435 | },
436 | {
437 | "url": "https://www.patreon.com/phpdoctrine",
438 | "type": "patreon"
439 | },
440 | {
441 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
442 | "type": "tidelift"
443 | }
444 | ],
445 | "time": "2022-02-28T11:07:21+00:00"
446 | },
447 | {
448 | "name": "friendsofphp/php-cs-fixer",
449 | "version": "v3.13.0",
450 | "source": {
451 | "type": "git",
452 | "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
453 | "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1"
454 | },
455 | "dist": {
456 | "type": "zip",
457 | "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1",
458 | "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1",
459 | "shasum": ""
460 | },
461 | "require": {
462 | "composer/semver": "^3.2",
463 | "composer/xdebug-handler": "^3.0.3",
464 | "doctrine/annotations": "^1.13",
465 | "ext-json": "*",
466 | "ext-tokenizer": "*",
467 | "php": "^7.4 || ^8.0",
468 | "sebastian/diff": "^4.0",
469 | "symfony/console": "^5.4 || ^6.0",
470 | "symfony/event-dispatcher": "^5.4 || ^6.0",
471 | "symfony/filesystem": "^5.4 || ^6.0",
472 | "symfony/finder": "^5.4 || ^6.0",
473 | "symfony/options-resolver": "^5.4 || ^6.0",
474 | "symfony/polyfill-mbstring": "^1.23",
475 | "symfony/polyfill-php80": "^1.25",
476 | "symfony/polyfill-php81": "^1.25",
477 | "symfony/process": "^5.4 || ^6.0",
478 | "symfony/stopwatch": "^5.4 || ^6.0"
479 | },
480 | "require-dev": {
481 | "justinrainbow/json-schema": "^5.2",
482 | "keradus/cli-executor": "^2.0",
483 | "mikey179/vfsstream": "^1.6.10",
484 | "php-coveralls/php-coveralls": "^2.5.2",
485 | "php-cs-fixer/accessible-object": "^1.1",
486 | "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
487 | "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
488 | "phpspec/prophecy": "^1.15",
489 | "phpspec/prophecy-phpunit": "^2.0",
490 | "phpunit/phpunit": "^9.5",
491 | "phpunitgoodpractices/polyfill": "^1.6",
492 | "phpunitgoodpractices/traits": "^1.9.2",
493 | "symfony/phpunit-bridge": "^6.0",
494 | "symfony/yaml": "^5.4 || ^6.0"
495 | },
496 | "suggest": {
497 | "ext-dom": "For handling output formats in XML",
498 | "ext-mbstring": "For handling non-UTF8 characters."
499 | },
500 | "bin": [
501 | "php-cs-fixer"
502 | ],
503 | "type": "application",
504 | "autoload": {
505 | "psr-4": {
506 | "PhpCsFixer\\": "src/"
507 | }
508 | },
509 | "notification-url": "https://packagist.org/downloads/",
510 | "license": [
511 | "MIT"
512 | ],
513 | "authors": [
514 | {
515 | "name": "Fabien Potencier",
516 | "email": "fabien@symfony.com"
517 | },
518 | {
519 | "name": "Dariusz Rumiński",
520 | "email": "dariusz.ruminski@gmail.com"
521 | }
522 | ],
523 | "description": "A tool to automatically fix PHP code style",
524 | "support": {
525 | "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
526 | "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0"
527 | },
528 | "funding": [
529 | {
530 | "url": "https://github.com/keradus",
531 | "type": "github"
532 | }
533 | ],
534 | "time": "2022-10-31T19:28:50+00:00"
535 | },
536 | {
537 | "name": "myclabs/deep-copy",
538 | "version": "1.11.0",
539 | "source": {
540 | "type": "git",
541 | "url": "https://github.com/myclabs/DeepCopy.git",
542 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
543 | },
544 | "dist": {
545 | "type": "zip",
546 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
547 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
548 | "shasum": ""
549 | },
550 | "require": {
551 | "php": "^7.1 || ^8.0"
552 | },
553 | "conflict": {
554 | "doctrine/collections": "<1.6.8",
555 | "doctrine/common": "<2.13.3 || >=3,<3.2.2"
556 | },
557 | "require-dev": {
558 | "doctrine/collections": "^1.6.8",
559 | "doctrine/common": "^2.13.3 || ^3.2.2",
560 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
561 | },
562 | "type": "library",
563 | "autoload": {
564 | "files": [
565 | "src/DeepCopy/deep_copy.php"
566 | ],
567 | "psr-4": {
568 | "DeepCopy\\": "src/DeepCopy/"
569 | }
570 | },
571 | "notification-url": "https://packagist.org/downloads/",
572 | "license": [
573 | "MIT"
574 | ],
575 | "description": "Create deep copies (clones) of your objects",
576 | "keywords": [
577 | "clone",
578 | "copy",
579 | "duplicate",
580 | "object",
581 | "object graph"
582 | ],
583 | "support": {
584 | "issues": "https://github.com/myclabs/DeepCopy/issues",
585 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
586 | },
587 | "funding": [
588 | {
589 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
590 | "type": "tidelift"
591 | }
592 | ],
593 | "time": "2022-03-03T13:19:32+00:00"
594 | },
595 | {
596 | "name": "nikic/php-parser",
597 | "version": "v4.15.1",
598 | "source": {
599 | "type": "git",
600 | "url": "https://github.com/nikic/PHP-Parser.git",
601 | "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
602 | },
603 | "dist": {
604 | "type": "zip",
605 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
606 | "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
607 | "shasum": ""
608 | },
609 | "require": {
610 | "ext-tokenizer": "*",
611 | "php": ">=7.0"
612 | },
613 | "require-dev": {
614 | "ircmaxell/php-yacc": "^0.0.7",
615 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
616 | },
617 | "bin": [
618 | "bin/php-parse"
619 | ],
620 | "type": "library",
621 | "extra": {
622 | "branch-alias": {
623 | "dev-master": "4.9-dev"
624 | }
625 | },
626 | "autoload": {
627 | "psr-4": {
628 | "PhpParser\\": "lib/PhpParser"
629 | }
630 | },
631 | "notification-url": "https://packagist.org/downloads/",
632 | "license": [
633 | "BSD-3-Clause"
634 | ],
635 | "authors": [
636 | {
637 | "name": "Nikita Popov"
638 | }
639 | ],
640 | "description": "A PHP parser written in PHP",
641 | "keywords": [
642 | "parser",
643 | "php"
644 | ],
645 | "support": {
646 | "issues": "https://github.com/nikic/PHP-Parser/issues",
647 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
648 | },
649 | "time": "2022-09-04T07:30:47+00:00"
650 | },
651 | {
652 | "name": "phar-io/manifest",
653 | "version": "2.0.3",
654 | "source": {
655 | "type": "git",
656 | "url": "https://github.com/phar-io/manifest.git",
657 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
658 | },
659 | "dist": {
660 | "type": "zip",
661 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
662 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
663 | "shasum": ""
664 | },
665 | "require": {
666 | "ext-dom": "*",
667 | "ext-phar": "*",
668 | "ext-xmlwriter": "*",
669 | "phar-io/version": "^3.0.1",
670 | "php": "^7.2 || ^8.0"
671 | },
672 | "type": "library",
673 | "extra": {
674 | "branch-alias": {
675 | "dev-master": "2.0.x-dev"
676 | }
677 | },
678 | "autoload": {
679 | "classmap": [
680 | "src/"
681 | ]
682 | },
683 | "notification-url": "https://packagist.org/downloads/",
684 | "license": [
685 | "BSD-3-Clause"
686 | ],
687 | "authors": [
688 | {
689 | "name": "Arne Blankerts",
690 | "email": "arne@blankerts.de",
691 | "role": "Developer"
692 | },
693 | {
694 | "name": "Sebastian Heuer",
695 | "email": "sebastian@phpeople.de",
696 | "role": "Developer"
697 | },
698 | {
699 | "name": "Sebastian Bergmann",
700 | "email": "sebastian@phpunit.de",
701 | "role": "Developer"
702 | }
703 | ],
704 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
705 | "support": {
706 | "issues": "https://github.com/phar-io/manifest/issues",
707 | "source": "https://github.com/phar-io/manifest/tree/2.0.3"
708 | },
709 | "time": "2021-07-20T11:28:43+00:00"
710 | },
711 | {
712 | "name": "phar-io/version",
713 | "version": "3.2.1",
714 | "source": {
715 | "type": "git",
716 | "url": "https://github.com/phar-io/version.git",
717 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
718 | },
719 | "dist": {
720 | "type": "zip",
721 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
722 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
723 | "shasum": ""
724 | },
725 | "require": {
726 | "php": "^7.2 || ^8.0"
727 | },
728 | "type": "library",
729 | "autoload": {
730 | "classmap": [
731 | "src/"
732 | ]
733 | },
734 | "notification-url": "https://packagist.org/downloads/",
735 | "license": [
736 | "BSD-3-Clause"
737 | ],
738 | "authors": [
739 | {
740 | "name": "Arne Blankerts",
741 | "email": "arne@blankerts.de",
742 | "role": "Developer"
743 | },
744 | {
745 | "name": "Sebastian Heuer",
746 | "email": "sebastian@phpeople.de",
747 | "role": "Developer"
748 | },
749 | {
750 | "name": "Sebastian Bergmann",
751 | "email": "sebastian@phpunit.de",
752 | "role": "Developer"
753 | }
754 | ],
755 | "description": "Library for handling version information and constraints",
756 | "support": {
757 | "issues": "https://github.com/phar-io/version/issues",
758 | "source": "https://github.com/phar-io/version/tree/3.2.1"
759 | },
760 | "time": "2022-02-21T01:04:05+00:00"
761 | },
762 | {
763 | "name": "phpunit/php-code-coverage",
764 | "version": "9.2.18",
765 | "source": {
766 | "type": "git",
767 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
768 | "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a"
769 | },
770 | "dist": {
771 | "type": "zip",
772 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a",
773 | "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a",
774 | "shasum": ""
775 | },
776 | "require": {
777 | "ext-dom": "*",
778 | "ext-libxml": "*",
779 | "ext-xmlwriter": "*",
780 | "nikic/php-parser": "^4.14",
781 | "php": ">=7.3",
782 | "phpunit/php-file-iterator": "^3.0.3",
783 | "phpunit/php-text-template": "^2.0.2",
784 | "sebastian/code-unit-reverse-lookup": "^2.0.2",
785 | "sebastian/complexity": "^2.0",
786 | "sebastian/environment": "^5.1.2",
787 | "sebastian/lines-of-code": "^1.0.3",
788 | "sebastian/version": "^3.0.1",
789 | "theseer/tokenizer": "^1.2.0"
790 | },
791 | "require-dev": {
792 | "phpunit/phpunit": "^9.3"
793 | },
794 | "suggest": {
795 | "ext-pcov": "*",
796 | "ext-xdebug": "*"
797 | },
798 | "type": "library",
799 | "extra": {
800 | "branch-alias": {
801 | "dev-master": "9.2-dev"
802 | }
803 | },
804 | "autoload": {
805 | "classmap": [
806 | "src/"
807 | ]
808 | },
809 | "notification-url": "https://packagist.org/downloads/",
810 | "license": [
811 | "BSD-3-Clause"
812 | ],
813 | "authors": [
814 | {
815 | "name": "Sebastian Bergmann",
816 | "email": "sebastian@phpunit.de",
817 | "role": "lead"
818 | }
819 | ],
820 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
821 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
822 | "keywords": [
823 | "coverage",
824 | "testing",
825 | "xunit"
826 | ],
827 | "support": {
828 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
829 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18"
830 | },
831 | "funding": [
832 | {
833 | "url": "https://github.com/sebastianbergmann",
834 | "type": "github"
835 | }
836 | ],
837 | "time": "2022-10-27T13:35:33+00:00"
838 | },
839 | {
840 | "name": "phpunit/php-file-iterator",
841 | "version": "3.0.6",
842 | "source": {
843 | "type": "git",
844 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
845 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
846 | },
847 | "dist": {
848 | "type": "zip",
849 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
850 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
851 | "shasum": ""
852 | },
853 | "require": {
854 | "php": ">=7.3"
855 | },
856 | "require-dev": {
857 | "phpunit/phpunit": "^9.3"
858 | },
859 | "type": "library",
860 | "extra": {
861 | "branch-alias": {
862 | "dev-master": "3.0-dev"
863 | }
864 | },
865 | "autoload": {
866 | "classmap": [
867 | "src/"
868 | ]
869 | },
870 | "notification-url": "https://packagist.org/downloads/",
871 | "license": [
872 | "BSD-3-Clause"
873 | ],
874 | "authors": [
875 | {
876 | "name": "Sebastian Bergmann",
877 | "email": "sebastian@phpunit.de",
878 | "role": "lead"
879 | }
880 | ],
881 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
882 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
883 | "keywords": [
884 | "filesystem",
885 | "iterator"
886 | ],
887 | "support": {
888 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
889 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
890 | },
891 | "funding": [
892 | {
893 | "url": "https://github.com/sebastianbergmann",
894 | "type": "github"
895 | }
896 | ],
897 | "time": "2021-12-02T12:48:52+00:00"
898 | },
899 | {
900 | "name": "phpunit/php-invoker",
901 | "version": "3.1.1",
902 | "source": {
903 | "type": "git",
904 | "url": "https://github.com/sebastianbergmann/php-invoker.git",
905 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
906 | },
907 | "dist": {
908 | "type": "zip",
909 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
910 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
911 | "shasum": ""
912 | },
913 | "require": {
914 | "php": ">=7.3"
915 | },
916 | "require-dev": {
917 | "ext-pcntl": "*",
918 | "phpunit/phpunit": "^9.3"
919 | },
920 | "suggest": {
921 | "ext-pcntl": "*"
922 | },
923 | "type": "library",
924 | "extra": {
925 | "branch-alias": {
926 | "dev-master": "3.1-dev"
927 | }
928 | },
929 | "autoload": {
930 | "classmap": [
931 | "src/"
932 | ]
933 | },
934 | "notification-url": "https://packagist.org/downloads/",
935 | "license": [
936 | "BSD-3-Clause"
937 | ],
938 | "authors": [
939 | {
940 | "name": "Sebastian Bergmann",
941 | "email": "sebastian@phpunit.de",
942 | "role": "lead"
943 | }
944 | ],
945 | "description": "Invoke callables with a timeout",
946 | "homepage": "https://github.com/sebastianbergmann/php-invoker/",
947 | "keywords": [
948 | "process"
949 | ],
950 | "support": {
951 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
952 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
953 | },
954 | "funding": [
955 | {
956 | "url": "https://github.com/sebastianbergmann",
957 | "type": "github"
958 | }
959 | ],
960 | "time": "2020-09-28T05:58:55+00:00"
961 | },
962 | {
963 | "name": "phpunit/php-text-template",
964 | "version": "2.0.4",
965 | "source": {
966 | "type": "git",
967 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
968 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
969 | },
970 | "dist": {
971 | "type": "zip",
972 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
973 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
974 | "shasum": ""
975 | },
976 | "require": {
977 | "php": ">=7.3"
978 | },
979 | "require-dev": {
980 | "phpunit/phpunit": "^9.3"
981 | },
982 | "type": "library",
983 | "extra": {
984 | "branch-alias": {
985 | "dev-master": "2.0-dev"
986 | }
987 | },
988 | "autoload": {
989 | "classmap": [
990 | "src/"
991 | ]
992 | },
993 | "notification-url": "https://packagist.org/downloads/",
994 | "license": [
995 | "BSD-3-Clause"
996 | ],
997 | "authors": [
998 | {
999 | "name": "Sebastian Bergmann",
1000 | "email": "sebastian@phpunit.de",
1001 | "role": "lead"
1002 | }
1003 | ],
1004 | "description": "Simple template engine.",
1005 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1006 | "keywords": [
1007 | "template"
1008 | ],
1009 | "support": {
1010 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
1011 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
1012 | },
1013 | "funding": [
1014 | {
1015 | "url": "https://github.com/sebastianbergmann",
1016 | "type": "github"
1017 | }
1018 | ],
1019 | "time": "2020-10-26T05:33:50+00:00"
1020 | },
1021 | {
1022 | "name": "phpunit/php-timer",
1023 | "version": "5.0.3",
1024 | "source": {
1025 | "type": "git",
1026 | "url": "https://github.com/sebastianbergmann/php-timer.git",
1027 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
1028 | },
1029 | "dist": {
1030 | "type": "zip",
1031 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1032 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
1033 | "shasum": ""
1034 | },
1035 | "require": {
1036 | "php": ">=7.3"
1037 | },
1038 | "require-dev": {
1039 | "phpunit/phpunit": "^9.3"
1040 | },
1041 | "type": "library",
1042 | "extra": {
1043 | "branch-alias": {
1044 | "dev-master": "5.0-dev"
1045 | }
1046 | },
1047 | "autoload": {
1048 | "classmap": [
1049 | "src/"
1050 | ]
1051 | },
1052 | "notification-url": "https://packagist.org/downloads/",
1053 | "license": [
1054 | "BSD-3-Clause"
1055 | ],
1056 | "authors": [
1057 | {
1058 | "name": "Sebastian Bergmann",
1059 | "email": "sebastian@phpunit.de",
1060 | "role": "lead"
1061 | }
1062 | ],
1063 | "description": "Utility class for timing",
1064 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
1065 | "keywords": [
1066 | "timer"
1067 | ],
1068 | "support": {
1069 | "issues": "https://github.com/sebastianbergmann/php-timer/issues",
1070 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
1071 | },
1072 | "funding": [
1073 | {
1074 | "url": "https://github.com/sebastianbergmann",
1075 | "type": "github"
1076 | }
1077 | ],
1078 | "time": "2020-10-26T13:16:10+00:00"
1079 | },
1080 | {
1081 | "name": "phpunit/phpunit",
1082 | "version": "9.5.26",
1083 | "source": {
1084 | "type": "git",
1085 | "url": "https://github.com/sebastianbergmann/phpunit.git",
1086 | "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2"
1087 | },
1088 | "dist": {
1089 | "type": "zip",
1090 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2",
1091 | "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2",
1092 | "shasum": ""
1093 | },
1094 | "require": {
1095 | "doctrine/instantiator": "^1.3.1",
1096 | "ext-dom": "*",
1097 | "ext-json": "*",
1098 | "ext-libxml": "*",
1099 | "ext-mbstring": "*",
1100 | "ext-xml": "*",
1101 | "ext-xmlwriter": "*",
1102 | "myclabs/deep-copy": "^1.10.1",
1103 | "phar-io/manifest": "^2.0.3",
1104 | "phar-io/version": "^3.0.2",
1105 | "php": ">=7.3",
1106 | "phpunit/php-code-coverage": "^9.2.13",
1107 | "phpunit/php-file-iterator": "^3.0.5",
1108 | "phpunit/php-invoker": "^3.1.1",
1109 | "phpunit/php-text-template": "^2.0.3",
1110 | "phpunit/php-timer": "^5.0.2",
1111 | "sebastian/cli-parser": "^1.0.1",
1112 | "sebastian/code-unit": "^1.0.6",
1113 | "sebastian/comparator": "^4.0.8",
1114 | "sebastian/diff": "^4.0.3",
1115 | "sebastian/environment": "^5.1.3",
1116 | "sebastian/exporter": "^4.0.5",
1117 | "sebastian/global-state": "^5.0.1",
1118 | "sebastian/object-enumerator": "^4.0.3",
1119 | "sebastian/resource-operations": "^3.0.3",
1120 | "sebastian/type": "^3.2",
1121 | "sebastian/version": "^3.0.2"
1122 | },
1123 | "suggest": {
1124 | "ext-soap": "*",
1125 | "ext-xdebug": "*"
1126 | },
1127 | "bin": [
1128 | "phpunit"
1129 | ],
1130 | "type": "library",
1131 | "extra": {
1132 | "branch-alias": {
1133 | "dev-master": "9.5-dev"
1134 | }
1135 | },
1136 | "autoload": {
1137 | "files": [
1138 | "src/Framework/Assert/Functions.php"
1139 | ],
1140 | "classmap": [
1141 | "src/"
1142 | ]
1143 | },
1144 | "notification-url": "https://packagist.org/downloads/",
1145 | "license": [
1146 | "BSD-3-Clause"
1147 | ],
1148 | "authors": [
1149 | {
1150 | "name": "Sebastian Bergmann",
1151 | "email": "sebastian@phpunit.de",
1152 | "role": "lead"
1153 | }
1154 | ],
1155 | "description": "The PHP Unit Testing framework.",
1156 | "homepage": "https://phpunit.de/",
1157 | "keywords": [
1158 | "phpunit",
1159 | "testing",
1160 | "xunit"
1161 | ],
1162 | "support": {
1163 | "issues": "https://github.com/sebastianbergmann/phpunit/issues",
1164 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26"
1165 | },
1166 | "funding": [
1167 | {
1168 | "url": "https://phpunit.de/sponsors.html",
1169 | "type": "custom"
1170 | },
1171 | {
1172 | "url": "https://github.com/sebastianbergmann",
1173 | "type": "github"
1174 | },
1175 | {
1176 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
1177 | "type": "tidelift"
1178 | }
1179 | ],
1180 | "time": "2022-10-28T06:00:21+00:00"
1181 | },
1182 | {
1183 | "name": "psr/cache",
1184 | "version": "3.0.0",
1185 | "source": {
1186 | "type": "git",
1187 | "url": "https://github.com/php-fig/cache.git",
1188 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
1189 | },
1190 | "dist": {
1191 | "type": "zip",
1192 | "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
1193 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
1194 | "shasum": ""
1195 | },
1196 | "require": {
1197 | "php": ">=8.0.0"
1198 | },
1199 | "type": "library",
1200 | "extra": {
1201 | "branch-alias": {
1202 | "dev-master": "1.0.x-dev"
1203 | }
1204 | },
1205 | "autoload": {
1206 | "psr-4": {
1207 | "Psr\\Cache\\": "src/"
1208 | }
1209 | },
1210 | "notification-url": "https://packagist.org/downloads/",
1211 | "license": [
1212 | "MIT"
1213 | ],
1214 | "authors": [
1215 | {
1216 | "name": "PHP-FIG",
1217 | "homepage": "https://www.php-fig.org/"
1218 | }
1219 | ],
1220 | "description": "Common interface for caching libraries",
1221 | "keywords": [
1222 | "cache",
1223 | "psr",
1224 | "psr-6"
1225 | ],
1226 | "support": {
1227 | "source": "https://github.com/php-fig/cache/tree/3.0.0"
1228 | },
1229 | "time": "2021-02-03T23:26:27+00:00"
1230 | },
1231 | {
1232 | "name": "psr/container",
1233 | "version": "2.0.2",
1234 | "source": {
1235 | "type": "git",
1236 | "url": "https://github.com/php-fig/container.git",
1237 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
1238 | },
1239 | "dist": {
1240 | "type": "zip",
1241 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
1242 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
1243 | "shasum": ""
1244 | },
1245 | "require": {
1246 | "php": ">=7.4.0"
1247 | },
1248 | "type": "library",
1249 | "extra": {
1250 | "branch-alias": {
1251 | "dev-master": "2.0.x-dev"
1252 | }
1253 | },
1254 | "autoload": {
1255 | "psr-4": {
1256 | "Psr\\Container\\": "src/"
1257 | }
1258 | },
1259 | "notification-url": "https://packagist.org/downloads/",
1260 | "license": [
1261 | "MIT"
1262 | ],
1263 | "authors": [
1264 | {
1265 | "name": "PHP-FIG",
1266 | "homepage": "https://www.php-fig.org/"
1267 | }
1268 | ],
1269 | "description": "Common Container Interface (PHP FIG PSR-11)",
1270 | "homepage": "https://github.com/php-fig/container",
1271 | "keywords": [
1272 | "PSR-11",
1273 | "container",
1274 | "container-interface",
1275 | "container-interop",
1276 | "psr"
1277 | ],
1278 | "support": {
1279 | "issues": "https://github.com/php-fig/container/issues",
1280 | "source": "https://github.com/php-fig/container/tree/2.0.2"
1281 | },
1282 | "time": "2021-11-05T16:47:00+00:00"
1283 | },
1284 | {
1285 | "name": "psr/event-dispatcher",
1286 | "version": "1.0.0",
1287 | "source": {
1288 | "type": "git",
1289 | "url": "https://github.com/php-fig/event-dispatcher.git",
1290 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
1291 | },
1292 | "dist": {
1293 | "type": "zip",
1294 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
1295 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
1296 | "shasum": ""
1297 | },
1298 | "require": {
1299 | "php": ">=7.2.0"
1300 | },
1301 | "type": "library",
1302 | "extra": {
1303 | "branch-alias": {
1304 | "dev-master": "1.0.x-dev"
1305 | }
1306 | },
1307 | "autoload": {
1308 | "psr-4": {
1309 | "Psr\\EventDispatcher\\": "src/"
1310 | }
1311 | },
1312 | "notification-url": "https://packagist.org/downloads/",
1313 | "license": [
1314 | "MIT"
1315 | ],
1316 | "authors": [
1317 | {
1318 | "name": "PHP-FIG",
1319 | "homepage": "http://www.php-fig.org/"
1320 | }
1321 | ],
1322 | "description": "Standard interfaces for event handling.",
1323 | "keywords": [
1324 | "events",
1325 | "psr",
1326 | "psr-14"
1327 | ],
1328 | "support": {
1329 | "issues": "https://github.com/php-fig/event-dispatcher/issues",
1330 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
1331 | },
1332 | "time": "2019-01-08T18:20:26+00:00"
1333 | },
1334 | {
1335 | "name": "psr/log",
1336 | "version": "3.0.0",
1337 | "source": {
1338 | "type": "git",
1339 | "url": "https://github.com/php-fig/log.git",
1340 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
1341 | },
1342 | "dist": {
1343 | "type": "zip",
1344 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
1345 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
1346 | "shasum": ""
1347 | },
1348 | "require": {
1349 | "php": ">=8.0.0"
1350 | },
1351 | "type": "library",
1352 | "extra": {
1353 | "branch-alias": {
1354 | "dev-master": "3.x-dev"
1355 | }
1356 | },
1357 | "autoload": {
1358 | "psr-4": {
1359 | "Psr\\Log\\": "src"
1360 | }
1361 | },
1362 | "notification-url": "https://packagist.org/downloads/",
1363 | "license": [
1364 | "MIT"
1365 | ],
1366 | "authors": [
1367 | {
1368 | "name": "PHP-FIG",
1369 | "homepage": "https://www.php-fig.org/"
1370 | }
1371 | ],
1372 | "description": "Common interface for logging libraries",
1373 | "homepage": "https://github.com/php-fig/log",
1374 | "keywords": [
1375 | "log",
1376 | "psr",
1377 | "psr-3"
1378 | ],
1379 | "support": {
1380 | "source": "https://github.com/php-fig/log/tree/3.0.0"
1381 | },
1382 | "time": "2021-07-14T16:46:02+00:00"
1383 | },
1384 | {
1385 | "name": "sebastian/cli-parser",
1386 | "version": "1.0.1",
1387 | "source": {
1388 | "type": "git",
1389 | "url": "https://github.com/sebastianbergmann/cli-parser.git",
1390 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
1391 | },
1392 | "dist": {
1393 | "type": "zip",
1394 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1395 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
1396 | "shasum": ""
1397 | },
1398 | "require": {
1399 | "php": ">=7.3"
1400 | },
1401 | "require-dev": {
1402 | "phpunit/phpunit": "^9.3"
1403 | },
1404 | "type": "library",
1405 | "extra": {
1406 | "branch-alias": {
1407 | "dev-master": "1.0-dev"
1408 | }
1409 | },
1410 | "autoload": {
1411 | "classmap": [
1412 | "src/"
1413 | ]
1414 | },
1415 | "notification-url": "https://packagist.org/downloads/",
1416 | "license": [
1417 | "BSD-3-Clause"
1418 | ],
1419 | "authors": [
1420 | {
1421 | "name": "Sebastian Bergmann",
1422 | "email": "sebastian@phpunit.de",
1423 | "role": "lead"
1424 | }
1425 | ],
1426 | "description": "Library for parsing CLI options",
1427 | "homepage": "https://github.com/sebastianbergmann/cli-parser",
1428 | "support": {
1429 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
1430 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
1431 | },
1432 | "funding": [
1433 | {
1434 | "url": "https://github.com/sebastianbergmann",
1435 | "type": "github"
1436 | }
1437 | ],
1438 | "time": "2020-09-28T06:08:49+00:00"
1439 | },
1440 | {
1441 | "name": "sebastian/code-unit",
1442 | "version": "1.0.8",
1443 | "source": {
1444 | "type": "git",
1445 | "url": "https://github.com/sebastianbergmann/code-unit.git",
1446 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
1447 | },
1448 | "dist": {
1449 | "type": "zip",
1450 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
1451 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
1452 | "shasum": ""
1453 | },
1454 | "require": {
1455 | "php": ">=7.3"
1456 | },
1457 | "require-dev": {
1458 | "phpunit/phpunit": "^9.3"
1459 | },
1460 | "type": "library",
1461 | "extra": {
1462 | "branch-alias": {
1463 | "dev-master": "1.0-dev"
1464 | }
1465 | },
1466 | "autoload": {
1467 | "classmap": [
1468 | "src/"
1469 | ]
1470 | },
1471 | "notification-url": "https://packagist.org/downloads/",
1472 | "license": [
1473 | "BSD-3-Clause"
1474 | ],
1475 | "authors": [
1476 | {
1477 | "name": "Sebastian Bergmann",
1478 | "email": "sebastian@phpunit.de",
1479 | "role": "lead"
1480 | }
1481 | ],
1482 | "description": "Collection of value objects that represent the PHP code units",
1483 | "homepage": "https://github.com/sebastianbergmann/code-unit",
1484 | "support": {
1485 | "issues": "https://github.com/sebastianbergmann/code-unit/issues",
1486 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
1487 | },
1488 | "funding": [
1489 | {
1490 | "url": "https://github.com/sebastianbergmann",
1491 | "type": "github"
1492 | }
1493 | ],
1494 | "time": "2020-10-26T13:08:54+00:00"
1495 | },
1496 | {
1497 | "name": "sebastian/code-unit-reverse-lookup",
1498 | "version": "2.0.3",
1499 | "source": {
1500 | "type": "git",
1501 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1502 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
1503 | },
1504 | "dist": {
1505 | "type": "zip",
1506 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1507 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
1508 | "shasum": ""
1509 | },
1510 | "require": {
1511 | "php": ">=7.3"
1512 | },
1513 | "require-dev": {
1514 | "phpunit/phpunit": "^9.3"
1515 | },
1516 | "type": "library",
1517 | "extra": {
1518 | "branch-alias": {
1519 | "dev-master": "2.0-dev"
1520 | }
1521 | },
1522 | "autoload": {
1523 | "classmap": [
1524 | "src/"
1525 | ]
1526 | },
1527 | "notification-url": "https://packagist.org/downloads/",
1528 | "license": [
1529 | "BSD-3-Clause"
1530 | ],
1531 | "authors": [
1532 | {
1533 | "name": "Sebastian Bergmann",
1534 | "email": "sebastian@phpunit.de"
1535 | }
1536 | ],
1537 | "description": "Looks up which function or method a line of code belongs to",
1538 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1539 | "support": {
1540 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
1541 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
1542 | },
1543 | "funding": [
1544 | {
1545 | "url": "https://github.com/sebastianbergmann",
1546 | "type": "github"
1547 | }
1548 | ],
1549 | "time": "2020-09-28T05:30:19+00:00"
1550 | },
1551 | {
1552 | "name": "sebastian/comparator",
1553 | "version": "4.0.8",
1554 | "source": {
1555 | "type": "git",
1556 | "url": "https://github.com/sebastianbergmann/comparator.git",
1557 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
1558 | },
1559 | "dist": {
1560 | "type": "zip",
1561 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
1562 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
1563 | "shasum": ""
1564 | },
1565 | "require": {
1566 | "php": ">=7.3",
1567 | "sebastian/diff": "^4.0",
1568 | "sebastian/exporter": "^4.0"
1569 | },
1570 | "require-dev": {
1571 | "phpunit/phpunit": "^9.3"
1572 | },
1573 | "type": "library",
1574 | "extra": {
1575 | "branch-alias": {
1576 | "dev-master": "4.0-dev"
1577 | }
1578 | },
1579 | "autoload": {
1580 | "classmap": [
1581 | "src/"
1582 | ]
1583 | },
1584 | "notification-url": "https://packagist.org/downloads/",
1585 | "license": [
1586 | "BSD-3-Clause"
1587 | ],
1588 | "authors": [
1589 | {
1590 | "name": "Sebastian Bergmann",
1591 | "email": "sebastian@phpunit.de"
1592 | },
1593 | {
1594 | "name": "Jeff Welch",
1595 | "email": "whatthejeff@gmail.com"
1596 | },
1597 | {
1598 | "name": "Volker Dusch",
1599 | "email": "github@wallbash.com"
1600 | },
1601 | {
1602 | "name": "Bernhard Schussek",
1603 | "email": "bschussek@2bepublished.at"
1604 | }
1605 | ],
1606 | "description": "Provides the functionality to compare PHP values for equality",
1607 | "homepage": "https://github.com/sebastianbergmann/comparator",
1608 | "keywords": [
1609 | "comparator",
1610 | "compare",
1611 | "equality"
1612 | ],
1613 | "support": {
1614 | "issues": "https://github.com/sebastianbergmann/comparator/issues",
1615 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
1616 | },
1617 | "funding": [
1618 | {
1619 | "url": "https://github.com/sebastianbergmann",
1620 | "type": "github"
1621 | }
1622 | ],
1623 | "time": "2022-09-14T12:41:17+00:00"
1624 | },
1625 | {
1626 | "name": "sebastian/complexity",
1627 | "version": "2.0.2",
1628 | "source": {
1629 | "type": "git",
1630 | "url": "https://github.com/sebastianbergmann/complexity.git",
1631 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
1632 | },
1633 | "dist": {
1634 | "type": "zip",
1635 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
1636 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
1637 | "shasum": ""
1638 | },
1639 | "require": {
1640 | "nikic/php-parser": "^4.7",
1641 | "php": ">=7.3"
1642 | },
1643 | "require-dev": {
1644 | "phpunit/phpunit": "^9.3"
1645 | },
1646 | "type": "library",
1647 | "extra": {
1648 | "branch-alias": {
1649 | "dev-master": "2.0-dev"
1650 | }
1651 | },
1652 | "autoload": {
1653 | "classmap": [
1654 | "src/"
1655 | ]
1656 | },
1657 | "notification-url": "https://packagist.org/downloads/",
1658 | "license": [
1659 | "BSD-3-Clause"
1660 | ],
1661 | "authors": [
1662 | {
1663 | "name": "Sebastian Bergmann",
1664 | "email": "sebastian@phpunit.de",
1665 | "role": "lead"
1666 | }
1667 | ],
1668 | "description": "Library for calculating the complexity of PHP code units",
1669 | "homepage": "https://github.com/sebastianbergmann/complexity",
1670 | "support": {
1671 | "issues": "https://github.com/sebastianbergmann/complexity/issues",
1672 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
1673 | },
1674 | "funding": [
1675 | {
1676 | "url": "https://github.com/sebastianbergmann",
1677 | "type": "github"
1678 | }
1679 | ],
1680 | "time": "2020-10-26T15:52:27+00:00"
1681 | },
1682 | {
1683 | "name": "sebastian/diff",
1684 | "version": "4.0.4",
1685 | "source": {
1686 | "type": "git",
1687 | "url": "https://github.com/sebastianbergmann/diff.git",
1688 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
1689 | },
1690 | "dist": {
1691 | "type": "zip",
1692 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1693 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
1694 | "shasum": ""
1695 | },
1696 | "require": {
1697 | "php": ">=7.3"
1698 | },
1699 | "require-dev": {
1700 | "phpunit/phpunit": "^9.3",
1701 | "symfony/process": "^4.2 || ^5"
1702 | },
1703 | "type": "library",
1704 | "extra": {
1705 | "branch-alias": {
1706 | "dev-master": "4.0-dev"
1707 | }
1708 | },
1709 | "autoload": {
1710 | "classmap": [
1711 | "src/"
1712 | ]
1713 | },
1714 | "notification-url": "https://packagist.org/downloads/",
1715 | "license": [
1716 | "BSD-3-Clause"
1717 | ],
1718 | "authors": [
1719 | {
1720 | "name": "Sebastian Bergmann",
1721 | "email": "sebastian@phpunit.de"
1722 | },
1723 | {
1724 | "name": "Kore Nordmann",
1725 | "email": "mail@kore-nordmann.de"
1726 | }
1727 | ],
1728 | "description": "Diff implementation",
1729 | "homepage": "https://github.com/sebastianbergmann/diff",
1730 | "keywords": [
1731 | "diff",
1732 | "udiff",
1733 | "unidiff",
1734 | "unified diff"
1735 | ],
1736 | "support": {
1737 | "issues": "https://github.com/sebastianbergmann/diff/issues",
1738 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
1739 | },
1740 | "funding": [
1741 | {
1742 | "url": "https://github.com/sebastianbergmann",
1743 | "type": "github"
1744 | }
1745 | ],
1746 | "time": "2020-10-26T13:10:38+00:00"
1747 | },
1748 | {
1749 | "name": "sebastian/environment",
1750 | "version": "5.1.4",
1751 | "source": {
1752 | "type": "git",
1753 | "url": "https://github.com/sebastianbergmann/environment.git",
1754 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
1755 | },
1756 | "dist": {
1757 | "type": "zip",
1758 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
1759 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
1760 | "shasum": ""
1761 | },
1762 | "require": {
1763 | "php": ">=7.3"
1764 | },
1765 | "require-dev": {
1766 | "phpunit/phpunit": "^9.3"
1767 | },
1768 | "suggest": {
1769 | "ext-posix": "*"
1770 | },
1771 | "type": "library",
1772 | "extra": {
1773 | "branch-alias": {
1774 | "dev-master": "5.1-dev"
1775 | }
1776 | },
1777 | "autoload": {
1778 | "classmap": [
1779 | "src/"
1780 | ]
1781 | },
1782 | "notification-url": "https://packagist.org/downloads/",
1783 | "license": [
1784 | "BSD-3-Clause"
1785 | ],
1786 | "authors": [
1787 | {
1788 | "name": "Sebastian Bergmann",
1789 | "email": "sebastian@phpunit.de"
1790 | }
1791 | ],
1792 | "description": "Provides functionality to handle HHVM/PHP environments",
1793 | "homepage": "http://www.github.com/sebastianbergmann/environment",
1794 | "keywords": [
1795 | "Xdebug",
1796 | "environment",
1797 | "hhvm"
1798 | ],
1799 | "support": {
1800 | "issues": "https://github.com/sebastianbergmann/environment/issues",
1801 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
1802 | },
1803 | "funding": [
1804 | {
1805 | "url": "https://github.com/sebastianbergmann",
1806 | "type": "github"
1807 | }
1808 | ],
1809 | "time": "2022-04-03T09:37:03+00:00"
1810 | },
1811 | {
1812 | "name": "sebastian/exporter",
1813 | "version": "4.0.5",
1814 | "source": {
1815 | "type": "git",
1816 | "url": "https://github.com/sebastianbergmann/exporter.git",
1817 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
1818 | },
1819 | "dist": {
1820 | "type": "zip",
1821 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
1822 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
1823 | "shasum": ""
1824 | },
1825 | "require": {
1826 | "php": ">=7.3",
1827 | "sebastian/recursion-context": "^4.0"
1828 | },
1829 | "require-dev": {
1830 | "ext-mbstring": "*",
1831 | "phpunit/phpunit": "^9.3"
1832 | },
1833 | "type": "library",
1834 | "extra": {
1835 | "branch-alias": {
1836 | "dev-master": "4.0-dev"
1837 | }
1838 | },
1839 | "autoload": {
1840 | "classmap": [
1841 | "src/"
1842 | ]
1843 | },
1844 | "notification-url": "https://packagist.org/downloads/",
1845 | "license": [
1846 | "BSD-3-Clause"
1847 | ],
1848 | "authors": [
1849 | {
1850 | "name": "Sebastian Bergmann",
1851 | "email": "sebastian@phpunit.de"
1852 | },
1853 | {
1854 | "name": "Jeff Welch",
1855 | "email": "whatthejeff@gmail.com"
1856 | },
1857 | {
1858 | "name": "Volker Dusch",
1859 | "email": "github@wallbash.com"
1860 | },
1861 | {
1862 | "name": "Adam Harvey",
1863 | "email": "aharvey@php.net"
1864 | },
1865 | {
1866 | "name": "Bernhard Schussek",
1867 | "email": "bschussek@gmail.com"
1868 | }
1869 | ],
1870 | "description": "Provides the functionality to export PHP variables for visualization",
1871 | "homepage": "https://www.github.com/sebastianbergmann/exporter",
1872 | "keywords": [
1873 | "export",
1874 | "exporter"
1875 | ],
1876 | "support": {
1877 | "issues": "https://github.com/sebastianbergmann/exporter/issues",
1878 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
1879 | },
1880 | "funding": [
1881 | {
1882 | "url": "https://github.com/sebastianbergmann",
1883 | "type": "github"
1884 | }
1885 | ],
1886 | "time": "2022-09-14T06:03:37+00:00"
1887 | },
1888 | {
1889 | "name": "sebastian/global-state",
1890 | "version": "5.0.5",
1891 | "source": {
1892 | "type": "git",
1893 | "url": "https://github.com/sebastianbergmann/global-state.git",
1894 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
1895 | },
1896 | "dist": {
1897 | "type": "zip",
1898 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
1899 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
1900 | "shasum": ""
1901 | },
1902 | "require": {
1903 | "php": ">=7.3",
1904 | "sebastian/object-reflector": "^2.0",
1905 | "sebastian/recursion-context": "^4.0"
1906 | },
1907 | "require-dev": {
1908 | "ext-dom": "*",
1909 | "phpunit/phpunit": "^9.3"
1910 | },
1911 | "suggest": {
1912 | "ext-uopz": "*"
1913 | },
1914 | "type": "library",
1915 | "extra": {
1916 | "branch-alias": {
1917 | "dev-master": "5.0-dev"
1918 | }
1919 | },
1920 | "autoload": {
1921 | "classmap": [
1922 | "src/"
1923 | ]
1924 | },
1925 | "notification-url": "https://packagist.org/downloads/",
1926 | "license": [
1927 | "BSD-3-Clause"
1928 | ],
1929 | "authors": [
1930 | {
1931 | "name": "Sebastian Bergmann",
1932 | "email": "sebastian@phpunit.de"
1933 | }
1934 | ],
1935 | "description": "Snapshotting of global state",
1936 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
1937 | "keywords": [
1938 | "global state"
1939 | ],
1940 | "support": {
1941 | "issues": "https://github.com/sebastianbergmann/global-state/issues",
1942 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
1943 | },
1944 | "funding": [
1945 | {
1946 | "url": "https://github.com/sebastianbergmann",
1947 | "type": "github"
1948 | }
1949 | ],
1950 | "time": "2022-02-14T08:28:10+00:00"
1951 | },
1952 | {
1953 | "name": "sebastian/lines-of-code",
1954 | "version": "1.0.3",
1955 | "source": {
1956 | "type": "git",
1957 | "url": "https://github.com/sebastianbergmann/lines-of-code.git",
1958 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
1959 | },
1960 | "dist": {
1961 | "type": "zip",
1962 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1963 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
1964 | "shasum": ""
1965 | },
1966 | "require": {
1967 | "nikic/php-parser": "^4.6",
1968 | "php": ">=7.3"
1969 | },
1970 | "require-dev": {
1971 | "phpunit/phpunit": "^9.3"
1972 | },
1973 | "type": "library",
1974 | "extra": {
1975 | "branch-alias": {
1976 | "dev-master": "1.0-dev"
1977 | }
1978 | },
1979 | "autoload": {
1980 | "classmap": [
1981 | "src/"
1982 | ]
1983 | },
1984 | "notification-url": "https://packagist.org/downloads/",
1985 | "license": [
1986 | "BSD-3-Clause"
1987 | ],
1988 | "authors": [
1989 | {
1990 | "name": "Sebastian Bergmann",
1991 | "email": "sebastian@phpunit.de",
1992 | "role": "lead"
1993 | }
1994 | ],
1995 | "description": "Library for counting the lines of code in PHP source code",
1996 | "homepage": "https://github.com/sebastianbergmann/lines-of-code",
1997 | "support": {
1998 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
1999 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
2000 | },
2001 | "funding": [
2002 | {
2003 | "url": "https://github.com/sebastianbergmann",
2004 | "type": "github"
2005 | }
2006 | ],
2007 | "time": "2020-11-28T06:42:11+00:00"
2008 | },
2009 | {
2010 | "name": "sebastian/object-enumerator",
2011 | "version": "4.0.4",
2012 | "source": {
2013 | "type": "git",
2014 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
2015 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
2016 | },
2017 | "dist": {
2018 | "type": "zip",
2019 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
2020 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
2021 | "shasum": ""
2022 | },
2023 | "require": {
2024 | "php": ">=7.3",
2025 | "sebastian/object-reflector": "^2.0",
2026 | "sebastian/recursion-context": "^4.0"
2027 | },
2028 | "require-dev": {
2029 | "phpunit/phpunit": "^9.3"
2030 | },
2031 | "type": "library",
2032 | "extra": {
2033 | "branch-alias": {
2034 | "dev-master": "4.0-dev"
2035 | }
2036 | },
2037 | "autoload": {
2038 | "classmap": [
2039 | "src/"
2040 | ]
2041 | },
2042 | "notification-url": "https://packagist.org/downloads/",
2043 | "license": [
2044 | "BSD-3-Clause"
2045 | ],
2046 | "authors": [
2047 | {
2048 | "name": "Sebastian Bergmann",
2049 | "email": "sebastian@phpunit.de"
2050 | }
2051 | ],
2052 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
2053 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
2054 | "support": {
2055 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
2056 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
2057 | },
2058 | "funding": [
2059 | {
2060 | "url": "https://github.com/sebastianbergmann",
2061 | "type": "github"
2062 | }
2063 | ],
2064 | "time": "2020-10-26T13:12:34+00:00"
2065 | },
2066 | {
2067 | "name": "sebastian/object-reflector",
2068 | "version": "2.0.4",
2069 | "source": {
2070 | "type": "git",
2071 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
2072 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
2073 | },
2074 | "dist": {
2075 | "type": "zip",
2076 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
2077 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
2078 | "shasum": ""
2079 | },
2080 | "require": {
2081 | "php": ">=7.3"
2082 | },
2083 | "require-dev": {
2084 | "phpunit/phpunit": "^9.3"
2085 | },
2086 | "type": "library",
2087 | "extra": {
2088 | "branch-alias": {
2089 | "dev-master": "2.0-dev"
2090 | }
2091 | },
2092 | "autoload": {
2093 | "classmap": [
2094 | "src/"
2095 | ]
2096 | },
2097 | "notification-url": "https://packagist.org/downloads/",
2098 | "license": [
2099 | "BSD-3-Clause"
2100 | ],
2101 | "authors": [
2102 | {
2103 | "name": "Sebastian Bergmann",
2104 | "email": "sebastian@phpunit.de"
2105 | }
2106 | ],
2107 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
2108 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
2109 | "support": {
2110 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
2111 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
2112 | },
2113 | "funding": [
2114 | {
2115 | "url": "https://github.com/sebastianbergmann",
2116 | "type": "github"
2117 | }
2118 | ],
2119 | "time": "2020-10-26T13:14:26+00:00"
2120 | },
2121 | {
2122 | "name": "sebastian/recursion-context",
2123 | "version": "4.0.4",
2124 | "source": {
2125 | "type": "git",
2126 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
2127 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
2128 | },
2129 | "dist": {
2130 | "type": "zip",
2131 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
2132 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
2133 | "shasum": ""
2134 | },
2135 | "require": {
2136 | "php": ">=7.3"
2137 | },
2138 | "require-dev": {
2139 | "phpunit/phpunit": "^9.3"
2140 | },
2141 | "type": "library",
2142 | "extra": {
2143 | "branch-alias": {
2144 | "dev-master": "4.0-dev"
2145 | }
2146 | },
2147 | "autoload": {
2148 | "classmap": [
2149 | "src/"
2150 | ]
2151 | },
2152 | "notification-url": "https://packagist.org/downloads/",
2153 | "license": [
2154 | "BSD-3-Clause"
2155 | ],
2156 | "authors": [
2157 | {
2158 | "name": "Sebastian Bergmann",
2159 | "email": "sebastian@phpunit.de"
2160 | },
2161 | {
2162 | "name": "Jeff Welch",
2163 | "email": "whatthejeff@gmail.com"
2164 | },
2165 | {
2166 | "name": "Adam Harvey",
2167 | "email": "aharvey@php.net"
2168 | }
2169 | ],
2170 | "description": "Provides functionality to recursively process PHP variables",
2171 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2172 | "support": {
2173 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
2174 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
2175 | },
2176 | "funding": [
2177 | {
2178 | "url": "https://github.com/sebastianbergmann",
2179 | "type": "github"
2180 | }
2181 | ],
2182 | "time": "2020-10-26T13:17:30+00:00"
2183 | },
2184 | {
2185 | "name": "sebastian/resource-operations",
2186 | "version": "3.0.3",
2187 | "source": {
2188 | "type": "git",
2189 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
2190 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
2191 | },
2192 | "dist": {
2193 | "type": "zip",
2194 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2195 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
2196 | "shasum": ""
2197 | },
2198 | "require": {
2199 | "php": ">=7.3"
2200 | },
2201 | "require-dev": {
2202 | "phpunit/phpunit": "^9.0"
2203 | },
2204 | "type": "library",
2205 | "extra": {
2206 | "branch-alias": {
2207 | "dev-master": "3.0-dev"
2208 | }
2209 | },
2210 | "autoload": {
2211 | "classmap": [
2212 | "src/"
2213 | ]
2214 | },
2215 | "notification-url": "https://packagist.org/downloads/",
2216 | "license": [
2217 | "BSD-3-Clause"
2218 | ],
2219 | "authors": [
2220 | {
2221 | "name": "Sebastian Bergmann",
2222 | "email": "sebastian@phpunit.de"
2223 | }
2224 | ],
2225 | "description": "Provides a list of PHP built-in functions that operate on resources",
2226 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2227 | "support": {
2228 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
2229 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
2230 | },
2231 | "funding": [
2232 | {
2233 | "url": "https://github.com/sebastianbergmann",
2234 | "type": "github"
2235 | }
2236 | ],
2237 | "time": "2020-09-28T06:45:17+00:00"
2238 | },
2239 | {
2240 | "name": "sebastian/type",
2241 | "version": "3.2.0",
2242 | "source": {
2243 | "type": "git",
2244 | "url": "https://github.com/sebastianbergmann/type.git",
2245 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
2246 | },
2247 | "dist": {
2248 | "type": "zip",
2249 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
2250 | "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
2251 | "shasum": ""
2252 | },
2253 | "require": {
2254 | "php": ">=7.3"
2255 | },
2256 | "require-dev": {
2257 | "phpunit/phpunit": "^9.5"
2258 | },
2259 | "type": "library",
2260 | "extra": {
2261 | "branch-alias": {
2262 | "dev-master": "3.2-dev"
2263 | }
2264 | },
2265 | "autoload": {
2266 | "classmap": [
2267 | "src/"
2268 | ]
2269 | },
2270 | "notification-url": "https://packagist.org/downloads/",
2271 | "license": [
2272 | "BSD-3-Clause"
2273 | ],
2274 | "authors": [
2275 | {
2276 | "name": "Sebastian Bergmann",
2277 | "email": "sebastian@phpunit.de",
2278 | "role": "lead"
2279 | }
2280 | ],
2281 | "description": "Collection of value objects that represent the types of the PHP type system",
2282 | "homepage": "https://github.com/sebastianbergmann/type",
2283 | "support": {
2284 | "issues": "https://github.com/sebastianbergmann/type/issues",
2285 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
2286 | },
2287 | "funding": [
2288 | {
2289 | "url": "https://github.com/sebastianbergmann",
2290 | "type": "github"
2291 | }
2292 | ],
2293 | "time": "2022-09-12T14:47:03+00:00"
2294 | },
2295 | {
2296 | "name": "sebastian/version",
2297 | "version": "3.0.2",
2298 | "source": {
2299 | "type": "git",
2300 | "url": "https://github.com/sebastianbergmann/version.git",
2301 | "reference": "c6c1022351a901512170118436c764e473f6de8c"
2302 | },
2303 | "dist": {
2304 | "type": "zip",
2305 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
2306 | "reference": "c6c1022351a901512170118436c764e473f6de8c",
2307 | "shasum": ""
2308 | },
2309 | "require": {
2310 | "php": ">=7.3"
2311 | },
2312 | "type": "library",
2313 | "extra": {
2314 | "branch-alias": {
2315 | "dev-master": "3.0-dev"
2316 | }
2317 | },
2318 | "autoload": {
2319 | "classmap": [
2320 | "src/"
2321 | ]
2322 | },
2323 | "notification-url": "https://packagist.org/downloads/",
2324 | "license": [
2325 | "BSD-3-Clause"
2326 | ],
2327 | "authors": [
2328 | {
2329 | "name": "Sebastian Bergmann",
2330 | "email": "sebastian@phpunit.de",
2331 | "role": "lead"
2332 | }
2333 | ],
2334 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2335 | "homepage": "https://github.com/sebastianbergmann/version",
2336 | "support": {
2337 | "issues": "https://github.com/sebastianbergmann/version/issues",
2338 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
2339 | },
2340 | "funding": [
2341 | {
2342 | "url": "https://github.com/sebastianbergmann",
2343 | "type": "github"
2344 | }
2345 | ],
2346 | "time": "2020-09-28T06:39:44+00:00"
2347 | },
2348 | {
2349 | "name": "symfony/console",
2350 | "version": "v6.1.7",
2351 | "source": {
2352 | "type": "git",
2353 | "url": "https://github.com/symfony/console.git",
2354 | "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815"
2355 | },
2356 | "dist": {
2357 | "type": "zip",
2358 | "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815",
2359 | "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815",
2360 | "shasum": ""
2361 | },
2362 | "require": {
2363 | "php": ">=8.1",
2364 | "symfony/deprecation-contracts": "^2.1|^3",
2365 | "symfony/polyfill-mbstring": "~1.0",
2366 | "symfony/service-contracts": "^1.1|^2|^3",
2367 | "symfony/string": "^5.4|^6.0"
2368 | },
2369 | "conflict": {
2370 | "symfony/dependency-injection": "<5.4",
2371 | "symfony/dotenv": "<5.4",
2372 | "symfony/event-dispatcher": "<5.4",
2373 | "symfony/lock": "<5.4",
2374 | "symfony/process": "<5.4"
2375 | },
2376 | "provide": {
2377 | "psr/log-implementation": "1.0|2.0|3.0"
2378 | },
2379 | "require-dev": {
2380 | "psr/log": "^1|^2|^3",
2381 | "symfony/config": "^5.4|^6.0",
2382 | "symfony/dependency-injection": "^5.4|^6.0",
2383 | "symfony/event-dispatcher": "^5.4|^6.0",
2384 | "symfony/lock": "^5.4|^6.0",
2385 | "symfony/process": "^5.4|^6.0",
2386 | "symfony/var-dumper": "^5.4|^6.0"
2387 | },
2388 | "suggest": {
2389 | "psr/log": "For using the console logger",
2390 | "symfony/event-dispatcher": "",
2391 | "symfony/lock": "",
2392 | "symfony/process": ""
2393 | },
2394 | "type": "library",
2395 | "autoload": {
2396 | "psr-4": {
2397 | "Symfony\\Component\\Console\\": ""
2398 | },
2399 | "exclude-from-classmap": [
2400 | "/Tests/"
2401 | ]
2402 | },
2403 | "notification-url": "https://packagist.org/downloads/",
2404 | "license": [
2405 | "MIT"
2406 | ],
2407 | "authors": [
2408 | {
2409 | "name": "Fabien Potencier",
2410 | "email": "fabien@symfony.com"
2411 | },
2412 | {
2413 | "name": "Symfony Community",
2414 | "homepage": "https://symfony.com/contributors"
2415 | }
2416 | ],
2417 | "description": "Eases the creation of beautiful and testable command line interfaces",
2418 | "homepage": "https://symfony.com",
2419 | "keywords": [
2420 | "cli",
2421 | "command line",
2422 | "console",
2423 | "terminal"
2424 | ],
2425 | "support": {
2426 | "source": "https://github.com/symfony/console/tree/v6.1.7"
2427 | },
2428 | "funding": [
2429 | {
2430 | "url": "https://symfony.com/sponsor",
2431 | "type": "custom"
2432 | },
2433 | {
2434 | "url": "https://github.com/fabpot",
2435 | "type": "github"
2436 | },
2437 | {
2438 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2439 | "type": "tidelift"
2440 | }
2441 | ],
2442 | "time": "2022-10-26T21:42:49+00:00"
2443 | },
2444 | {
2445 | "name": "symfony/deprecation-contracts",
2446 | "version": "v3.1.1",
2447 | "source": {
2448 | "type": "git",
2449 | "url": "https://github.com/symfony/deprecation-contracts.git",
2450 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
2451 | },
2452 | "dist": {
2453 | "type": "zip",
2454 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
2455 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
2456 | "shasum": ""
2457 | },
2458 | "require": {
2459 | "php": ">=8.1"
2460 | },
2461 | "type": "library",
2462 | "extra": {
2463 | "branch-alias": {
2464 | "dev-main": "3.1-dev"
2465 | },
2466 | "thanks": {
2467 | "name": "symfony/contracts",
2468 | "url": "https://github.com/symfony/contracts"
2469 | }
2470 | },
2471 | "autoload": {
2472 | "files": [
2473 | "function.php"
2474 | ]
2475 | },
2476 | "notification-url": "https://packagist.org/downloads/",
2477 | "license": [
2478 | "MIT"
2479 | ],
2480 | "authors": [
2481 | {
2482 | "name": "Nicolas Grekas",
2483 | "email": "p@tchwork.com"
2484 | },
2485 | {
2486 | "name": "Symfony Community",
2487 | "homepage": "https://symfony.com/contributors"
2488 | }
2489 | ],
2490 | "description": "A generic function and convention to trigger deprecation notices",
2491 | "homepage": "https://symfony.com",
2492 | "support": {
2493 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1"
2494 | },
2495 | "funding": [
2496 | {
2497 | "url": "https://symfony.com/sponsor",
2498 | "type": "custom"
2499 | },
2500 | {
2501 | "url": "https://github.com/fabpot",
2502 | "type": "github"
2503 | },
2504 | {
2505 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2506 | "type": "tidelift"
2507 | }
2508 | ],
2509 | "time": "2022-02-25T11:15:52+00:00"
2510 | },
2511 | {
2512 | "name": "symfony/event-dispatcher",
2513 | "version": "v6.1.0",
2514 | "source": {
2515 | "type": "git",
2516 | "url": "https://github.com/symfony/event-dispatcher.git",
2517 | "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347"
2518 | },
2519 | "dist": {
2520 | "type": "zip",
2521 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347",
2522 | "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347",
2523 | "shasum": ""
2524 | },
2525 | "require": {
2526 | "php": ">=8.1",
2527 | "symfony/event-dispatcher-contracts": "^2|^3"
2528 | },
2529 | "conflict": {
2530 | "symfony/dependency-injection": "<5.4"
2531 | },
2532 | "provide": {
2533 | "psr/event-dispatcher-implementation": "1.0",
2534 | "symfony/event-dispatcher-implementation": "2.0|3.0"
2535 | },
2536 | "require-dev": {
2537 | "psr/log": "^1|^2|^3",
2538 | "symfony/config": "^5.4|^6.0",
2539 | "symfony/dependency-injection": "^5.4|^6.0",
2540 | "symfony/error-handler": "^5.4|^6.0",
2541 | "symfony/expression-language": "^5.4|^6.0",
2542 | "symfony/http-foundation": "^5.4|^6.0",
2543 | "symfony/service-contracts": "^1.1|^2|^3",
2544 | "symfony/stopwatch": "^5.4|^6.0"
2545 | },
2546 | "suggest": {
2547 | "symfony/dependency-injection": "",
2548 | "symfony/http-kernel": ""
2549 | },
2550 | "type": "library",
2551 | "autoload": {
2552 | "psr-4": {
2553 | "Symfony\\Component\\EventDispatcher\\": ""
2554 | },
2555 | "exclude-from-classmap": [
2556 | "/Tests/"
2557 | ]
2558 | },
2559 | "notification-url": "https://packagist.org/downloads/",
2560 | "license": [
2561 | "MIT"
2562 | ],
2563 | "authors": [
2564 | {
2565 | "name": "Fabien Potencier",
2566 | "email": "fabien@symfony.com"
2567 | },
2568 | {
2569 | "name": "Symfony Community",
2570 | "homepage": "https://symfony.com/contributors"
2571 | }
2572 | ],
2573 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
2574 | "homepage": "https://symfony.com",
2575 | "support": {
2576 | "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0"
2577 | },
2578 | "funding": [
2579 | {
2580 | "url": "https://symfony.com/sponsor",
2581 | "type": "custom"
2582 | },
2583 | {
2584 | "url": "https://github.com/fabpot",
2585 | "type": "github"
2586 | },
2587 | {
2588 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2589 | "type": "tidelift"
2590 | }
2591 | ],
2592 | "time": "2022-05-05T16:51:07+00:00"
2593 | },
2594 | {
2595 | "name": "symfony/event-dispatcher-contracts",
2596 | "version": "v3.1.1",
2597 | "source": {
2598 | "type": "git",
2599 | "url": "https://github.com/symfony/event-dispatcher-contracts.git",
2600 | "reference": "02ff5eea2f453731cfbc6bc215e456b781480448"
2601 | },
2602 | "dist": {
2603 | "type": "zip",
2604 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448",
2605 | "reference": "02ff5eea2f453731cfbc6bc215e456b781480448",
2606 | "shasum": ""
2607 | },
2608 | "require": {
2609 | "php": ">=8.1",
2610 | "psr/event-dispatcher": "^1"
2611 | },
2612 | "suggest": {
2613 | "symfony/event-dispatcher-implementation": ""
2614 | },
2615 | "type": "library",
2616 | "extra": {
2617 | "branch-alias": {
2618 | "dev-main": "3.1-dev"
2619 | },
2620 | "thanks": {
2621 | "name": "symfony/contracts",
2622 | "url": "https://github.com/symfony/contracts"
2623 | }
2624 | },
2625 | "autoload": {
2626 | "psr-4": {
2627 | "Symfony\\Contracts\\EventDispatcher\\": ""
2628 | }
2629 | },
2630 | "notification-url": "https://packagist.org/downloads/",
2631 | "license": [
2632 | "MIT"
2633 | ],
2634 | "authors": [
2635 | {
2636 | "name": "Nicolas Grekas",
2637 | "email": "p@tchwork.com"
2638 | },
2639 | {
2640 | "name": "Symfony Community",
2641 | "homepage": "https://symfony.com/contributors"
2642 | }
2643 | ],
2644 | "description": "Generic abstractions related to dispatching event",
2645 | "homepage": "https://symfony.com",
2646 | "keywords": [
2647 | "abstractions",
2648 | "contracts",
2649 | "decoupling",
2650 | "interfaces",
2651 | "interoperability",
2652 | "standards"
2653 | ],
2654 | "support": {
2655 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1"
2656 | },
2657 | "funding": [
2658 | {
2659 | "url": "https://symfony.com/sponsor",
2660 | "type": "custom"
2661 | },
2662 | {
2663 | "url": "https://github.com/fabpot",
2664 | "type": "github"
2665 | },
2666 | {
2667 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2668 | "type": "tidelift"
2669 | }
2670 | ],
2671 | "time": "2022-02-25T11:15:52+00:00"
2672 | },
2673 | {
2674 | "name": "symfony/filesystem",
2675 | "version": "v6.1.5",
2676 | "source": {
2677 | "type": "git",
2678 | "url": "https://github.com/symfony/filesystem.git",
2679 | "reference": "4d216a2beef096edf040a070117c39ca2abce307"
2680 | },
2681 | "dist": {
2682 | "type": "zip",
2683 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307",
2684 | "reference": "4d216a2beef096edf040a070117c39ca2abce307",
2685 | "shasum": ""
2686 | },
2687 | "require": {
2688 | "php": ">=8.1",
2689 | "symfony/polyfill-ctype": "~1.8",
2690 | "symfony/polyfill-mbstring": "~1.8"
2691 | },
2692 | "type": "library",
2693 | "autoload": {
2694 | "psr-4": {
2695 | "Symfony\\Component\\Filesystem\\": ""
2696 | },
2697 | "exclude-from-classmap": [
2698 | "/Tests/"
2699 | ]
2700 | },
2701 | "notification-url": "https://packagist.org/downloads/",
2702 | "license": [
2703 | "MIT"
2704 | ],
2705 | "authors": [
2706 | {
2707 | "name": "Fabien Potencier",
2708 | "email": "fabien@symfony.com"
2709 | },
2710 | {
2711 | "name": "Symfony Community",
2712 | "homepage": "https://symfony.com/contributors"
2713 | }
2714 | ],
2715 | "description": "Provides basic utilities for the filesystem",
2716 | "homepage": "https://symfony.com",
2717 | "support": {
2718 | "source": "https://github.com/symfony/filesystem/tree/v6.1.5"
2719 | },
2720 | "funding": [
2721 | {
2722 | "url": "https://symfony.com/sponsor",
2723 | "type": "custom"
2724 | },
2725 | {
2726 | "url": "https://github.com/fabpot",
2727 | "type": "github"
2728 | },
2729 | {
2730 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2731 | "type": "tidelift"
2732 | }
2733 | ],
2734 | "time": "2022-09-21T20:29:40+00:00"
2735 | },
2736 | {
2737 | "name": "symfony/finder",
2738 | "version": "v6.1.3",
2739 | "source": {
2740 | "type": "git",
2741 | "url": "https://github.com/symfony/finder.git",
2742 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709"
2743 | },
2744 | "dist": {
2745 | "type": "zip",
2746 | "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709",
2747 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709",
2748 | "shasum": ""
2749 | },
2750 | "require": {
2751 | "php": ">=8.1"
2752 | },
2753 | "require-dev": {
2754 | "symfony/filesystem": "^6.0"
2755 | },
2756 | "type": "library",
2757 | "autoload": {
2758 | "psr-4": {
2759 | "Symfony\\Component\\Finder\\": ""
2760 | },
2761 | "exclude-from-classmap": [
2762 | "/Tests/"
2763 | ]
2764 | },
2765 | "notification-url": "https://packagist.org/downloads/",
2766 | "license": [
2767 | "MIT"
2768 | ],
2769 | "authors": [
2770 | {
2771 | "name": "Fabien Potencier",
2772 | "email": "fabien@symfony.com"
2773 | },
2774 | {
2775 | "name": "Symfony Community",
2776 | "homepage": "https://symfony.com/contributors"
2777 | }
2778 | ],
2779 | "description": "Finds files and directories via an intuitive fluent interface",
2780 | "homepage": "https://symfony.com",
2781 | "support": {
2782 | "source": "https://github.com/symfony/finder/tree/v6.1.3"
2783 | },
2784 | "funding": [
2785 | {
2786 | "url": "https://symfony.com/sponsor",
2787 | "type": "custom"
2788 | },
2789 | {
2790 | "url": "https://github.com/fabpot",
2791 | "type": "github"
2792 | },
2793 | {
2794 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2795 | "type": "tidelift"
2796 | }
2797 | ],
2798 | "time": "2022-07-29T07:42:06+00:00"
2799 | },
2800 | {
2801 | "name": "symfony/options-resolver",
2802 | "version": "v6.1.0",
2803 | "source": {
2804 | "type": "git",
2805 | "url": "https://github.com/symfony/options-resolver.git",
2806 | "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4"
2807 | },
2808 | "dist": {
2809 | "type": "zip",
2810 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4",
2811 | "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4",
2812 | "shasum": ""
2813 | },
2814 | "require": {
2815 | "php": ">=8.1",
2816 | "symfony/deprecation-contracts": "^2.1|^3"
2817 | },
2818 | "type": "library",
2819 | "autoload": {
2820 | "psr-4": {
2821 | "Symfony\\Component\\OptionsResolver\\": ""
2822 | },
2823 | "exclude-from-classmap": [
2824 | "/Tests/"
2825 | ]
2826 | },
2827 | "notification-url": "https://packagist.org/downloads/",
2828 | "license": [
2829 | "MIT"
2830 | ],
2831 | "authors": [
2832 | {
2833 | "name": "Fabien Potencier",
2834 | "email": "fabien@symfony.com"
2835 | },
2836 | {
2837 | "name": "Symfony Community",
2838 | "homepage": "https://symfony.com/contributors"
2839 | }
2840 | ],
2841 | "description": "Provides an improved replacement for the array_replace PHP function",
2842 | "homepage": "https://symfony.com",
2843 | "keywords": [
2844 | "config",
2845 | "configuration",
2846 | "options"
2847 | ],
2848 | "support": {
2849 | "source": "https://github.com/symfony/options-resolver/tree/v6.1.0"
2850 | },
2851 | "funding": [
2852 | {
2853 | "url": "https://symfony.com/sponsor",
2854 | "type": "custom"
2855 | },
2856 | {
2857 | "url": "https://github.com/fabpot",
2858 | "type": "github"
2859 | },
2860 | {
2861 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2862 | "type": "tidelift"
2863 | }
2864 | ],
2865 | "time": "2022-02-25T11:15:52+00:00"
2866 | },
2867 | {
2868 | "name": "symfony/polyfill-ctype",
2869 | "version": "v1.26.0",
2870 | "source": {
2871 | "type": "git",
2872 | "url": "https://github.com/symfony/polyfill-ctype.git",
2873 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
2874 | },
2875 | "dist": {
2876 | "type": "zip",
2877 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
2878 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
2879 | "shasum": ""
2880 | },
2881 | "require": {
2882 | "php": ">=7.1"
2883 | },
2884 | "provide": {
2885 | "ext-ctype": "*"
2886 | },
2887 | "suggest": {
2888 | "ext-ctype": "For best performance"
2889 | },
2890 | "type": "library",
2891 | "extra": {
2892 | "branch-alias": {
2893 | "dev-main": "1.26-dev"
2894 | },
2895 | "thanks": {
2896 | "name": "symfony/polyfill",
2897 | "url": "https://github.com/symfony/polyfill"
2898 | }
2899 | },
2900 | "autoload": {
2901 | "files": [
2902 | "bootstrap.php"
2903 | ],
2904 | "psr-4": {
2905 | "Symfony\\Polyfill\\Ctype\\": ""
2906 | }
2907 | },
2908 | "notification-url": "https://packagist.org/downloads/",
2909 | "license": [
2910 | "MIT"
2911 | ],
2912 | "authors": [
2913 | {
2914 | "name": "Gert de Pagter",
2915 | "email": "BackEndTea@gmail.com"
2916 | },
2917 | {
2918 | "name": "Symfony Community",
2919 | "homepage": "https://symfony.com/contributors"
2920 | }
2921 | ],
2922 | "description": "Symfony polyfill for ctype functions",
2923 | "homepage": "https://symfony.com",
2924 | "keywords": [
2925 | "compatibility",
2926 | "ctype",
2927 | "polyfill",
2928 | "portable"
2929 | ],
2930 | "support": {
2931 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
2932 | },
2933 | "funding": [
2934 | {
2935 | "url": "https://symfony.com/sponsor",
2936 | "type": "custom"
2937 | },
2938 | {
2939 | "url": "https://github.com/fabpot",
2940 | "type": "github"
2941 | },
2942 | {
2943 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2944 | "type": "tidelift"
2945 | }
2946 | ],
2947 | "time": "2022-05-24T11:49:31+00:00"
2948 | },
2949 | {
2950 | "name": "symfony/polyfill-intl-grapheme",
2951 | "version": "v1.26.0",
2952 | "source": {
2953 | "type": "git",
2954 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
2955 | "reference": "433d05519ce6990bf3530fba6957499d327395c2"
2956 | },
2957 | "dist": {
2958 | "type": "zip",
2959 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
2960 | "reference": "433d05519ce6990bf3530fba6957499d327395c2",
2961 | "shasum": ""
2962 | },
2963 | "require": {
2964 | "php": ">=7.1"
2965 | },
2966 | "suggest": {
2967 | "ext-intl": "For best performance"
2968 | },
2969 | "type": "library",
2970 | "extra": {
2971 | "branch-alias": {
2972 | "dev-main": "1.26-dev"
2973 | },
2974 | "thanks": {
2975 | "name": "symfony/polyfill",
2976 | "url": "https://github.com/symfony/polyfill"
2977 | }
2978 | },
2979 | "autoload": {
2980 | "files": [
2981 | "bootstrap.php"
2982 | ],
2983 | "psr-4": {
2984 | "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
2985 | }
2986 | },
2987 | "notification-url": "https://packagist.org/downloads/",
2988 | "license": [
2989 | "MIT"
2990 | ],
2991 | "authors": [
2992 | {
2993 | "name": "Nicolas Grekas",
2994 | "email": "p@tchwork.com"
2995 | },
2996 | {
2997 | "name": "Symfony Community",
2998 | "homepage": "https://symfony.com/contributors"
2999 | }
3000 | ],
3001 | "description": "Symfony polyfill for intl's grapheme_* functions",
3002 | "homepage": "https://symfony.com",
3003 | "keywords": [
3004 | "compatibility",
3005 | "grapheme",
3006 | "intl",
3007 | "polyfill",
3008 | "portable",
3009 | "shim"
3010 | ],
3011 | "support": {
3012 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
3013 | },
3014 | "funding": [
3015 | {
3016 | "url": "https://symfony.com/sponsor",
3017 | "type": "custom"
3018 | },
3019 | {
3020 | "url": "https://github.com/fabpot",
3021 | "type": "github"
3022 | },
3023 | {
3024 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3025 | "type": "tidelift"
3026 | }
3027 | ],
3028 | "time": "2022-05-24T11:49:31+00:00"
3029 | },
3030 | {
3031 | "name": "symfony/polyfill-intl-normalizer",
3032 | "version": "v1.26.0",
3033 | "source": {
3034 | "type": "git",
3035 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
3036 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
3037 | },
3038 | "dist": {
3039 | "type": "zip",
3040 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
3041 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
3042 | "shasum": ""
3043 | },
3044 | "require": {
3045 | "php": ">=7.1"
3046 | },
3047 | "suggest": {
3048 | "ext-intl": "For best performance"
3049 | },
3050 | "type": "library",
3051 | "extra": {
3052 | "branch-alias": {
3053 | "dev-main": "1.26-dev"
3054 | },
3055 | "thanks": {
3056 | "name": "symfony/polyfill",
3057 | "url": "https://github.com/symfony/polyfill"
3058 | }
3059 | },
3060 | "autoload": {
3061 | "files": [
3062 | "bootstrap.php"
3063 | ],
3064 | "psr-4": {
3065 | "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
3066 | },
3067 | "classmap": [
3068 | "Resources/stubs"
3069 | ]
3070 | },
3071 | "notification-url": "https://packagist.org/downloads/",
3072 | "license": [
3073 | "MIT"
3074 | ],
3075 | "authors": [
3076 | {
3077 | "name": "Nicolas Grekas",
3078 | "email": "p@tchwork.com"
3079 | },
3080 | {
3081 | "name": "Symfony Community",
3082 | "homepage": "https://symfony.com/contributors"
3083 | }
3084 | ],
3085 | "description": "Symfony polyfill for intl's Normalizer class and related functions",
3086 | "homepage": "https://symfony.com",
3087 | "keywords": [
3088 | "compatibility",
3089 | "intl",
3090 | "normalizer",
3091 | "polyfill",
3092 | "portable",
3093 | "shim"
3094 | ],
3095 | "support": {
3096 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
3097 | },
3098 | "funding": [
3099 | {
3100 | "url": "https://symfony.com/sponsor",
3101 | "type": "custom"
3102 | },
3103 | {
3104 | "url": "https://github.com/fabpot",
3105 | "type": "github"
3106 | },
3107 | {
3108 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3109 | "type": "tidelift"
3110 | }
3111 | ],
3112 | "time": "2022-05-24T11:49:31+00:00"
3113 | },
3114 | {
3115 | "name": "symfony/polyfill-mbstring",
3116 | "version": "v1.26.0",
3117 | "source": {
3118 | "type": "git",
3119 | "url": "https://github.com/symfony/polyfill-mbstring.git",
3120 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
3121 | },
3122 | "dist": {
3123 | "type": "zip",
3124 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
3125 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
3126 | "shasum": ""
3127 | },
3128 | "require": {
3129 | "php": ">=7.1"
3130 | },
3131 | "provide": {
3132 | "ext-mbstring": "*"
3133 | },
3134 | "suggest": {
3135 | "ext-mbstring": "For best performance"
3136 | },
3137 | "type": "library",
3138 | "extra": {
3139 | "branch-alias": {
3140 | "dev-main": "1.26-dev"
3141 | },
3142 | "thanks": {
3143 | "name": "symfony/polyfill",
3144 | "url": "https://github.com/symfony/polyfill"
3145 | }
3146 | },
3147 | "autoload": {
3148 | "files": [
3149 | "bootstrap.php"
3150 | ],
3151 | "psr-4": {
3152 | "Symfony\\Polyfill\\Mbstring\\": ""
3153 | }
3154 | },
3155 | "notification-url": "https://packagist.org/downloads/",
3156 | "license": [
3157 | "MIT"
3158 | ],
3159 | "authors": [
3160 | {
3161 | "name": "Nicolas Grekas",
3162 | "email": "p@tchwork.com"
3163 | },
3164 | {
3165 | "name": "Symfony Community",
3166 | "homepage": "https://symfony.com/contributors"
3167 | }
3168 | ],
3169 | "description": "Symfony polyfill for the Mbstring extension",
3170 | "homepage": "https://symfony.com",
3171 | "keywords": [
3172 | "compatibility",
3173 | "mbstring",
3174 | "polyfill",
3175 | "portable",
3176 | "shim"
3177 | ],
3178 | "support": {
3179 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
3180 | },
3181 | "funding": [
3182 | {
3183 | "url": "https://symfony.com/sponsor",
3184 | "type": "custom"
3185 | },
3186 | {
3187 | "url": "https://github.com/fabpot",
3188 | "type": "github"
3189 | },
3190 | {
3191 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3192 | "type": "tidelift"
3193 | }
3194 | ],
3195 | "time": "2022-05-24T11:49:31+00:00"
3196 | },
3197 | {
3198 | "name": "symfony/polyfill-php80",
3199 | "version": "v1.26.0",
3200 | "source": {
3201 | "type": "git",
3202 | "url": "https://github.com/symfony/polyfill-php80.git",
3203 | "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
3204 | },
3205 | "dist": {
3206 | "type": "zip",
3207 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
3208 | "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
3209 | "shasum": ""
3210 | },
3211 | "require": {
3212 | "php": ">=7.1"
3213 | },
3214 | "type": "library",
3215 | "extra": {
3216 | "branch-alias": {
3217 | "dev-main": "1.26-dev"
3218 | },
3219 | "thanks": {
3220 | "name": "symfony/polyfill",
3221 | "url": "https://github.com/symfony/polyfill"
3222 | }
3223 | },
3224 | "autoload": {
3225 | "files": [
3226 | "bootstrap.php"
3227 | ],
3228 | "psr-4": {
3229 | "Symfony\\Polyfill\\Php80\\": ""
3230 | },
3231 | "classmap": [
3232 | "Resources/stubs"
3233 | ]
3234 | },
3235 | "notification-url": "https://packagist.org/downloads/",
3236 | "license": [
3237 | "MIT"
3238 | ],
3239 | "authors": [
3240 | {
3241 | "name": "Ion Bazan",
3242 | "email": "ion.bazan@gmail.com"
3243 | },
3244 | {
3245 | "name": "Nicolas Grekas",
3246 | "email": "p@tchwork.com"
3247 | },
3248 | {
3249 | "name": "Symfony Community",
3250 | "homepage": "https://symfony.com/contributors"
3251 | }
3252 | ],
3253 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
3254 | "homepage": "https://symfony.com",
3255 | "keywords": [
3256 | "compatibility",
3257 | "polyfill",
3258 | "portable",
3259 | "shim"
3260 | ],
3261 | "support": {
3262 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
3263 | },
3264 | "funding": [
3265 | {
3266 | "url": "https://symfony.com/sponsor",
3267 | "type": "custom"
3268 | },
3269 | {
3270 | "url": "https://github.com/fabpot",
3271 | "type": "github"
3272 | },
3273 | {
3274 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3275 | "type": "tidelift"
3276 | }
3277 | ],
3278 | "time": "2022-05-10T07:21:04+00:00"
3279 | },
3280 | {
3281 | "name": "symfony/polyfill-php81",
3282 | "version": "v1.26.0",
3283 | "source": {
3284 | "type": "git",
3285 | "url": "https://github.com/symfony/polyfill-php81.git",
3286 | "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
3287 | },
3288 | "dist": {
3289 | "type": "zip",
3290 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
3291 | "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
3292 | "shasum": ""
3293 | },
3294 | "require": {
3295 | "php": ">=7.1"
3296 | },
3297 | "type": "library",
3298 | "extra": {
3299 | "branch-alias": {
3300 | "dev-main": "1.26-dev"
3301 | },
3302 | "thanks": {
3303 | "name": "symfony/polyfill",
3304 | "url": "https://github.com/symfony/polyfill"
3305 | }
3306 | },
3307 | "autoload": {
3308 | "files": [
3309 | "bootstrap.php"
3310 | ],
3311 | "psr-4": {
3312 | "Symfony\\Polyfill\\Php81\\": ""
3313 | },
3314 | "classmap": [
3315 | "Resources/stubs"
3316 | ]
3317 | },
3318 | "notification-url": "https://packagist.org/downloads/",
3319 | "license": [
3320 | "MIT"
3321 | ],
3322 | "authors": [
3323 | {
3324 | "name": "Nicolas Grekas",
3325 | "email": "p@tchwork.com"
3326 | },
3327 | {
3328 | "name": "Symfony Community",
3329 | "homepage": "https://symfony.com/contributors"
3330 | }
3331 | ],
3332 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
3333 | "homepage": "https://symfony.com",
3334 | "keywords": [
3335 | "compatibility",
3336 | "polyfill",
3337 | "portable",
3338 | "shim"
3339 | ],
3340 | "support": {
3341 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0"
3342 | },
3343 | "funding": [
3344 | {
3345 | "url": "https://symfony.com/sponsor",
3346 | "type": "custom"
3347 | },
3348 | {
3349 | "url": "https://github.com/fabpot",
3350 | "type": "github"
3351 | },
3352 | {
3353 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3354 | "type": "tidelift"
3355 | }
3356 | ],
3357 | "time": "2022-05-24T11:49:31+00:00"
3358 | },
3359 | {
3360 | "name": "symfony/process",
3361 | "version": "v6.1.3",
3362 | "source": {
3363 | "type": "git",
3364 | "url": "https://github.com/symfony/process.git",
3365 | "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292"
3366 | },
3367 | "dist": {
3368 | "type": "zip",
3369 | "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292",
3370 | "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292",
3371 | "shasum": ""
3372 | },
3373 | "require": {
3374 | "php": ">=8.1"
3375 | },
3376 | "type": "library",
3377 | "autoload": {
3378 | "psr-4": {
3379 | "Symfony\\Component\\Process\\": ""
3380 | },
3381 | "exclude-from-classmap": [
3382 | "/Tests/"
3383 | ]
3384 | },
3385 | "notification-url": "https://packagist.org/downloads/",
3386 | "license": [
3387 | "MIT"
3388 | ],
3389 | "authors": [
3390 | {
3391 | "name": "Fabien Potencier",
3392 | "email": "fabien@symfony.com"
3393 | },
3394 | {
3395 | "name": "Symfony Community",
3396 | "homepage": "https://symfony.com/contributors"
3397 | }
3398 | ],
3399 | "description": "Executes commands in sub-processes",
3400 | "homepage": "https://symfony.com",
3401 | "support": {
3402 | "source": "https://github.com/symfony/process/tree/v6.1.3"
3403 | },
3404 | "funding": [
3405 | {
3406 | "url": "https://symfony.com/sponsor",
3407 | "type": "custom"
3408 | },
3409 | {
3410 | "url": "https://github.com/fabpot",
3411 | "type": "github"
3412 | },
3413 | {
3414 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3415 | "type": "tidelift"
3416 | }
3417 | ],
3418 | "time": "2022-06-27T17:24:16+00:00"
3419 | },
3420 | {
3421 | "name": "symfony/service-contracts",
3422 | "version": "v3.1.1",
3423 | "source": {
3424 | "type": "git",
3425 | "url": "https://github.com/symfony/service-contracts.git",
3426 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239"
3427 | },
3428 | "dist": {
3429 | "type": "zip",
3430 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239",
3431 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239",
3432 | "shasum": ""
3433 | },
3434 | "require": {
3435 | "php": ">=8.1",
3436 | "psr/container": "^2.0"
3437 | },
3438 | "conflict": {
3439 | "ext-psr": "<1.1|>=2"
3440 | },
3441 | "suggest": {
3442 | "symfony/service-implementation": ""
3443 | },
3444 | "type": "library",
3445 | "extra": {
3446 | "branch-alias": {
3447 | "dev-main": "3.1-dev"
3448 | },
3449 | "thanks": {
3450 | "name": "symfony/contracts",
3451 | "url": "https://github.com/symfony/contracts"
3452 | }
3453 | },
3454 | "autoload": {
3455 | "psr-4": {
3456 | "Symfony\\Contracts\\Service\\": ""
3457 | },
3458 | "exclude-from-classmap": [
3459 | "/Test/"
3460 | ]
3461 | },
3462 | "notification-url": "https://packagist.org/downloads/",
3463 | "license": [
3464 | "MIT"
3465 | ],
3466 | "authors": [
3467 | {
3468 | "name": "Nicolas Grekas",
3469 | "email": "p@tchwork.com"
3470 | },
3471 | {
3472 | "name": "Symfony Community",
3473 | "homepage": "https://symfony.com/contributors"
3474 | }
3475 | ],
3476 | "description": "Generic abstractions related to writing services",
3477 | "homepage": "https://symfony.com",
3478 | "keywords": [
3479 | "abstractions",
3480 | "contracts",
3481 | "decoupling",
3482 | "interfaces",
3483 | "interoperability",
3484 | "standards"
3485 | ],
3486 | "support": {
3487 | "source": "https://github.com/symfony/service-contracts/tree/v3.1.1"
3488 | },
3489 | "funding": [
3490 | {
3491 | "url": "https://symfony.com/sponsor",
3492 | "type": "custom"
3493 | },
3494 | {
3495 | "url": "https://github.com/fabpot",
3496 | "type": "github"
3497 | },
3498 | {
3499 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3500 | "type": "tidelift"
3501 | }
3502 | ],
3503 | "time": "2022-05-30T19:18:58+00:00"
3504 | },
3505 | {
3506 | "name": "symfony/stopwatch",
3507 | "version": "v6.1.5",
3508 | "source": {
3509 | "type": "git",
3510 | "url": "https://github.com/symfony/stopwatch.git",
3511 | "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7"
3512 | },
3513 | "dist": {
3514 | "type": "zip",
3515 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
3516 | "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
3517 | "shasum": ""
3518 | },
3519 | "require": {
3520 | "php": ">=8.1",
3521 | "symfony/service-contracts": "^1|^2|^3"
3522 | },
3523 | "type": "library",
3524 | "autoload": {
3525 | "psr-4": {
3526 | "Symfony\\Component\\Stopwatch\\": ""
3527 | },
3528 | "exclude-from-classmap": [
3529 | "/Tests/"
3530 | ]
3531 | },
3532 | "notification-url": "https://packagist.org/downloads/",
3533 | "license": [
3534 | "MIT"
3535 | ],
3536 | "authors": [
3537 | {
3538 | "name": "Fabien Potencier",
3539 | "email": "fabien@symfony.com"
3540 | },
3541 | {
3542 | "name": "Symfony Community",
3543 | "homepage": "https://symfony.com/contributors"
3544 | }
3545 | ],
3546 | "description": "Provides a way to profile code",
3547 | "homepage": "https://symfony.com",
3548 | "support": {
3549 | "source": "https://github.com/symfony/stopwatch/tree/v6.1.5"
3550 | },
3551 | "funding": [
3552 | {
3553 | "url": "https://symfony.com/sponsor",
3554 | "type": "custom"
3555 | },
3556 | {
3557 | "url": "https://github.com/fabpot",
3558 | "type": "github"
3559 | },
3560 | {
3561 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3562 | "type": "tidelift"
3563 | }
3564 | ],
3565 | "time": "2022-09-28T16:00:52+00:00"
3566 | },
3567 | {
3568 | "name": "symfony/string",
3569 | "version": "v6.1.7",
3570 | "source": {
3571 | "type": "git",
3572 | "url": "https://github.com/symfony/string.git",
3573 | "reference": "823f143370880efcbdfa2dbca946b3358c4707e5"
3574 | },
3575 | "dist": {
3576 | "type": "zip",
3577 | "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5",
3578 | "reference": "823f143370880efcbdfa2dbca946b3358c4707e5",
3579 | "shasum": ""
3580 | },
3581 | "require": {
3582 | "php": ">=8.1",
3583 | "symfony/polyfill-ctype": "~1.8",
3584 | "symfony/polyfill-intl-grapheme": "~1.0",
3585 | "symfony/polyfill-intl-normalizer": "~1.0",
3586 | "symfony/polyfill-mbstring": "~1.0"
3587 | },
3588 | "conflict": {
3589 | "symfony/translation-contracts": "<2.0"
3590 | },
3591 | "require-dev": {
3592 | "symfony/error-handler": "^5.4|^6.0",
3593 | "symfony/http-client": "^5.4|^6.0",
3594 | "symfony/translation-contracts": "^2.0|^3.0",
3595 | "symfony/var-exporter": "^5.4|^6.0"
3596 | },
3597 | "type": "library",
3598 | "autoload": {
3599 | "files": [
3600 | "Resources/functions.php"
3601 | ],
3602 | "psr-4": {
3603 | "Symfony\\Component\\String\\": ""
3604 | },
3605 | "exclude-from-classmap": [
3606 | "/Tests/"
3607 | ]
3608 | },
3609 | "notification-url": "https://packagist.org/downloads/",
3610 | "license": [
3611 | "MIT"
3612 | ],
3613 | "authors": [
3614 | {
3615 | "name": "Nicolas Grekas",
3616 | "email": "p@tchwork.com"
3617 | },
3618 | {
3619 | "name": "Symfony Community",
3620 | "homepage": "https://symfony.com/contributors"
3621 | }
3622 | ],
3623 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
3624 | "homepage": "https://symfony.com",
3625 | "keywords": [
3626 | "grapheme",
3627 | "i18n",
3628 | "string",
3629 | "unicode",
3630 | "utf-8",
3631 | "utf8"
3632 | ],
3633 | "support": {
3634 | "source": "https://github.com/symfony/string/tree/v6.1.7"
3635 | },
3636 | "funding": [
3637 | {
3638 | "url": "https://symfony.com/sponsor",
3639 | "type": "custom"
3640 | },
3641 | {
3642 | "url": "https://github.com/fabpot",
3643 | "type": "github"
3644 | },
3645 | {
3646 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
3647 | "type": "tidelift"
3648 | }
3649 | ],
3650 | "time": "2022-10-10T09:34:31+00:00"
3651 | },
3652 | {
3653 | "name": "theseer/tokenizer",
3654 | "version": "1.2.1",
3655 | "source": {
3656 | "type": "git",
3657 | "url": "https://github.com/theseer/tokenizer.git",
3658 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
3659 | },
3660 | "dist": {
3661 | "type": "zip",
3662 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
3663 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
3664 | "shasum": ""
3665 | },
3666 | "require": {
3667 | "ext-dom": "*",
3668 | "ext-tokenizer": "*",
3669 | "ext-xmlwriter": "*",
3670 | "php": "^7.2 || ^8.0"
3671 | },
3672 | "type": "library",
3673 | "autoload": {
3674 | "classmap": [
3675 | "src/"
3676 | ]
3677 | },
3678 | "notification-url": "https://packagist.org/downloads/",
3679 | "license": [
3680 | "BSD-3-Clause"
3681 | ],
3682 | "authors": [
3683 | {
3684 | "name": "Arne Blankerts",
3685 | "email": "arne@blankerts.de",
3686 | "role": "Developer"
3687 | }
3688 | ],
3689 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
3690 | "support": {
3691 | "issues": "https://github.com/theseer/tokenizer/issues",
3692 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
3693 | },
3694 | "funding": [
3695 | {
3696 | "url": "https://github.com/theseer",
3697 | "type": "github"
3698 | }
3699 | ],
3700 | "time": "2021-07-28T10:34:58+00:00"
3701 | }
3702 | ],
3703 | "aliases": [],
3704 | "minimum-stability": "stable",
3705 | "stability-flags": [],
3706 | "prefer-stable": false,
3707 | "prefer-lowest": false,
3708 | "platform": {
3709 | "php": ">=8.0",
3710 | "ext-soap": "*"
3711 | },
3712 | "platform-dev": [],
3713 | "plugin-api-version": "2.3.0"
3714 | }
3715 |
--------------------------------------------------------------------------------